黑盒表现:
运行 代码后,发现日志在jvm指定的参数-Dlog4j.configuration=file:****.properties配置的 日志并不打印日志到配置的文件中。
发现日志会打印到另一个****.properties的配置文件中配置的日志文件的位置,问题相当诡异。
定位:
首先想到的是不是自己的.properties文件配置有问题,在配置文件中换了一个日志文件名,启动程序,发现文件可以创建。配置文件没有问题。
其次想到的是不是日志框架加载的类不对,挂断点,看打印的日志的对象类到底是不是log4j的类,发现没问题。
再次想到log4j 框架自身有没有日志呢?果然有,在jvm的参数中加入-Dlog4j.debug启动项目,发现想要打印日志的appender 被加载了两遍,第二部配置文件的覆盖了我的所以打印到其他的properties配置的日志文件中了。
到这里:“一脸懵逼。。。。。我明明没有加载他的日志properties配置文件的!”
再想怎么搞?
根据 加载的多余的日志appender在程序所在的目录搜一把:find . -type f | xargs grep "log4j.properties"发现只有我自己的日志properties配置文件。
到了这里,我已经真的是蒙圈了。。。。。
索性,把他加载的多余的配置文件名字给改一下,看看程序还能不能加载,改了后,发现果然启动时报错。 这个时候,突然想到是不是程序里面会加载一个固定的日志配置文件。
在整个项目里面搜了一把“log4j.properties”:结果真的是在代码里面把日志文件路径和文件名都给写死了。。。。。。。
用的方法是:org.apache.log4j.PropertyConfigurator类中的configure方法,参数是log4j.properties的路径。
PropertyConfigurator.configure(log4jPath);
至此诡异的问题终于找到了元凶。