Log4j由三個重要的組件構成:日志信息的優先級,日志信息的輸出目的地,日志信息的輸出格式。日志信息的優先級從高到低有ERROR、WARN、INFO、DEBUG,分別用來指定這條日志信息的重要程度;日志信息的輸出目的地指定了日志將打印到控制台還是文件中;而輸出格式則控制了日志信息的顯示內容。
一、Log4j的日志輸出級別:
1、 log4j的八個日志級別:OFF FATAL ERROR WARN INFO DEBUG TRACE ALL
ALL 各級包括自定義級別
DEBUG 指定細粒度信息事件是最有用的應用程序調試
ERROR 錯誤事件可能仍然允許應用程序繼續運行
FATAL 指定非常嚴重的錯誤事件,這可能導致應用程序中止
INFO 指定能夠突出在粗粒度級別的應用程序運行情況的信息的消息
OFF 這是最高等級,為了關閉日志記錄
TRACE 指定細粒度比DEBUG更低的信息事件
WARN 指定具有潛在危害的情況
2、 log4j的核心,系統啟動日志級別a,日志打印級別b,在記錄日志請求是b>=a,日志可以打印出來。級別順序:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
3、 log4j建議使用四個日志級別2個日志開關
DEBUG:輸出調試信息;指出細粒度信息事件對調試應用程序是非常有幫助的。
INFO: 輸出提示信息;消息在粗粒度級別上突出強調應用程序的運行過程。
WARN: 輸出警告信息;表明會出現潛在錯誤的情形。
ERROR:輸出錯誤信息;指出雖然發生錯誤事件,但仍然不影響系統的繼續運行。
FATAL: 輸出致命錯誤;指出每個嚴重的錯誤事件將會導致應用程序的退出。
ALL level:打開所有日志記錄開關;是最低等級的,用於打開所有日志記錄。
OFF level:關閉所有日志記錄開關;是最高等級的,用於關閉所有日志記錄。
二、Log4j.properties配置文件詳解
1、log4j.rootLogger=DEBUG,console,FILE
log4j.rootLogger用來配置日志輸出的優先級和日志輸出的目的地。第一個字DEBUG指定優先級,只能指定一個字段。第二個字段和第三個字段,用來指定日志輸出的目的地。console代表輸出到控制台,FILE代表輸出到文件。如果只有一個輸出目的地,我們也可以只指定一個字段。
2、log4j.appender.console=org.apache.log4j.ConsoleAppender、og4j.appender.console用來配置具體的類,這里的console就是我們在上面定義的log4j.rootLogger=DEBUG,console,FILE
3、log4j.appender.console.threshold=INFO
threshold是個全局的過濾器,把低於所設置的level的信息過濾掉,不顯示出來。
4、log4j.appender.console.layout=org.apache.log4j.PatternLayout
指定布局樣式,Log4j具有以下幾種類型的布局Layout
PatternLayout:根據指定的轉換模式格式化日志輸出
HTMLLayout:格式化日志輸出為HTML表格
XMLLayout:格式化日志輸出為XML文件
SimpleLayout:以一種非常簡單的方式格式化日志輸出
TTCCLayout:包含日志產生的時間、線程、類別等信息
5、log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%5p] - %c -%F(%L) -%m%n
設置日志的布局格式
6、log4j.appender.FILE=org.apache.log4j.RollingFileAppender
輸出到文件
org.apache.log4j.ConsoleAppender(輸出日志到控制台)
org.apache.log4j.FileAppender(輸出日志到文件)
org.apache.log4j.DailyRollingFileAppender(輸出日志到文件,且每天產生一個日志文件)
org.apache.log4j.RollingFileAppender(輸出日志到文件,且文件大小到達指定尺寸的時候產生一個新的文件)
org.apache.log4j.WriterAppender(將日志信息以流格式發送到任意指定的地方)
ConsoleAppender選項:
Threshold=WARN:指定日志信息的最低輸出級別,默認為DEBUG。
ImmediateFlush=true:表示所有消息都會被立即輸出,設為false則不輸出,默認值是true。
Target=System.err:默認值是System.out。
FileAppender選項:
Threshold=WARN:指定日志信息的最低輸出級別,默認為DEBUG。
ImmediateFlush=true:表示所有消息都會被立即輸出,設為false則不輸出,默認值是true。
Append=false:true表示消息增加到指定文件中,false則將消息覆蓋指定的文件內容,默認值是true。
File=D:/logs/logging.log4j:指定消息輸出到logging.log4j文件中。
DailyRollingFileAppender選項:
Threshold=WARN:指定日志信息的最低輸出級別,默認為DEBUG。
ImmediateFlush=true:表示所有消息都會被立即輸出,設為false則不輸出,默認值是true。
Append=false:true表示消息增加到指定文件中,false則將消息覆蓋指定的文件內容,默認值是true。
File=D:/logs/logging.log4j:指定當前消息輸出到logging.log4j文件中。
DatePattern='.'yyyy-MM:每月滾動一次日志文件,即每月產生一個新的日志文件。當前月的日志文件名為logging.log4j,前一個月的日志文件名logging.log4j.yyyy-MM。
另外,也可以指定按周、天、時、分等來滾動日志文件,對應的格式如下:
1)'.'yyyy-MM:每月
2)'.'yyyy-ww:每周
3)'.'yyyy-MM-dd:每天
4)'.'yyyy-MM-dd-a:每天兩次
5)'.'yyyy-MM-dd-HH:每小時
6)'.'yyyy-MM-dd-HH-mm:每分鍾
RollingFileAppender選項:
Threshold=WARN:指定日志信息的最低輸出級別,默認為DEBUG。
ImmediateFlush=true:表示所有消息都會被立即輸出,設為false則不輸出,默認值是true。
Append=false:true表示消息增加到指定文件中,false則將消息覆蓋指定的文件內容,默認值是true。
File=D:/logs/logging.log4j:指定消息輸出到logging.log4j文件中。
MaxFileSize=100KB:后綴可以是KB, MB 或者GB。在日志文件到達該大小時,將會自動滾動,即將原來的內容移到logging.log4j.1文件中。
MaxBackupIndex=2:指定可以產生的滾動文件的最大數,例如,設為2則可以產生logging.log4j.1,logging.log4j.2兩個滾動文件
和一個logging.log4j文件。
7、log4j.appender.FILE.Append=true
是否追加:是
8、log4j.appender.FILE.File=../logs/log4jtest.log
日志文件路徑
9、log4j.appender.FILE.MaxFileSize=10MB
設置文件大小超過10MB以后自動更名,將原來的日志移動到新的新的文件中,打包備份。
10、log4j.appender.FILE.MaxBackupIndex=50
設置可以產生的滾動文件的最大數量,也就是可以產生的備份文件的最大數量。
三、實戰應用
Log4j.properties配置:
log.home=D:\\weblogiclog
log4j.rootLogger=DEBUG
#credit
log4j.logger.credit=WARN,credit,console
#console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy/MM/dd HH\:mm\:ss,SSS} [%-3p][class:%l] %m %n
#bcmp-tran-credit.log
log4j.appender.credit=com.paic.cmp.esb.util.MinuteRollingAppender
log4j.appender.credit.Append=true
#'.'yyyy-MM-dd-HH-mm,對應minutely(每分鍾)
log4j.appender.credit.File=${log.home}/bcmp-tran-credit.log
log4j.appender.credit.intervalTime=2
log4j.appender.credit.layout=org.apache.log4j.PatternLayout
log4j.appender.credit.layout.ConversionPattern=%d{yyyy/MM/dd HH\:mm\:ss,SSS} [%-3p][class:%l] %m %n
日志輸出配置:
代碼中日志打印級別默認INFO
1、 log.home:日志輸出文件路徑
log4j.rootLogger:日志輸出優先級(DEBUG)a
log4j.logger.credit:日志輸出級別b、日志輸出到文件bcmp-tran-credit.log、日志輸出到控制台
當b>=a,日志輸出到文件及控制台
2、 當log4j.logger.credit=DEBUG,credit 由於a=DEBUG 日志只輸出到文件
3、 當log4j.logger.credit=WARN,credit,console 由於WARN>IFNO 日志不輸出。
Log4j所需jar:log4j-XXX.jar
四、log4j2.xml配置文件詳解
1、配置文件的名稱以及在項目中的存放位置
log4j 2.x版本不支持1.x中的.properties后綴的文件配置方式,2.x版本配置文件后綴名只能為".xml",".json"或者".jsn"。
系統選擇配置文件的優先級(從先到后)如下:
.classpath下的名為log4j2-test.json 或者log4j2-test.jsn的文件.
.classpath下的名為log4j2-test.xml的文件.
.classpath下名為log4j2.json 或者log4j2.jsn的文件.
.classpath下名為log4j2.xml的文件.
我們一般默認使用log4j2.xml進行命名。如果本地要測試,可以把log4j2-test.xml放到classpath,而正式環境使用log4j2.xml,則在打包部署的時候不要打包log4j2-test.xml即可。
2、配置文件節點解析
(1)根節點Configuration有兩個屬性:status和monitorinterval,有兩個子節點:Appenders和Loggers(表明可以定義多個Appender和Logger).
status用來指定log4j本身的打印日志的級別.
monitorinterval用於指定log4j自動重新配置的監測間隔時間,單位是s,最小是5s.
(2)Appenders節點,常見的有三種子節點:Console、RollingFile、File.
Console節點用來定義輸出到控制台的Appender.
name:指定Appender的名字.
target:SYSTEM_OUT 或 SYSTEM_ERR,一般只設置默認:SYSTEM_OUT.
PatternLayout:輸出格式,不設置默認為:%m%n.
File節點用來定義輸出到指定位置的文件的Appender.
name:指定Appender的名字.
fileName:指定輸出日志的目的文件帶全路徑的文件名.
PatternLayout:輸出格式,不設置默認為:%m%n.
RollingFile節點用來定義超過指定大小自動刪除舊的創建新的的Appender.
name:指定Appender的名字.
fileName:指定輸出日志的目的文件帶全路徑的文件名.
PatternLayout:輸出格式,不設置默認為:%m%n.
filePattern:指定新建日志文件的名稱格式.
Policies:指定滾動日志的策略,就是什么時候進行新建日志文件輸出日志.
TimeBasedTriggeringPolicy:Policies子節點,基於時間的滾動策略,interval屬性用來指定多久滾動一次,默認是1 hour。modulate=true用來調整時間:比如現在是早上3am,interval是4,那么第一次滾動是在4am,接着是8am,12am...而不是7am.
SizeBasedTriggeringPolicy:Policies子節點,基於指定文件大小的滾動策略,size屬性用來定義每個日志文件的大小.
DefaultRolloverStrategy:用來指定同一個文件夾下最多有幾個日志文件時開始刪除最舊的,創建新的(通過max屬性)。
(3)Loggers節點,常見的有兩種:Root和Logger.
Root節點用來指定項目的根日志,如果沒有單獨指定Logger,那么就會默認使用該Root日志輸出
level:日志輸出級別,共有8個級別,按照從低到高為:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
AppenderRef:Root的子節點,用來指定該日志輸出到哪個Appender.
Logger節點用來單獨指定日志的形式,比如要為指定包下的class指定不同的日志級別等。
level:日志輸出級別,共有8個級別,按照從低到高為:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
name:用來指定該Logger所適用的類或者類所在的包全路徑,繼承自Root節點.
AppenderRef:Logger的子節點,用來指定該日志輸出到哪個Appender,如果沒有指定,就會默認繼承自Root.如果指定了,那么會在指定的這個Appender和Root的Appender中都會輸出,此時我們可以設置Logger的additivity="false"只在自定義的Appender中進行輸出。
4、 完整的配置模版
五、log4j2.xml實戰
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="info">
<Appenders>
<Console name="CONSOLE" target="SYSTEM_OUT">
<PatternLayout pattern="[%d{HH:mm:ss.SSS}] [%-3p] %x %c{1}: %m%n" />
<!--
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="WARN"/>
<param name="LevelMax" value="ERROR"/>
</filter>-->
</Console>
<RollingRandomAccessFile name="logFile"
fileName="D:/log/pafa.log" filePattern="pafa.log.%d{yyyyMMdd}"
immediateFlush="false" bufferSize="262144">
<PatternLayout pattern="%d{MM/dd HH:mm:ss.sss} [%-3p] %c{1}: %m%n" />
<Policies>
<TimeBasedTriggeringPolicy interval="1"
modulate="true" />
</Policies>
</RollingRandomAccessFile>
<Async name="logFileAsync" bufferSize="2000" blocking="false">
<AppenderRef ref="logFile" />
</Async>
<RollingRandomAccessFile name="credit"
fileName="D:/log/credit.log" filePattern="credit-%d{yyyy-MM-dd}-%i.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss:SSS} [%p] [%t] %c{1} - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
</Policies>
<DefaultRolloverStrategy max="20"/>
</RollingRandomAccessFile>
<RollingRandomAccessFile name="error1"
fileName="D:/log/credit-error.log" filePattern="credit-error-%d{yyyy-MM-dd}-%i.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss:SSS} [%p] [%t] %c{1} - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
</Policies>
<DefaultRolloverStrategy max="20"/>
<Filters>
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<logger name="org.apache" level="INFO" />
<logger name="java.sql.Connection" level="INFO">
</logger>
<logger name="com.ibatis" level="INFO"></logger>
<logger name="java.sql.Statement" level="INFO" />
<logger name="java.sql.PreparedStatement" level="INFO" />
<logger name="com.paic.pafademo" level="INFO" />
<Logger name="credit" level="INFO" additivity="false">
<appender-ref ref="credit"/>
</Logger>
<Root level="INFO">
<appender-ref ref="error1"/>
<AppenderRef ref="logFileAsync" />
<AppenderRef ref= "CONSOLE"/>
</Root>
</Loggers>
</configuration>
private static Logger creditLogger = LoggerFactory.getLogger("credit");
creditLogger.info("sssssssssssssssssssssssssssssssssss123");
結果:
日志打印到控制台,但是credit只輸出到文件,不打印到控制台(additivity="false")。
Credit-error.log只打印error級別的日志,並打印到控制台。