07.03 乾貨!Spring MVC + Slf4j + Log4j2 日誌文件系統配置

乾貨!Spring MVC + Slf4j + Log4j2 日誌文件系統配置

一、各種日誌系統介紹:

Commons Logging

Commons Logging 也就是JCL,提供的是一個日誌接口(Interface),自身提供一個簡單的日誌文件系統,但一般和其他日誌系統組合使用。如:Commons-Logging + Log4j組合使用。

它會通過動態查找機制,在程序運行時自動找出真正使用的日誌庫。

Slf4j

Slf4j 即Simple Logging Facade for Java,和Commons-Logging類似,也是對不同日誌框架提供的一個門面封裝,可以在部署的時候可以通過橋接包接入其他日誌方案來組合使用。

它支持多個參數並通過"{ }"佔位符來進行替換。

Log4j

Log4j 即Log for Java ,經典的一種日誌解決方案。內部把日誌系統抽象封裝成Logger 、appender 、pattern 等實現。我們可以通過配置文件輕鬆的實現日誌系統的管理和多樣化配置。

Log4j 系統的三大板塊:日誌寫入器Logger、日誌輸出終端Appender、日誌佈局模式Layout。其中Appender常用的有ConsoleAppender(輸出到控制檯)、FileAppender(輸出文件)和RollingFileAppender(輸出滾動文件)三種。

在classpath下編寫配置文件log4j.properties,配置相關日誌屬性和格式。

Log4j2

Log4j2 是在Log4j 1.x版本基礎上的一個升級版本。性能得到提升的同時,還能夠自動裝載配置文件,支持參數變量的佔位符功能,可以專門指定事件進行過濾,並且支持插件式架構。

Logback

Logback是由log4j創始人涉及的又一個開源的日誌組件,logback當前分成三個模塊:logback-core,logback- classic和logback-access。logback-core是其它兩個模塊的基礎模塊。logback-classic是log4j的一個 改良版本。此外logback-classic完整實現Slf4j API,使我們可以很方便地更換成其它日誌系統,如:log4j或JDK。logback-access訪問模塊與Servlet容器集成提供通過Http來訪問日誌的功能。

二、Spring MVC + Slf4j + Log4j2 配置步驟:

Maven配置

首先,應在Maven中加載所需依賴包,並通過橋接器將Slf4j和Log4j2組合起來使用。

第一步:配置Spring需要的依賴:(選用“4.0.9.RELEASE”版本)

 
<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-core/<artifactid>
<version>${springframework}/<version>
<exclusions>
<exclusion>
<groupid>commons-logging/<groupid>
<artifactid>commons-logging/<artifactid>
/<exclusion>
/<exclusions>
/<dependency>
<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-beans/<artifactid>
<version>${springframework}/<version>
/<dependency>
<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-context/<artifactid>
<version>${springframework}/<version>
/<dependency>
<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-context-support/<artifactid>
<version>${springframework}/<version>
/<dependency>
<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-expression/<artifactid>
<version>${springframework}/<version>
/<dependency>
<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-tx/<artifactid>
<version>${springframework}/<version>
/<dependency>
<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-web/<artifactid>
<version>${springframework}/<version>
/<dependency>
<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-webmvc/<artifactid>
<version>${springframework}/<version>
/<dependency>

<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-jdbc/<artifactid>
<version>${springframework}/<version>
/<dependency>
<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-jms/<artifactid>
<version>${springframework}/<version>
/<dependency>

注意 : Spring自身的日誌系統是基於Commons-Logging接口的,而我們所採用的是Slf4j接口 + Log4j2組合模式,為了避免衝突,故需在配置依賴中將

Spring中的Commons-Logging取消依賴,如下操作:

 <dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-core/<artifactid>
<version>${springframework}/<version>
<exclusions>
<exclusion>
<groupid>commons-logging/<groupid>
<artifactid>commons-logging/<artifactid>
/<exclusion>
/<exclusions>
/<dependency>

第二步:配置 Slf4j 需要的依賴:(選用“1.7.25”版本)

 
<dependency>
<groupid>org.slf4j/<groupid>
<artifactid>slf4j-api/<artifactid>
<version>${slf4j}/<version>

/<dependency>
<dependency>
<groupid>org.slf4j/<groupid>
<artifactid>jcl-over-slf4j/<artifactid>
<version>${slf4j}/<version>
<scope>runtime/<scope>
/<dependency>

slf4j-api : Slf4j的核心包,只有日誌的接口,並沒有實現。

jcl-over-slf4j : 橋接器,將JCL的日誌輸出重定向到Slf4j中。

第三步:配置 log4j2 需要的依賴:(選用“2.8.2”版本)

 
<dependency>
<groupid>org.apache.logging.log4j/<groupid>
<artifactid>log4j-core/<artifactid>
<version>${log4j2}/<version>
<scope>runtime/<scope>
/<dependency>
<dependency>
<groupid>org.apache.logging.log4j/<groupid>
<artifactid>log4j-web/<artifactid>
<version>${log4j2}/<version>
<scope>runtime/<scope>
/<dependency>
<dependency>
<groupid>org.apache.logging.log4j/<groupid>
<artifactid>log4j-api/<artifactid>
<version>${log4j2}/<version>
<scope>runtime/<scope>
/<dependency>
<dependency>
<groupid>org.apache.logging.log4j/<groupid>

<artifactid>log4j-slf4j-impl/<artifactid>
<version>${log4j2}/<version>
<scope>runtime/<scope>
/<dependency>

log4j-slf4j-impl : 將log4j2 和 slf4j進行綁定。

編寫Log4j2 日誌配置文件

  1. 配置文件格式及讀取優先級:
  2. Log4j2 配置文件後綴要求為".xml"、".json"或者".jsn"。
  3. 系統選擇配置文件的優先級為(從先到後):
  4. (1).classpath下的名為log4j2-test.json 或者log4j2-test.jsn的文件.
  5. (2).classpath下的名為log4j2-test.xml的文件.
  6. (3).classpath下名為log4j2.json 或者log4j2.jsn的文件.
  7. (4).classpath下名為log4j2.xml的文件.
  8. (5).如果classpath下沒有相關配置文件,則使用默認日誌系統.
  9. 詳細配置文件解析:
  10. 要點介紹 :
  11. 日誌的級別: ALL< Trace < DEBUG < INFO < WARN < ERROR < FATAL < OFF。
  12. Properties 模塊 : 配置一些全局的屬性值。
  13. Appenders 模塊 :日誌輸出相關配置。
  14. Loggers 模塊 : 只有定義了Logger並根據Appender的name屬性引入其中,Appender才會生效。


<configuration>
<properties>

<property>/root/bubble/logs/<property>
<property>/root/bubble/logs/<property>
/<properties>
<appenders>

<console>

<thresholdfilter> onMismatch="DENY" />

<patternlayout> pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{36}:%L [%t] - %msg%n" />
/<patternlayout>/<thresholdfilter>/<console>

<rollingfile> filePattern="${LOG_HOME}/$${date:yyyy-MM}/search-%d{yyyy-MM-dd}-%i.log">
<thresholdfilter> onMismatch="DENY" />
<patternlayout> pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{36}:%L [%t] - %msg%n" />

<policies>


<timebasedtriggeringpolicy> modulate="true" />

<sizebasedtriggeringpolicy>
/<timebasedtriggeringpolicy>/<policies>

<defaultrolloverstrategy>
/<patternlayout>/<thresholdfilter>/<rollingfile>
<rollingfile> fileName="${ERROR_LOG_FILE_NAME}/search-error.log"
filePattern="${ERROR_LOG_FILE_NAME}/$${date:yyyy-MM}/search-error-%d{yyyy-MM-dd}.log">
<thresholdfilter> onMismatch="DENY" />
<patternlayout> pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{36}:%L [%t] - %msg%n" />
<policies>
<timebasedtriggeringpolicy> modulate="true" />
/<timebasedtriggeringpolicy>/<policies>
<defaultrolloverstrategy>
/<patternlayout>/<thresholdfilter>/<rollingfile>
/<appenders>

<loggers>

<logger>


<root>

<appender-ref>
<appender-ref>
<appender-ref>
/<root>
/<loggers>
/<configuration>

測試

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger logger = LoggerFactory.getLogger(Test.class);

....
logger.info("fastjson parse error, the json msg is {}", tempStr);


分享到:


相關文章: