看到有需要輸出不同級別的日志到不同的文件,比如說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以后已經不再推薦使用了。