Skip to content

Commit ab72430

Browse files
author
王永华
committed
first commit
1 parent 231de6b commit ab72430

11 files changed

Lines changed: 78 additions & 182 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# javaAgent

agentlib/pom.xml

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -28,40 +28,6 @@
2828
</repository>
2929
</repositories>
3030

31-
<dependencies>
32-
<dependency>
33-
<groupId>junit</groupId>
34-
<artifactId>junit</artifactId>
35-
<version>4.11</version>
36-
<scope>test</scope>
37-
</dependency>
38-
<dependency>
39-
<groupId>org.javassist</groupId>
40-
<artifactId>javassist</artifactId>
41-
<version>3.18.2-GA</version>
42-
</dependency>
43-
<dependency>
44-
<groupId>org.slf4j</groupId>
45-
<artifactId>slf4j-api</artifactId>
46-
<version>1.7.7</version>
47-
</dependency>
48-
<dependency>
49-
<groupId>ch.qos.logback</groupId>
50-
<artifactId>logback-core</artifactId>
51-
<version>1.1.7</version>
52-
</dependency>
53-
<dependency>
54-
<groupId>ch.qos.logback</groupId>
55-
<artifactId>logback-access</artifactId>
56-
<version>1.1.7</version>
57-
</dependency>
58-
<dependency>
59-
<groupId>ch.qos.logback</groupId>
60-
<artifactId>logback-classic</artifactId>
61-
<version>1.1.7</version>
62-
</dependency>
63-
</dependencies>
64-
6531
<build>
6632
<finalName>agent</finalName>
6733
<plugins>

agentlib/src/main/java/org/greenleaf/ApmAgent.java

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import javassist.CtConstructor;
77
import javassist.CtMethod;
88
import javassist.LoaderClassPath;
9+
import org.slf4j.Logger;
10+
import org.slf4j.LoggerFactory;
911

1012
import java.io.ByteArrayInputStream;
1113
import java.io.File;
@@ -18,6 +20,8 @@
1820

1921
public class ApmAgent implements ClassFileTransformer {
2022

23+
private static Logger logger = LoggerFactory.getLogger(ApmAgent.class);
24+
2125
@Override
2226
public byte[] transform(ClassLoader loader, String className,
2327
Class<?> classBeingRedefined, ProtectionDomain protectionDomain,
@@ -31,42 +35,40 @@ public byte[] transform(ClassLoader loader, String className,
3135
CtClass cls = pool.makeClass(new ByteArrayInputStream(classfileBuffer));
3236
CtConstructor[] ccs = cls.getDeclaredConstructors();
3337
for (CtConstructor cc : ccs) {
34-
//构造函数方法体开始时添加的代码
3538
String codeStrBefore = "System.out.println(\"This code is inserted before constructor "+className+"\");";
36-
//构造函数方法体结束前添加的代码
3739
String codeStrAfter = "System.out.println(\"This code is inserted after constructor "+className+"\");";
3840
cc.insertBeforeBody((codeStrBefore));
3941
cc.insertAfter(codeStrAfter, true);
4042
}
4143

44+
long startTime = System.currentTimeMillis();
45+
System.out.println("time cost " + (System.currentTimeMillis() - startTime));
46+
4247
CtMethod[] methods = cls.getDeclaredMethods();
4348
for (CtMethod method : methods) {
44-
String codeStrBefore = "System.out.println(\"This code is inserted before method "+method.getName()+"\");";
45-
String codeStrAfter = "System.out.println(\"This code is inserted after method "+method.getName()+"\");";
49+
String codeStrBefore = "long startTime = System.currentTimeMillis();";
50+
String codeStrAfter = "System.out.println(\"time cost \" + (System.currentTimeMillis() - startTime));";
51+
System.out.println(codeStrBefore);
52+
System.out.println(codeStrAfter);
4653
method.insertBefore(codeStrBefore);
4754
method.insertAfter(codeStrAfter, true);
4855
}
4956

5057
File file = new File(cls.getSimpleName() + ".class");
51-
System.out.println(file.getAbsolutePath());
5258
try(FileOutputStream fileOutputStream = new FileOutputStream(file)) {
5359
fileOutputStream.write(cls.toBytecode());
5460
} catch (Exception e) {
5561
e.printStackTrace();
5662
}
5763
return cls.toBytecode();
58-
} catch (IOException e) {
59-
e.printStackTrace();
60-
} catch (RuntimeException e) {
61-
e.printStackTrace();
62-
} catch (CannotCompileException e) {
63-
e.printStackTrace();
64+
} catch (Exception e) {
65+
logger.error("", e);
6466
}
6567
return null;
6668
}
6769

6870
public static void premain(String agentArgs, Instrumentation inst) {
69-
System.out.println("====premain exe args=" + agentArgs);
71+
logger.info("premain exe args : {}" + agentArgs);
7072
inst.addTransformer(new ApmAgent());
7173
}
7274
}
Lines changed: 0 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,4 @@
1-
<!-- 级别从高到低 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL -->
2-
<!-- 日志输出规则 根据当前ROOT 级别,日志输出时,级别高于root默认的级别时 会输出 -->
3-
<!-- 以下 每个配置的 filter 是过滤掉输出文件里面,会出现高级别文件,依然出现低级别的日志信息,通过filter 过滤只记录本级别的日志 -->
4-
<!-- scan 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 -->
5-
<!-- scanPeriod 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
6-
<!-- debug 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
71
<configuration scan="true" scanPeriod="60 seconds" debug="false">
8-
<!-- 动态日志级别 -->
9-
<jmxConfigurator />
10-
<!-- 定义日志文件 输出位置 -->
11-
<!-- <property name="log_dir" value="C:/test" />-->
12-
<property name="log_dir" value="./logs/" />
13-
<!-- 日志最大的历史 30天 -->
14-
<property name="maxHistory" value="30" />
15-
162
<!-- ConsoleAppender 控制台输出日志 -->
173
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
184
<encoder>
@@ -23,117 +9,10 @@
239
</encoder>
2410
</appender>
2511

26-
<!-- ERROR级别日志 -->
27-
<!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 RollingFileAppender -->
28-
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
29-
<!-- 过滤器,只记录WARN级别的日志 -->
30-
<!-- 果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。 -->
31-
<filter class="ch.qos.logback.classic.filter.LevelFilter">
32-
<!-- 设置过滤级别 -->
33-
<level>ERROR</level>
34-
<!-- 用于配置符合过滤条件的操作 -->
35-
<onMatch>ACCEPT</onMatch>
36-
<!-- 用于配置不符合过滤条件的操作 -->
37-
<onMismatch>DENY</onMismatch>
38-
</filter>
39-
<!-- 最常用的滚动策略,它根据时间来制定滚动策略.既负责滚动也负责出发滚动 -->
40-
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
41-
<!--日志输出位置 可相对、和绝对路径 -->
42-
<fileNamePattern>
43-
${log_dir}/error/%d{yyyy-MM-dd}/error-log.log
44-
</fileNamePattern>
45-
<!-- 可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件假设设置每个月滚动,且<maxHistory>是6, 则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除 -->
46-
<maxHistory>${maxHistory}</maxHistory>
47-
</rollingPolicy>
48-
<encoder>
49-
<pattern>
50-
<!-- 设置日志输出格式 -->
51-
%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %msg%n
52-
</pattern>
53-
</encoder>
54-
</appender>
55-
56-
<!-- WARN级别日志 appender -->
57-
<appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
58-
<!-- 过滤器,只记录WARN级别的日志 -->
59-
<!-- 果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。 -->
60-
<filter class="ch.qos.logback.classic.filter.LevelFilter">
61-
<!-- 设置过滤级别 -->
62-
<level>WARN</level>
63-
<!-- 用于配置符合过滤条件的操作 -->
64-
<onMatch>ACCEPT</onMatch>
65-
<!-- 用于配置不符合过滤条件的操作 -->
66-
<onMismatch>DENY</onMismatch>
67-
</filter>
68-
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
69-
<!--日志输出位置 可相对、和绝对路径 -->
70-
<fileNamePattern>${log_dir}/warn/%d{yyyy-MM-dd}/warn-log.log</fileNamePattern>
71-
<maxHistory>${maxHistory}</maxHistory>
72-
</rollingPolicy>
73-
<encoder>
74-
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %msg%n</pattern>
75-
</encoder>
76-
</appender>
77-
78-
<!-- INFO级别日志 appender -->
79-
<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
80-
<filter class="ch.qos.logback.classic.filter.LevelFilter">
81-
<level>INFO</level>
82-
<onMatch>ACCEPT</onMatch>
83-
<onMismatch>DENY</onMismatch>
84-
</filter>
85-
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
86-
<fileNamePattern>${log_dir}/info/%d{yyyy-MM-dd}/info-log.log</fileNamePattern>
87-
<maxHistory>${maxHistory}</maxHistory>
88-
</rollingPolicy>
89-
<encoder>
90-
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %msg%n</pattern>
91-
</encoder>
92-
</appender>
93-
94-
<!-- DEBUG级别日志 appender -->
95-
<appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
96-
<filter class="ch.qos.logback.classic.filter.LevelFilter">
97-
<level>DEBUG</level>
98-
<onMatch>ACCEPT</onMatch>
99-
<onMismatch>DENY</onMismatch>
100-
</filter>
101-
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
102-
<fileNamePattern>${log_dir}/debug/%d{yyyy-MM-dd}/debug-log.log</fileNamePattern>
103-
<maxHistory>${maxHistory}</maxHistory>
104-
</rollingPolicy>
105-
<encoder>
106-
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %msg%n</pattern>
107-
</encoder>
108-
</appender>
109-
110-
<!-- TRACE级别日志 appender -->
111-
<appender name="TRACE" class="ch.qos.logback.core.rolling.RollingFileAppender">
112-
<filter class="ch.qos.logback.classic.filter.LevelFilter">
113-
<level>TRACE</level>
114-
<onMatch>ACCEPT</onMatch>
115-
<onMismatch>DENY</onMismatch>
116-
</filter>
117-
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
118-
<fileNamePattern>${log_dir}/trace/%d{yyyy-MM-dd}/trace-log.log</fileNamePattern>
119-
<maxHistory>${maxHistory}</maxHistory>
120-
</rollingPolicy>
121-
<encoder>
122-
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %msg%n</pattern>
123-
</encoder>
124-
</appender>
125-
126-
<!-- root级别 DEBUG -->
12712
<root>
12813
<!-- 打印debug级别日志及以上级别日志 -->
12914
<level value="debug" />
13015
<!-- 控制台输出 -->
13116
<appender-ref ref="console" />
132-
<!-- 文件输出 -->
133-
<appender-ref ref="ERROR" />
134-
<appender-ref ref="INFO" />
135-
<appender-ref ref="WARN" />
136-
<appender-ref ref="DEBUG" />
137-
<appender-ref ref="TRACE" />
13817
</root>
13918
</configuration>

pom.xml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,27 @@
3434
<artifactId>javassist</artifactId>
3535
<version>3.18.2-GA</version>
3636
</dependency>
37+
<dependency>
38+
<groupId>org.slf4j</groupId>
39+
<artifactId>slf4j-api</artifactId>
40+
<version>1.7.7</version>
41+
</dependency>
42+
<dependency>
43+
<groupId>ch.qos.logback</groupId>
44+
<artifactId>logback-core</artifactId>
45+
<version>1.1.7</version>
46+
</dependency>
47+
<dependency>
48+
<groupId>ch.qos.logback</groupId>
49+
<artifactId>logback-access</artifactId>
50+
<version>1.1.7</version>
51+
</dependency>
52+
<dependency>
53+
<groupId>ch.qos.logback</groupId>
54+
<artifactId>logback-classic</artifactId>
55+
<version>1.1.7</version>
56+
</dependency>
57+
3758
</dependencies>
3859

3960
<build>

sample/App.class

-1.27 KB
Binary file not shown.

sample/TransClass.class

-1.16 KB
Binary file not shown.
Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
package org.greenleaf.sample;
22

3-
import org.greenleaf.sample.bean.TransClass;
3+
import org.greenleaf.sample.bean.BusManager;
4+
import org.slf4j.Logger;
5+
import org.slf4j.LoggerFactory;
46

57
/**
68
* Hello world!
79
*/
810
public class App {
911

12+
private static Logger logger = LoggerFactory.getLogger(App.class);
13+
1014
public static void main(String[] args) {
11-
System.out.println("Hello World1!");
12-
int um = new TransClass().getNumber();
13-
System.out.println("return value is " + um);
15+
logger.info("Hello World");
16+
logger.info("return value is {} ", new BusManager().getNumber());
1417
}
1518
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package org.greenleaf.sample.bean;
2+
3+
import org.slf4j.Logger;
4+
import org.slf4j.LoggerFactory;
5+
6+
public class BusManager {
7+
8+
private static Logger logger = LoggerFactory.getLogger(BusManager.class);
9+
10+
public int getNumber() {
11+
return 2;
12+
}
13+
14+
public int comparre() {
15+
return super.hashCode();
16+
}
17+
}

sample/src/main/java/org/greenleaf/sample/bean/TransClass.java

Lines changed: 0 additions & 11 deletions
This file was deleted.

0 commit comments

Comments
 (0)