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

posted @ 2012-06-05 14:44  eyotata  阅读(4518)  评论(0编辑  收藏  举报