log4j虽然总的来说是比较容易使用的,但是要是想比较精通的操纵它还是有很多地方值得探讨的。
这几天有空,把项目中大家用到的log4j实现的功能分了一下类,大致分为下面三类:
<1>所有的日志信息都输出到log.log.
<2>对于一些特殊的日志(如启动时候的日志),输出到log/startup/startup.log.
<3>对于某些特殊包下面的日志,如com.aspire包下面的error信息都输出到error.log
有了这几个功能,相信对于大部分的系统都是够用的了,下面这个例子就是实现了这几个功能:
(至于其他的一些配置,如格式这些的就不说明,有很多这种资料)
*********** log4j 配置文件 ************
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" threshold="debug">
<appender name="file" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="log.log"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value=" %d{ISO8601} [%c]- %m%n"/>
</layout>
</appender>
<appender name="error" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="error.log"/>
<param name="MaxBackupIndex" value="300"/>
<param name="Encoding" value="GB2312"/>
<param name="MaxFileSize" value="20MB"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ISO8601} %p [%c] - [%m]%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<!-- 过滤,只记录error信息-->
<param name="LevelMin" value="error"/>
<param name="LevelMax" value="error"/>
<param name="acceptOnMatch" value="true"/>
</filter>
</appender>
<appender name="startup" class="com.aspire.TimeSizeRollingFileAppender">
<!--该类使自己从FileAppender派生,可以自己控制输出文件的路径 -->
<param name="File" value="log/startup/startup.log" />
<param name="Encoding" value="GBK" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%m %d{ISO8601}- %m%n %p %l%n" />
</layout>
</appender>
<logger name="biz.startup">
<!--Logger logger = Logger.getLogger("biz.startup") 可以这样来调用本logger-->
<level value="debug" />
<appender-ref ref="startup" />
</logger>
<logger name="com.aspire" additivity="false">
<!--Log log = LogFactory.getLog(TestLog4j.class) 此时如果TestLog4j
位于com.aspire包下面,那么使用本logger
-->
<level value="debug"/>
<appender-ref ref="error"/>
</logger>
<root>
<level value="info"/>
<!-- 默认输出到log.log-->
<appender-ref ref="file"/>
</root>
</log4j:configuration>
*********** log4j 配置文件结束 ************
********** 派生的TimeSizeRollingFileAppender类*****
package com.aspire;
import org.apache.log4j.FileAppender;
import org.apache.log4j.spi.ErrorCode;
import java.io.File;
import java.io.IOException;
public class TimeSizeRollingFileAppender
extends FileAppender
implements ErrorCode {
private final static String FS = System.getProperty("file.separator");
public TimeSizeRollingFileAppender() {
}
public void setFile(String file) {
String val = file.trim();
File domain = new File(".");
try {
fileName = domain.getCanonicalPath() + FS + val;
}
catch (IOException ex) {
ex.printStackTrace();
}
}
}
********** TimeSizeRollingFileAppender 类结束 ******
************ 调用示例 TestLog4j类 **************
package com.aspire;
import org.apache.log4j.Logger;
import org.apache.log4j.LogManager;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.xml.DOMConfigurator;
import org.apache.commons.logging.Log;
public class TestLog4j {
private Logger logger = Logger.getLogger("biz.startup");
private Log log = LogFactory.getLog(TestLog4j.class);
public static void config(){
DOMConfigurator.configure("conf//log4jConf.xml");
}
public void Test(){
/**
* error > warn > info > debug
*/
logger.error("*****error*****");
logger.debug("****debug*****");
logger.warn("*****warn******");
logger.info("*****info******");
log.error("中华之崛起!");
}
public static void main(String [] argv){
TestLog4j t = new TestLog4j();
TestLog4j.config();
t.Test();
}
}
*************** TestLog4j end ***********