1. 程式人生 > >slf4j+log4j2的整合配置

slf4j+log4j2的整合配置

Log4j 2是log4j 1.x和logback的改進版,據說採用了一些新技術(無鎖非同步、等等),使得日誌的吞吐量、效能比log4j 1.x提高10倍,並解決了一些死鎖的bug,而且配置更加簡單靈活。下面是結合slf4j的配置和使用過程:

1、引用依賴包及相關注釋:
  • 1
<!-- log配置:Log4j2 + Slf4j -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version
>
2.2</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.2</version> </dependency> <dependency> <!-- 橋接:告訴Slf4j使用Log4j2 --> <groupId>
org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.2</version> </dependency> <dependency> <!-- 橋接:告訴commons logging使用Log4j2 --> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-jcl</artifactId
>
<version>2.2</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.10</version> </dependency>
  • 26

**注:**log4j-api-2.x 和 log4j-core-2.x是必須的,其他包根據需要引入,如下圖所示:
這裡寫圖片描述

2、程式碼中使用:

@RunWith(SpringJUnit4ClassRunner.class)  //使用Spring Junit4進行測試  
@ContextConfiguration ({"classpath:spring/applicationContext.xml"}) //載入配置檔案
public abstract class BaseJunit4Test {
}

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
mport com.xjj.test.BaseJunit4Test; 
public class Log4j2Test extends BaseJunit4Test {
 static public Logger logger = LoggerFactory.getLogger(Log4j2Test.class); 

   @Test
   public void logTC1(){
      logger.error("error");
      logger.debug("debug");
      logger.info("info");
      logger.trace("trace");
      logger.warn("warn");
      logger.error("error {}", "param");
 }
}
  • 78101112131415161711920222

輸出結果:

16:19:28.779 [main] ERROR com.xjj.test.mytest.Log4j2Test - error
16:19:28.781 [main] ERROR com.xjj.test.mytest.Log4j2Test - error param
  • 1

注:如果沒有任何配置,Log4j2會使用預設配置:

root logger:ConsoleAppender
PatternLayout:"%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"
  • 1

級別:ERROR

在classpath中建立名字為log4j2.xml的配置檔案。

Configuration標籤中的常用元素說明:
monitorInterval:Log4j 2 定期檢查和應用配置檔案的時間間隔(單位:秒,如果更改配置檔案,不用重啟系統)。
status:Log4j內部事件記錄的等級,只對Log4j本身的事件有效。
strict:是否使用XML Schema來檢查配置檔案。
schema:Shema檔案的位置。
例子:

<Configuration status="warn" monitorInterval="30" strict="true" schema="Log4J-V2.2.xsd">
    ……
</Configuration>
  • 13

Loggers標籤說明:
它被用來配置LoggerConfig,包含一個root logger和若干個普通logger
普通必須有一個name元素,root logger不用name元素
每個logger可以指定一個level(TRACE, DEBUG, INFO, WARN, ERROR, ALL or OFF),不指定時level預設為ERROR
additivity指定是否同時輸出log到父類的appender,預設為true。(層級關係與Java包類似,例如:com.foo是com.foo.Bar的父級;java是java.util的父級,是java.util.vector的祖先。root是最頂層。)
每個logger可以包含若干個屬性:AppenderRef, Filter, Layout, 等
例子:

<Loggers>
    <Root level="warn"> <!-- 全域性配置 -->
         <AppenderRef ref="Console"/>
    </Root>

    <!-- 為某些包/類配置Log級別,這些logger繼承了root logger -->
    <Logger name="com.xjj.test" level="TRACE"/>
    <Logger name="com.xjj.test2" level="DEBUG" additivity="false">
         <AppenderRef ref="Console"/>
    </Logger>
</Loggers>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

Filters標籤說明:
與防火牆過濾的規則相似,log4j2的過濾器也將返回三類狀態:Accept(接受), Deny(拒絕) 或Neutral(中立)。其中,Accept意味著不用再呼叫其他過濾器了,這個LogEvent將被執行;Deny意味著馬上忽略這個event,並將此event的控制權交還給過濾器的呼叫者;Neutral則意味著這個event應該傳遞給別的過濾器,如果再沒有別的過濾器可以傳遞了,那麼就由現在這個過濾器來處理。

Appenders標籤說明:
Appender用來定義不同的輸出位置,可以是console、檔案、遠端socket伺服器、Apache Flume、JMS以及遠端 UNIX 系統日誌守護程序。一個Logger可以繫結多個不同的Appender。

Layout/PatternLayout:
定義log的格式(一種類似C語言printf函式的列印格式)。

配置例子和註解如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<!-- Log4j 2.x 配置檔案。每30秒自動檢查和應用配置檔案的更新; -->
<Configuration status="warn" monitorInterval="30" strict="true" schema="Log4J-V2.2.xsd">
    <Appenders>
           <!-- 輸出到控制檯 -->
           <Console name="Console" target="SYSTEM_OUT">
               <!-- 需要記錄的級別 -->
               <!-- <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY" /> -->
               <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%F:%L) - %m%n" />
          </Console>

          <!-- 輸出到檔案,按天或者超過80MB分割 -->
          <RollingFile name="RollingFile" fileName="../logs/xjj.log"    filePattern="../logs/$${date:yyyy-MM}/xjj-%d{yyyy-MM-dd}-%i.log.gz">
               <!-- 需要記錄的級別 -->
               <!-- <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" /> -->
               <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%F:%L) - %m%n" />
               <Policies>
                    <OnStartupTriggeringPolicy />
                    <TimeBasedTriggeringPolicy />
                    <SizeBasedTriggeringPolicy size="80 MB" />
               </Policies>
          </RollingFile>
     </Appenders>
     <Loggers>
          <Root level="info"> <!-- 全域性配置 -->
               <AppenderRef ref="Console" />
               <AppenderRef ref="RollingFile"/>
          </Root>
          <!-- 為sql語句配置特殊的Log級別,方便除錯 -->
          <Logger name="com.xjj.dao" level="${log.sql.level}" additivity="false">
               <AppenderRef ref="Console" />
          </Logger>
     </Loggers>
</Configuration>
  • 3

實際使用的例子(用slf4j介面):

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

private final static Logger logger = LoggerFactory.getLogger(MyClass.class);
try {
    ……
} catch (Exception e) {
    logger.error("發生了異常:", e);
}
logger.info("請求處理結束,耗時:{}毫秒", (System.currentTimeMillis() - beginTime));    //第一種用法
logger.info("請求處理結束,耗時:" + (System.currentTimeMillis() - beginTime)  + "毫秒");    //第二種用法
  • 2