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