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以后已經不再推薦使用了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM