1. 程式人生 > >springboot使用log4j輸出

springboot使用log4j輸出

參考連結:springboot日誌體系---log4j2

前言

在搭建開發框架的時候,看了Springboot官方文件推薦使用Logback和log4j2做日誌的輸出,最終選擇了log4j2

本文解決以下問題: 

  • - 為何使用log4j2 
  • - springboot下log4j2日誌的使用 
  • - 控制檯日誌顯示的級別和檔案儲存的日誌不同 
  • - idea控制檯顏色日誌的輸出
  • - 輸出mybastis的SQL
  • - console file rolling-file使用不同的策略

正文

log4j2

  目前有關日誌的開原始碼很多,如log4j、sl4j和log4j2,為什麼我選擇使用log4j2呢,看完下面兩篇效能的對比,相信你也會選擇log4j2 
http://www.jianshu.com/p/483a9cf61c36 
https://blog.souche.com/logback-log4j-log4j2shi-ce/?utm_source=tuicool&utm_medium=referral

springboot整合Log4j2

需要將springboot內建的日誌剃掉,然後引入log4j2,pom如下

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <!-- 這一部分是Springboot啟動不使用tomcat應用伺服器,和本次log4j2的配置無關 -->
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
        <!-- 移除Springboot預設的日誌框架 -->
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- 加入log4j2的日誌框架 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

然後需要在resource下面新增log4j2.xml配置檔案,當然瞭如果你不新增,springboo會提示你沒有對應檔案,並使用預設的配置檔案,這個時候級別可以在application.properties中配置 

logging.level.root=error 
控制檯列印結果

當然了,使用配置檔案,配置可以多樣化,下面是預設的log4j2配置,log4j2支援xml、json、yml格式的配置

<?xml version="1.0" encoding="UTF-8"?>  
<configuration status="OFF">  
  <appenders>  
    <Console name="Console" target="SYSTEM_OUT">  
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>  
    </Console>  
  </appenders>  
  <loggers>  
    <root level="error">  
      <appender-ref ref="Console"/>  
    </root>  
  </loggers>  
</configuration>  

主要結構,和我們用到的大致如下 

appenders裡設定日誌的輸出方式、級別和格式 
loggers裡設定全域性的級別和繫結appenders裡的name

  • File 日誌輸出到檔案,可配置覆蓋還是追加
  • RollingFile “滾動檔案”可作為按日輸出日誌的方式
  • Console 控制檯日誌

  • PatternLayout 格式化輸出日誌

  • ThresholdFilter“閾值篩選器” 可單獨設定appender的輸出級別

  • loggers裡需要匹配每個appender的名稱 name

詳細參見官網:https://logging.apache.org/log4j/2.x/manual/configuration.html#AutomaticConfiguration

稍複雜的需求

  我的服務一般放在linux伺服器上跑,可能要實時檢視日誌,現有這個需求“我要列印到控制檯的日誌級別為Error,日誌檔案裡儲存的是INFO級別的日誌”這樣在產生錯誤的時候,就不會被大量無用的程式碼干擾。 
要使用ThresholdFilter,配置如下

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <!--控制檯只輸出level及以上級別的資訊(onMatch),其他的直接拒絕(onMismatch)-->
            <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %M() @%L - %msg%n"/>
        </Console>
        <File name="ERROR" fileName="logs/error.log" append="false">
            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %M() @%L - %msg%n"/>
        </File>
        <!--這個會打印出所有的資訊,每次大小超過size,則這size大小的日誌會自動存入按年份-月份建立的資料夾下面並進行壓縮,作為存檔-->
        <RollingFile name="RollingFile" fileName="logs/app.log"
                     filePattern="log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %M() @%L - %msg%n"/>
            <SizeBasedTriggeringPolicy size="5MB"/>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="INFO">
            <appender-ref ref="ERROR" />
            <appender-ref ref="RollingFile"/>
            <appender-ref ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

不要被嚇到了,按照上面的思維導圖分析一下就很清晰了: 
三個appender:Console、File、RollingFile 
- Console 通過ThresholdFilter過濾規則只輸出ERROR級別的錯誤(onMatch=”ACCEPT” onMismatch=”DENY” 匹配到的接受,沒有匹配的走人) 
- File 也通過ThresholdFilter的方式輸出到日誌,當然了append=”false” 會在服務每次啟動的時候清空日誌(覆蓋) 
- RollingFile 因為日誌全域性設定的為INFO,所以不需要ThresholdFilter,這裡只需要指定filePattern和SizeBasedTriggeringPolicy就行了

執行程式碼,檢視各檔案和控制檯 

注:走到這一步發現啟動Springboot就答應了一個banner,因為Console這個deppender是定位的ERROR級別,只需要將ERROR改成DEBUG或者INFO級別(但是生產環境恢復到ERROR)

控制檯顏色輸出日誌

注:本人使用的是IDEA,沒有使用Eclipse,可能Eclipse也有類似的外掛。 
  本地開發與除錯程式碼的時候,會不會感覺同樣的顏色找日誌頭都大了,別擔心,idea知道你頭會大,所以提供了一個外掛Grep Console,讓你頭慢慢的小下來~下載並重啟後,這裡需要注意將外掛預設的配色關閉,當然了你可以通過自定義配色,我這裡是在xml配置的 

然後log4j2.xml配置的如下

...
<Console name="Console" target="SYSTEM_OUT">
            <!--控制檯只輸出level及以上級別的資訊(onMatch),其他的直接拒絕(onMismatch)-->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="%highlight{%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %M() @%L - %msg%n}{FATAL=Bright Red, ERROR=Bright Magenta, WARN=Bright Yellow, INFO=Bright Green, DEBUG=Bright Cyan, TRACE=Bright White}"/>
        </Console>
...

在程式碼中使用Logger

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

@RequestMapping("/http")
@RestController
public class HttpController {
 private static Logger logger = LogManager.getLogger(HttpController.class);
 .....
}

結果 

 

輸出Mybatis的SQL

在圖中位置增加如下配置

        <logger name="com" level="DEBUG" additivity="false">
            <appender-ref ref="Console"/>
        </logger>

輸出結果如下: