1. 程式人生 > >log日誌配置簡述(轉)

log日誌配置簡述(轉)

原文連結:https://blog.csdn.net/qiuqiu886/article/details/77606636#commentsedit

近期進行log升級,簡單配置了下幾種常用日誌,分別是log4j、log4j2、logback。簡單整理,不全不深,僅備後用。 
需求:將應用日誌以控制檯或檔案的形式輸出。

一、log4j

(1)引入jar包

下載並引入log4j的jar包,log4j-1.*.jar,筆者用的是 log4j-1.2.17.jar。

(2)log的主要節點

log配置檔案主要包含三個節點:Logger、Appender、Layout。 
Logger:配置列印日誌的級別,輸出日誌的程式範圍,以及關聯的Appender。 
Appender:配置日誌的輸出形式,輸出策略等。 
Layout:配置每條日誌的內容格式。

(3)配置log4j.properties檔案,示例:

#配置根節點
log4j.rootLogger=INFO,Log4jConsole,Log4jFile
#log不向上層傳遞
log4j.additivity.org.appache=false
#設定變數,儲存路徑 ${catalina.home}/logs
logDir=D:/tomcat/logs

#控制檯輸出
log4j.appender.Log4jConsole=org.apache.log4j.ConsoleAppender
log4j.appender.Log4jConsole.Threshold=INFO
log4j.appender.Log4jConsole.ImmediateFlush=true
log4j.appender.Log4jConsole.Target=System.out
#輸出格式
log4j.appender.Log4jConsole.layout=org.apache.log4j.PatternLayout
log4j.appender.Log4jConsole.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}] [%c:%M:%L] %m%n

#檔案輸出
log4j.appender.Log4jFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.Log4jFile.Threshold=INFO
log4j.appender.Log4jFile.ImmediateFlush=true
log4j.appender.Log4jFile.Append=true
log4j.appender.Log4jFile.File=${logDir}/log4j.log
log4j.appender.Log4jFile.DatePattern='.'yyyy-MM-dd
#輸出格式
log4j.appender.Log4jFile.layout=org.apache.log4j.PatternLayout
log4j.appender.Log4jFile.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}] [%c:%M:%L] %m%n

說明: 
1.Logger節點配置,“log4j.rootLogger=INFO,Log4jConsole,Log4jFile”。 
rootLogger為根節點,必須配置項。日誌輸出範圍為整個project。 
若需配置logger子節點,支援以包名或類名控制日誌範圍。如:log4j.logger.com.demo=*,“com.demo”為程式包名,表示配置該包名範圍內的日誌。 
2.INFO為日誌級別,表示輸出INFO級別及以上的日誌。 
常用日誌級別:DEBUG < INFO < WARN < ERROR。 
3.log4j.additivity屬性,表示根據程式的層級結構,下層日誌是否向上層傳遞。 
4.Appender節點,示例中的Log4jConsole,Log4jFile均為Appender名稱。常用的Appender型別有: 
org.apache.log4j.ConsoleAppender,控制檯形式輸出日誌。 
org.apache.log4j.DailyRollingFileAppender,按時間策略,檔案形式輸出日誌。 
org.apache.log4j.RollingFileAppender,按檔案大小策略,檔案形式輸出日誌。 
其中:log4j.appender. * .File,設定當前日誌檔名稱。 
log4j.appender.*.DatePattern,設定時間維度,支援按天、按小時等精度生成日誌。 
5.若以檔案形式輸出日誌,可設定檔案儲存的相對路徑,如tomcat的“${catalina.home}”。 
6.Layout設定每條日誌內容的輸出格式,Layout支援多種型別格式,筆者此次使用的是“org.apache.log4j.PatternLayout”。 
設定格式:

[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}] [%c:%M:%L] %m%n
  •  

程式碼呼叫:

logger.info("it is a log for log4j!");
  •  

執行效果:

[INFO][2017-08-26 10:22:23][com.demo.log.Log4jTest:writeLog:41]it is a log for log4j!
  •  
格式化符號 意義 備註
%p 日誌級別 如:INFO、WARN
%d 時間 可設定格式,%d{yyyy_MM_dd HH:mm:ss}
%t 執行緒名  
%c 類名 如:%-20c,表示,左對齊,最大長度20
%M 方法名  
%L 行號  
%m 日誌內容 程式碼輸出的內容
%n 換行  

(4)程式碼引用

此處為了說明,程式碼使用log4j自身的類寫log。具體運用建議使用slf4j形式,具體後面講解。

import org.apache.log4j.Logger;
......
private static Logger logger = Logger.getLogger(Log4j2Test.class);
......
logger.info("it is a log for log4j!");

log4j、log4j2、logback的配置項相似,只是語法不同,後面僅簡述不同的地方,不重複說明。

二、log4j2

(1)引入jar包

下載並引入log4j的jar包,log4j-api-2.*.jar,log4j-core-2.*.jar。筆者用的是 log4j-api-2.8.2.jar,log4j-core-2.8.2.jar。

(2)配置log4j2.xml檔案,示例:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="60">
      <Properties>
            <!-- 日誌輸出路徑變數 ${sys:catalina.home}/logs -->
            <Property name="logDir" value="D:/tomcat/logs" />

      <Appenders>
            <!-- 控制檯輸出 -->
            <Console name="Log4j2Console" target="SYSTEM_OUT">
                  <PatternLayout
                        pattern="[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}] [%c:%M:%L] %m%n" />
            </Console>

            <!-- 檔案輸出 -->
            <RollingFile name="Log4j2File" fileName="${logDir}/log4j2.log"
                  filePattern="${logDir}/log4j2.log.%d{yyyy-MM-dd}">
                  <PatternLayout
                        pattern="[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}] [%c:%M:%L] %m%n" />
                  <Policies>
                        <TimeBasedTriggeringPolicy />
                        <SizeBasedTriggeringPolicy size="100MB" />
                  </Policies>
            </RollingFile>
      </Appenders>

      <Loggers>
            <Root level="INFO">
                  <appender-ref ref="Log4j2Console" />
                  <appender-ref ref="Log4j2File"/>
            </Root>
      </Loggers>
</Configuration>

說明: 
1.Configuration標籤中的monitorInterval屬性,表示自動掃描的間隔秒數。log4j2定時掃描配置檔案,當配置檔案發生變化,將重新載入生效。 
2.status屬性,表示檢視log4j2內部日誌的日誌級別,應用可檢視log4j2內部的載入日誌。 
3.若設定tomcat的相對路徑儲存日誌檔案,使用 ${sys:catalina.home},和log4j有區別。 
4.RollingFile 檔案形式輸出日誌,支援通過時間、檔案大小兩種策略生成檔案。 
5.RollingFile節點的filename屬性,可設定當前檔名包含時間戳。如:

fileName="${log.dir}/log4j2.log.${date:yyyy-MM-dd}"
  • 6.本例項中僅配置了root根日誌節點,若需配置子節點,在中新增子節點即可。
    <Logger level="INFO" name="com.demo.log" additivity="false">
        <appender-ref ref="Log4j2Console" />
    </Logger>

7.log4j2支援配置非同步寫log,以提升日誌列印效率。配置如下:

      <Appenders>
              <RollingRandomAccessFile name="Log4j2File"
                  fileName="${logDir}/log4j2.log" filePattern="${log.dir}/log4j2.log.%d{yyyy-MM-dd}">
                  <PatternLayout>
                        <Pattern>[%p] %d{MM-dd HH:mm:ss,SSS}-(%c:%M:%L) %m%n</Pattern>
                  </PatternLayout>
                  <Policies>
                        <TimeBasedTriggeringPolicy />
                  </Policies>
            </RollingRandomAccessFile>
            ......
      </Appenders>
      <Loggers>
            <AsyncLogger name="com.demo.log"
                  level="INFO" additivity="false">
                  <AppenderRef ref="Log4j2File" />
            </AsyncLogger>
            ......
      </Loggers>

(3)程式碼引用

此處為了說明,程式碼使用log4j2自身的類寫log。具體運用建議使用slf4j形式,具體後面講解。

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
......
private static Logger logger = LogManager.getLogger(Log4j2Test.class);
......
logger.info("it is a log for log4j2!");

三、logback

(1)引入jar包

下載並引入jar包,筆者用的是:slf4j-api-1.7.7.jar,logback-core-1.1.2.jar,logback-classic-1.1.2.jar。

(2)配置logback.xml檔案,配置檔案示例:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration scan="true" scanPeriod="60 seconds" debug="true">
      <!-- 60s 自動掃描配置 -->
      <!-- 檔案路徑變數 ${catalina.home}/logs -->
      <Property name="logDir" value="D:/tomcat/logs" />
      <!-- 控制檯輸出 -->
      <Appender name="LogbackConsole" class="ch.qos.logback.core.ConsoleAppender">
            <Encoder>
                  <Pattern>[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}][%C:%M:%L]%m%n
                  </Pattern>
            </Encoder>
      </Appender>
      <!-- 檔案輸出 -->
      <Appender name="LogbackFile"
            class="ch.qos.logback.core.rolling.RollingFileAppender">
            <File>${logDir}/logback.log</File>
            <Append>true</Append>
            <RollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                  <FileNamePattern>${logDir}/logback.log.%d{yyyy-MM-dd}.%i
                  </FileNamePattern>
            </RollingPolicy>
            <TriggeringPolicy
                  class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                  <MaxFileSize>100MB</MaxFileSize>
            </TriggeringPolicy>
            <Encoder>
                  <Pattern>[%p][%d{yyyy-MM-dd HH:mm:ss,SSS}][%C:%M:%L]%m%n
                  </Pattern>
            </Encoder>
      </Appender>

      <Root level="INFO">
            <Appender-ref ref="LogbackConsole" />
            <Appender-ref ref="LogbackFile" />
      </Root>
</Configuration>

說明: 
1.logback可設定歷史日誌檔案自動壓縮,設定fileNamePattern屬性新增“.gz”字尾即可。

<fileNamePattern>${log.dir}/logback.log.%i.%d{yyyy-MM-dd}.gz</fileNamePattern>
  • 1

logback、log4j2的配置檔案較相似,讀懂了上面log4j2的配置檔案,再看logback的配置就很輕鬆,不做過多說明。

(3)程式碼引用

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......
private final static Logger logger = LoggerFactory
        .getLogger(LogbackTest.class);
......
logger.info("it is a log for logback!");

四、slf4j

slf4j,Simple Logging Facade for Java,Java簡單日誌門面。它不實現日誌列印,只是通過門面模式提供log的api。

此處假裝有圖的樣子

(1)引入jar包,以slf4j+log4j為例: 
1. slf4j-api.jar,提供api給應用,如LoggerFactory工廠類。 
2. slf4j-log4j.jar,橋接包,關聯slf4j及log4j。 
3. log4j-*jar,log4j的jar包,實現log列印。 
(2)程式碼採用slf4j形式,同logback的程式碼示例:

private final static Logger logger = LoggerFactory
        .getLogger(LogbackTest.class);
......
logger.info("it is a log for {}!",type);
......

(3)slf4j的好處:1、統一使用slf4j形式寫log,不用修改原始碼,便於日誌升級。2、log引數使用佔位符{},不使用字串拼接,語句清晰,效能更好。