使用java instrument做一个代码监控的工具,监控日志想用log4j记录,遇到了点问题。
启动应用的命令行加入-javaagent参数,可以在加载类时对其字节码做修改,常用工具有asm、javasssit。
我希望能额外加载用于监控的log4j的配置,但发现如果在instrument类中手工加载了监控的log4j配置,应用程序使用Logger.getLogger(“xx”)时,不会去classpath下查找应用log4j.properties并加载,而是报了not found root logger的警告。 1. Jar包的METEINFO.MF配置需要配置:Premain-Class: com.PerfMonAgentBoot-Class-Path: ./ lib/log4j-1.2.14.jar lib/javassist-3.18.GA.jar使用maven打包做如下配置即可:<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifestEntries> <Premain-Class>com.PerfMonAgent</Premain-Class> <Boot-Class-Path>./ lib/log4j-1.2.14.jar lib/javassist-3.18.1-GA.jar</Boot-Class-Path> </manifestEntries> </archive> </configuration> </plugin> </plugins> </build>目录结构lib|-log4j-1.2.14.jar|-javassist-3.18.GA.jarlog4j.propertieslog4j_monitor.propertieslogsmonitor.propertiesmonitor.jar2. Premain先加载应用配置,在加载监控配置Logger.getRootLogger(); //使用PropertyConfigurator也可以PropertyConfigurator.configure(configFile); 3. 问题由于在Bootstrap阶段做log4j的类加载、配置加载,log4j的配置对所有应用都是共享的,如果server下部署了多个应用,这种方法不能解决,还需进一步研究。