spring+maven+log4j2 配置
阿新 • • 發佈:2019-01-01
什麼是log4j2
log4j是Apache提供的一個日誌實現,是一個基於Java的日誌記錄工具,有log4j1跟log4j2兩個版本。log4j2是log4j的升級版本。log4j2支援log4j1.2,slf4j、commons loggin和java.util.loggin API。
本文使用log4j2+slf4j進行配置。slf4j不是一個真正的日誌實現,而是一個抽象層,相當於一個統一的介面,它允許你在後臺使用任意一個日誌類庫。我們使用slf4j提供的介面進行日誌記錄的程式設計,當我們需要更換具體的日誌實現時,可以不改日誌程式碼,只要加入相應的jar包跟配置就可以實現切換。例如從logback到log4j2的切換,只需將logback相關jiar包改為log4j2相關jar包即可。
需要引入的jar包
在maven配置檔案中加入以下依賴jar包
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId >org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.6.2</version>
</dependency>
<dependency> <!-- 橋接:告訴Slf4j使用Log4j2 -->
<groupId>org.apache.logging.log4j</groupId >
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId> <!-- 橋接:log4j1使用Log4j2 也支援其他實現到log4j的橋接,引入不同的jar包即可-->
<artifactId>log4j-over-slf4j</artifactId>
<version>1.7.12</version>
</dependency>
<!-- 使用非同步寫日誌功能 必須引入此包-->
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.3.6</version>
</dependency>
xml方式log4j配置
可以通過以下四種方式配置log4j2
- 通過一個格式為xml或json的配置檔案
- 以程式設計方式,通過建立一個ConfigurationFactory工廠和Configuration實現
- 以程式設計方式,通過api暴露在配置介面新增元件的博人方式
- 以程式設計方式,通過呼叫Logger內部類上的方法
配置檔案優先順序及存放位置
log4j2不在支援log2j1中的.properties字尾的檔案配置方式。log4j2版本配置檔案字尾只能為xml、json或jsn。
系統選擇配置的檔案的優先順序如下:
- classpath下的名為log4j2-test.json或者log4j-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
首先先來看一個例子
<?xml version="1.0" encoding="UTF-8"?>
<!-- status : 這個用於設定log4j2自身內部的資訊輸出,可以不設定,當設定成trace時,會看到log4j2內部各種詳細輸出 ,預設OFF
monitorInterval : Log4j能夠自動檢測修改配置檔案和重新配置本身, 設定間隔秒數。
%d{yyyy-MM-dd HH:mm:ss, SSS} : 日誌生產時間
%p : 日誌輸出格式
%c : logger的名稱
%m : 日誌內容,即 logger.info("message")
%n : 換行符
%C : Java類名
%L : 日誌輸出所在行數
%M : 日誌輸出所在方法名
hostName : 本地機器名 hostAddress : 本地ip地址 -->
<Configuration status="debug" strict="true">
<properties>
<property name="LOG_HOME">${sys:catalina.home}/logs/</property>
</properties>
<Appenders>
<!--這個輸出控制檯的配置 -->
<Console name="Console" target="SYSTEM_OUT">
<!--控制檯只輸出level及以上級別的資訊(onMatch),其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
<!-- 輸出日誌的格式 -->
<PatternLayout pattern="%d{DEFAULT} %c{1} %p [%t] %m%n"/>
</Console>
<!--檔案會打印出所有資訊,這個log每次執行程式會自動清空,由append屬性決定是否清空-->
<File name="log" fileName="${LOG_HOME}/log/test.log" append="false">
<!-- 輸出的日誌格式 -->
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
<!--這個會打印出所有的資訊 每個小時自動按年月日時進行壓縮 -->
<RollingFile name="appLog"
fileName="${LOG_HOME}info/info.log"
filePattern="${LOG_HOME}info/info.log.%d{yyyy-MM-dd-HH}.log.gz"
append="true"
>
<!-- 日誌列印格式-->
<PatternLayout pattern="%d{DEFAULT} | %c{1} | %p | [%t] | %m%n"/>
<Policies>
<!-- 此處是按時間進行壓縮 根據filePattern中的時間格式 每隔一個單位進行壓縮-->
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
</Policies>
</RollingFile>
<Async name="asyncAppLog">
<AppenderRef ref="appLog"/>
</Async>
<!-- error日誌格式 -->
<!--配置多個Rollingfile地址,還需要在root下新增appender-ref ref="asyncErrorLog"/> 只顯示error級別的資訊 -->
<RollingFile name="errorLog" fileName="${LOG_HOME}error/error.log"
filePattern="${LOG_HOME}error/error.log.%d{yyyy-MM-dd}.log.gz">
<!-- 日誌列印格式-->
<PatternLayout pattern="%d{DEFAULT} | %c{10} | %p | [%t] | %m%n"/>
<Policies>
<!-- 日誌壓縮觸發條件 -->
<!-- 每次日誌超過size配置的大小,按filePattern的配置的格式進行壓縮>
<SizeBasedTriggeringPolicy size="250 MB"/>
<!-- 此處是按時間進行壓縮 根據filePattern中的時間格式 每隔一個單位進行壓縮 此處是按天壓縮-->
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
</Policies>
</RollingFile>
<Async name="asyncErrorLog">
<AppenderRef ref="errorLog"/>
</Async>
</Appenders>
<!--定義logger,只有定義了logger並引入的appender,appender才會生效 -->
<Loggers>
<!-- 配置日誌的根節點,建立一個預設的root的logger,需要在root的level中指定輸出的級別 -->
<Root level="info">
<AppenderRef ref="asyncAppLog"/>
</Root>
<AsyncLogger name="logger.error" level="info" additivity="false">
<AppenderRef ref="asyncErrorLog"/>
</AsyncLogger>
</Loggers>
</Configuration>
log4j配置檔案詳解
logs4j配置
Configuration節點中有兩個屬性:status和monitorInterval。
- status表示log4j自己的日誌列印級別,如果設定為TRACE,可以看到控制檯輸出log4j本身的日誌資訊。
- monitorInterval表示每隔多少秒自動檢測配置檔案的更改,單位是秒,最小的時間間隔是5秒。
Configuration有兩個子節點Appenders和Loggers
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 : RollingFile子節點,輸出格式,不設定預設為%m%n.
- filePattern:指定新建日誌檔案的名稱格式
- Policies:指定滾動日誌的策略,就是什麼時候進行新建日誌檔案輸出日誌
- TimeBasedTriggeringPolicy:Policies子節點,基於時間的滾動策略,interval屬性用來指定多久滾動一次,預設是1hour。modulate=true用來調整時間。比如現在是早上3點,interval是4沒那麼第一次滾動是在早上4點,接著是8am,12am..而不是7am
- SizeBasedTriggeringPolicy:Policies子節點,基於指定檔案大小的滾動策略,size屬性用來定義每個日誌檔案的大小。
- DefaultRolloverStrategy:用來指定同一個資料夾下最多有幾個日誌檔案時開始刪除最舊的,建立新的(通過max)
- Console節點用來定義輸出到控制檯的Appender
Loggers節點,常見的有兩種:Root和Logger
- Root節點用來指定專案的根日誌,如果沒有單獨指定Logger,那麼久會預設使用該Root日誌輸出
- level:日誌輸出級別,共有8個級別,按照從低到高:ALL-Trace-Debug-Info-Warn-Error-Fatal-OFF
- name: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中進行輸出。
- Root節點用來指定專案的根日誌,如果沒有單獨指定Logger,那麼久會預設使用該Root日誌輸出
- 關於日誌level
- 共有8個級別,按照從低到高ALL-Trace-Debug-Info-Warn-Error-Fatal-OFF
- ALL:最低等級,用於開啟所有日誌記錄
- Trace:是追蹤,就是程式推進以下,你就可以寫個trace輸出,所以trace應該會特別多,不過沒關係,我們可以設定最低日誌級別不讓他輸出
- Debug:指出細粒度資訊事件對除錯應用程式是非常有幫助的
- Info:訊息在粗粒度級別上突出強呼叫用程式的執行過程
- Warn:輸出警告及warn以下級別的日誌
- Error:輸出錯誤資訊日誌
- Fatal:輸出每個嚴重的錯誤事件將會導致應用程式退出的日誌
- OFF:最高等級,用於關閉所有的日誌記錄
程式會列印高於或等於所設定級別的日誌,設定級別的日誌越高,打印出來的日誌就越少
PatternLayou格式設定
%d{yyyy-MM-dd HH:mm:ss.SSS}:表示輸出的日期格式
%t:表示當前執行緒名稱
%-5level:輸出日誌級別,-5表示左對齊並且固定輸出5個字元
%l:輸出語句所在的包名、類名、函式名、行數
%msg:輸出日誌的內容
%n:換行
%F 輸出所在的類檔名
%L 輸出行號
%M 輸出所在方法名
java 中使用
private final static Logger LOGGER = LoggerFactory.getLogger(clazz);
private static final Logger ERROR_LOG = LoggerFactory.getLogger("logger.error");
private static final Logger TEST_LOG = LoggerFactory.getLogger("logger.test");
LOGGER.info("info日誌");
ERROR_LOG.error("error日誌");
TEST_LOG.error("test日誌");