据我目前的功力,也就是只能分2个不同的地方,且这2个地方互不干扰,相互独立。
如果这2者是相互重复的,那么这个就太容易了啊。直接设多个appender,然后file后面的地址写不一样就行了。
但是要考虑到,它们受level的影响,指定某个级别的level以上的level全是输出的。
下面将举个例子,利用的就是logger 和 root的区别!
完整的log4j.xml配置如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration> <appender name="DebugAppender" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="D:/UA/UADebugLogs/debug.log"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ISO8601}|%-5p|%c|%t|%m%n"/> </layout> </appender> <appender name="InfoAppender" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="D:/UA/UACognosLogs/result.log"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ISO8601}|%-5p|%c|%t|%m%n"/> </layout> </appender> <!-- These are the possible log levels - debug | info | warn | error | fatal --> <!-- client --> <logger name="result" additivity="false"> <level value ="info"/> <appender-ref ref="InfoAppender"/> </logger> <root> <priority value="debug"/> <appender-ref ref="DebugAppender"/> </root> </log4j:configuration>
解释如下:1、root设的是全局的level,然后logger那段是要继承root的设置的,然而在我们这我们不想继续它,将additivity设为false即可。
2、对于file=地址,这里的地址可以用相对地址,不过在打包成jar后一般都不认识了。我暂时还没找到完美的方法,只能傻傻的用绝对路径,即D:/UA/UADebugLogs/debug.log。或者D:\\UA\\UADebugLogs\\debug.log。
3、对于DailyRollingFileAppender而言,当天的日志文件是不会加上日期的,只有昨天以前的文件前面才会加上日期。这一点请注意。
4、对于Logger的name的更深的理解:
private Logger logger=Logger.getLogger("result")
和
private Logger logger=Logger.getLogger(UACognos.class.getName())
一般我们都习惯用第2种方法,然后在log4j的输出文件中写的就是这个类的名字。而且这样写就意味必须继承root的设置。如果你不想继承root的话,那么就得像第一种写法一样,用指定的特殊的logger。
关于2、3两点,其实都可以写一博文来解释。会在csdn上写的。
refurl:1、http://ankyhe.iteye.com/blog/1143927
2、http://willow-na.iteye.com/blog/347340
3、http://zhangxiang390.iteye.com/blog/258455