最近調(diào)試代碼和運(yùn)行代碼的時(shí)候,一些日志打印的亂七八槽懊蒸,根據(jù)日志很難快速定位到問(wèn)題,感覺(jué)自己是為了打印日志而打印日志悯搔,花了點(diǎn)時(shí)間把日志的相關(guān)整理了一下骑丸,意在讓日志發(fā)揮最大的作用。
前言
本文解決以下問(wèn)題:
- 為何使用log4j2
- springboot下log4j2日志的使用
- 控制臺(tái)日志顯示的級(jí)別和文件保存的日志不同
- idea控制臺(tái)顏色日志的輸出
正文
log4j2
目前有關(guān)日志的開(kāi)源代碼很多,如log4j通危、sl4j和log4j2,為什么我選擇使用log4j2呢铸豁,看完下面兩篇性能的對(duì)比,相信你也會(huì)選擇log4j2
http://www.reibang.com/p/483a9cf61c36
https://blog.souche.com/logback-log4j-log4j2shi-ce/?utm_source=tuicool&utm_medium=referral
springboot集成Log4j2
需要將springboot內(nèi)置的日志剃掉,然后引入log4j2菊碟,pom如下
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
然后需要在resource下面添加log4j2.xml配置文件节芥,當(dāng)然了如果你不添加,springboo會(huì)提示你沒(méi)有對(duì)應(yīng)文件逆害,并使用默認(rèn)的配置文件藏古,這個(gè)時(shí)候級(jí)別可以在application.properties中配置
logging.level.root=error
控制臺(tái)打印結(jié)果
當(dāng)然了,使用配置文件忍燥,配置可以多樣化,下面是默認(rèn)的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>
主要結(jié)構(gòu)梅垄,和我們用到的大致如下
appenders里設(shè)置日志的輸出方式、級(jí)別和格式
loggers里設(shè)置全局的級(jí)別和綁定appenders里的name
File 日志輸出到文件输玷,可配置覆蓋還是追加
RollingFile “滾動(dòng)文件”可作為按日輸出日志的方式
Console 控制臺(tái)日志
PatternLayout 格式化輸出日志
ThresholdFilter“閾值篩選器” 可單獨(dú)設(shè)置appender的輸出級(jí)別
loggers里需要匹配每個(gè)appender的名稱 name
詳細(xì)參見(jiàn)官網(wǎng):https://logging.apache.org/log4j/2.x/manual/configuration.html#AutomaticConfiguration
稍復(fù)雜的需求
我的服務(wù)一般放在linux服務(wù)器上跑队丝,可能要實(shí)時(shí)查看日志,現(xiàn)有這個(gè)需求“我要打印到控制臺(tái)的日志級(jí)別為Error欲鹏,日志文件里保存的是INFO級(jí)別的日志”這樣在產(chǎn)生錯(cuò)誤的時(shí)候机久,就不會(huì)被大量無(wú)用的代碼干擾。
要使用ThresholdFilter赔嚎,配置如下
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<!--控制臺(tái)只輸出level及以上級(jí)別的信息(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>
<!--這個(gè)會(huì)打印出所有的信息,每次大小超過(guò)size尤误,則這size大小的日志會(huì)自動(dòng)存入按年份-月份建立的文件夾下面并進(jìn)行壓縮侠畔,作為存檔-->
<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>
不要被嚇到了,按照我上面的思維導(dǎo)圖分析一下就很清晰了:
三個(gè)appender:Console损晤、File软棺、RollingFile
- Console 通過(guò)ThresholdFilter過(guò)濾規(guī)則只輸出ERROR級(jí)別的錯(cuò)誤(onMatch="ACCEPT" onMismatch="DENY" 匹配到的接受,沒(méi)有匹配的走人)
- File 也通過(guò)ThresholdFilter的方式輸出到日志尤勋,當(dāng)然了append="false" 會(huì)在服務(wù)每次啟動(dòng)的時(shí)候清空日志(覆蓋)
- RollingFile 因?yàn)槿罩救衷O(shè)置的為INFO喘落,所以不需要ThresholdFilter,這里只需要指定filePattern和SizeBasedTriggeringPolicy就行了
執(zhí)行代碼,查看各文件和控制臺(tái)
完美~
控制臺(tái)顏色輸出日志
注:本人使用的是IDEA最冰,沒(méi)有使用Eclipse瘦棋,可能Eclipse也有類似的插件。
本地開(kāi)發(fā)與調(diào)試代碼的時(shí)候锌奴,會(huì)不會(huì)感覺(jué)同樣的顏色找日志頭都大了兽狭,別擔(dān)心,idea知道你頭會(huì)大,所以提供了一個(gè)插件Grep Console,讓你頭慢慢的小下來(lái)~下載并重啟后箕慧,這里需要注意將插件默認(rèn)的配色關(guān)閉服球,當(dāng)然了你可以通過(guò)自定義配色,我這里是在xml配置的
然后log4j2.xml配置的如下
...
<Console name="Console" target="SYSTEM_OUT">
<!--控制臺(tái)只輸出level及以上級(jí)別的信息(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>
...
結(jié)果
相當(dāng)完美~
后記
相信有了明確的日志輸出斩熊,能提高我們排錯(cuò)的效率,當(dāng)別人看日志累的揉眼睛的時(shí)候伐庭,我們?cè)缫押戎杷矍鑯
代碼在這里
歡迎瀏覽我的博客:http://vector4wang.tk