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>
輸出結果如下: