最近由於業務上出現一些莫名其妙的誤刪除數據,今天研究了下log4j分包輸出,想用log4j來記錄具體哪些數據被誤刪除了。
具體做法是:新建一個包,然後再包下建一個新class,然後在class裏面記錄被刪除的數據,在log4j.xml裏配置指向此新包的輸出文件。
在test工程下實驗了一下:
log4j.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
<appender name="Console" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p [%t] %c{1} : %L - %m%n"/>
</layout>
</appender>
<appender name="File" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="D:/log4j/test.log"/>
<param name="MaxFileSize" value="1MB"/>
<param name="MaxBackupIndex" value="10"/>
<param name="Append" value="true" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p [%t] %c{1} - %m%n"/>
</layout>
</appender>
<appender name="File1" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="D:/log4j/test1.log"/>
<param name="MaxFileSize" value="1MB"/>
<param name="MaxBackupIndex" value="10"/>
<param name="Append" value="true" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p [%t] %c{1} - %m%n"/>
</layout>
</appender>
<logger name="org">
<level value="WARN"/>
</logger>
<logger name="org.apache">
<level value="WARN"/>
</logger>
<logger name="com.zznode.log">
<level value="DEBUG"/>
</logger>
<logger name="com.zznode.test">
<level value="DEBUG"/>
<appender-ref ref="File1" />
</logger>
<logger name="rule">
<level value="INFO"/>
</logger>
<logger name="org.springframework.jdbc.core">
<level value="info"/>
</logger>
<root>
<level value ="DEBUG" />
<appender-ref ref="Console" />
<appender-ref ref="File" />
</root>
</log4j:configuration>
Main方法:
package com.zznode.log;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.xml.DOMConfigurator;
import com.zznode.test.Test;
/**
* @desc:
* @since Nov 8, 2012
* @author chaisson
*
* <p>
*/
public class Log4jApp {
public void printLog() {
Logger log = Logger.getLogger(Log4jApp.class.getClass());
log.info("測試info");
log.debug("測試debug");
log.error("測試error");
}
public static void main(String[] args) {
DOMConfigurator.configure("D:/workspace/Test/log4j.xml");
//PropertyConfigurator.configure("D:/workspace/Test/log4j.properties");
Log4jApp app = new Log4jApp();
app.printLog();
Test test = new Test();
test.printLog();
}
}
工程結構:
輸出結果:
其中Eclipse 的Console:
14:41:43,858 INFO Class:27 - 測試info
14:41:43,860 DEBUG Class:28 - 測試debug
14:41:43,860 ERROR Class:29 - 測試error
14:41:43,861 DEBUG Test:17 - Test.java debug
14:41:43,861 INFO Test:18 - Test.java info
test.log:
2012-11-08 14:41:43.858 INFO [main] Class - 測試info
2012-11-08 14:41:43.860 DEBUG [main] Class - 測試debug
2012-11-08 14:41:43.860 ERROR [main] Class - 測試error
2012-11-08 14:41:43.861 DEBUG [main] Test - Test.java debug
2012-11-08 14:41:43.861 INFO [main] Test - Test.java info
test1.log:
2012-11-08 14:41:43.861 DEBUG [main] Test - Test.java debug
2012-11-08 14:41:43.861 INFO [main] Test - Test.java info
我們發現 test.log 中還包含有test1.log中打印的內容,實際上test包路徑下面打印了2次,這時我們可以通過配置 additivity="false",讓此包路徑下面的日誌只打印一次。
<logger name="com.zznode.test" additivity="false">
<level value="DEBUG"/>
<appender-ref ref="File1" />
</logger>
再次測試,的確有效!這樣目的就達到了,把log4j.xml改爲log4j.properties,效果是一樣的,配置如下:
### set log levels ###
log4j.rootLogger = debug,stdout,File
log4j.logger.com.zznode.test=debug,File1
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.appender.File = org.apache.log4j.DailyRollingFileAppender
log4j.appender.File.File = D:/log4j/test.log
log4j.appender.File.Append = true
log4j.appender.File.Threshold = DEBUG
log4j.appender.File.layout = org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss.SSS} %-5p [%t] %c{1} - %m%n
log4j.appender.File1 = org.apache.log4j.DailyRollingFileAppender
log4j.appender.File1.File = D:/log4j/test1.log
log4j.appender.File1.Append = true
log4j.appender.File1.Threshold = DEBUG
log4j.appender.File1.layout = org.apache.log4j.PatternLayout
log4j.appender.File1.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss.SSS} %-5p [%t] %c{1} - %m%n