精通Log4j
?log4j雖然總的來說是比較容易使用的,但是要是想比較精通的操縱它還是有很多地方值得探討的。 <appender name="file" class="org.apache.log4j.RollingFileAppender"> <appender name="error" class="org.apache.log4j.RollingFileAppender"> <logger name="biz.startup"> <logger name="com.aspire" additivity="false"> ***********? log4j 配置文件結束 ************ **********? 派生的TimeSizeRollingFileAppender類***** import org.apache.log4j.FileAppender; public class TimeSizeRollingFileAppender ? private final static String FS = System.getProperty("file.separator"); ********** TimeSizeRollingFileAppender 類結束 ****** ************ 調用示例 TestLog4j類 ************** import org.apache.log4j.Logger; public class TestLog4j { ? public static void config(){ ***************? TestLog4j end ***********
??? 這幾天有空,把項目中大家用到的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="
?<param name="File" value="log.log"/>
?<layout class="org.apache.log4j.PatternLayout">
?<param name="ConversionPattern" value=" %d{ISO8601} [%c]- %m%n"/>
?</layout>
</appender>
??<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 logger = Logger.getLogger("biz.startup") 可以這樣來調用本logger-->
??<level value="debug" />
??<appender-ref ref="startup" />
</logger>
<!--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>
package com.aspire;
import org.apache.log4j.spi.ErrorCode;
import java.io.File;
import java.io.IOException;
??? extends FileAppender
??? implements ErrorCode {
? 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();
??? }
? }
}
package com.aspire;
import org.apache.log4j.LogManager;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.xml.DOMConfigurator;
import org.apache.commons.logging.Log;
? private Logger logger = Logger.getLogger("biz.startup");
? private Log log = LogFactory.getLog(TestLog4j.class);
??? 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();
? }
}