log4j 分级别输出到不同的文件
看到有需要输出不同级别的日志到不同的文件,比如说info级别输出到info.log,debug级别日志输出到debug日志。
1.我们可以通过log4j.properties设置多个appender来达到目的。
本次使用的jar包为commons-logging-1.0.4.jar,log4j-1.2.15.jar
# For JBoss: Avoid to setup Log4J outside $JBOSS_HOME/server/default/deploy/log4j.xml! # For all other servers: Comment out the Log4J listener in web.xml to activate Log4J. #根日志 收录所有的日志信息 log4j.rootLogger=INFO,stdout log4j.logger.stdout=DEBUG,stdout log4j.appender.stdout=org.apache.log4j.DailyRollingFileAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%t] %C{1}.%M(%L) | %m%n log4j.appender.stdout.file=D:/workMobile/shelltest/log/stdout.txt #分支模块日志 只收录stdout_test1下的日志信息 log4j.logger.fordebug=DEBUG,fordebug log4j.appender.fordebug=org.apache.log4j.DailyRollingFileAppender log4j.appender.fordebug.layout=org.apache.log4j.PatternLayout log4j.appender.fordebug.layout.ConversionPattern=%d %p %c - <%m>%n #%d %p [%t] %C{1}.%M(%L) | %m%n log4j.appender.fordebug.file=D:/workMobile/shelltest/log/debug.log #分支模块日志 只收录info下的日志信息 log4j.logger.forinfo=DEBUG,forinfo log4j.appender.forinfo=org.apache.log4j.DailyRollingFileAppender log4j.appender.forinfo.layout=org.apache.log4j.PatternLayout log4j.appender.forinfo.layout.ConversionPattern=%d %p [%t] %C{1}.%M(%L) | %m%n log4j.appender.forinfo.file=D:/workMobile/shelltest/log/info.log
java代码中使用:
// private static final Log stdout = LogFactory.getLog("stdout"); private static final Log fordebug = LogFactory.getLog("fordebug"); private static final Log forinfo = LogFactory.getLog("forinfo"); /** * @param args */ public static void main(String[] args) { fordebug.info("stdout_test1 info"); fordebug.debug("stdout_test1 debug"); forinfo.info("stdout_test2"); forinfo.debug("stdout_test2"); }
这样所有fordebug打印出的日志全部收录到D:/workMobile/shelltest/log/debug.log文件中。
而所有forinfo打印出的日志全部收录到D:/workMobile/shelltest/log/forinfo.log文件中。
这样就达到了日志分离的目的。
2.我们还可以通过使用log4j.xml配置文件来进行配置。
本次使用的jar包为log4j-1.2.15.jar
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"/> </appender> <!-- 使用时间控制日志文件的更迭 <appender name="DEBUG" class="org.apache.log4j.DailyRollingFileAppender"> 生成的日志文件名 <param name="File" value="debug.log"/> <param name="Append" value="true"/> 定义日志文件名时间格式 <param name="datePattern" value="'.'yyyy-MM-dd" /> <layout class="org.apache.log4j.PatternLayout"> 定义日志输出的格式 <param name="ConversionPattern" value="%5p [%t] (%F:%L) - %m%n"/> </layout> *通过过滤器,我们可以定义这个文件将接收何种等级的日志信息,这里是debug级别 <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMax" value="DEBUG" /> <param name="LevelMin" value="DEBUG" /> </filter> </appender> <appender name="INFO" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="info.log"/> <param name="Append" value="true"/> <param name="datePattern" value="'.'yyyy-MM-dd" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%p %t %c - %m%n"/> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMax" value="INFO" /> <param name="LevelMin" value="INFO" /> </filter> </appender> --> <!-- 通过日志大小来确定是否生成新的日志文件 --> <appender name="DEBUG" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="debug.log"/> <param name="Append" value="true"/> <param name="MaxFileSize" value="1KB"/> <param name="MaxBackupIndex" value="2"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%5p [%t] (%F:%L) - %m%n"/> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMax" value="DEBUG" /> <param name="LevelMin" value="DEBUG" /> </filter> </appender> <appender name="INFO" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="info.log"/> <param name="Append" value="true"/> <param name="MaxFileSize" value="1KB"/> <param name="MaxBackupIndex" value="2"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%p %t %c - %m%n"/> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter">
<!-- 如果想error级日志也输入到此,修改 <param name="LevelMax" value="ERROR"--> <param name="LevelMax" value="INFO" /> <param name="LevelMin" value="INFO" /> </filter> </appender> <root> <appender-ref ref="STDOUT"/> <appender-ref ref="DEBUG"/> <appender-ref ref="INFO"/> </root> </log4j:configuration>
这样,我们仍然可以和以前一样使用:
Logger log=Logger.getLogger(this.getClass()); log.info("this is info msg!"); log.debug("this is debug msg!");
使用log4j.xml来配置时,如果报不能找到log4j.dtd的异常,从log4j的jar包中找org/apache/log4j/xml/log4j.dtd,拷贝到src下即可。
想了解下log4j中log4j.properties和log4j.xml的加载顺序,经过查看LogManager.java
// if the user has not specified the log4j.configuration
// property, we search first for the file "log4j.xml" and then
// "log4j.properties"
明确了,当用户没有设置log4j.configuration属性,则首先查找log4j.xml,然后查找log4j.properties。
log4j.properties以后已经不再推荐使用了。