在搭建開發框架的時候,看了Springboot官方文檔推薦使用Logback和log4j2作日誌的輸出,最終選擇了log4j2html
本文解決如下問題: java
目前有關日誌的開源代碼不少,如log4j、sl4j和log4j2,爲何我選擇使用log4j2呢,看完下面兩篇性能的對比,相信你也會選擇log4j2
http://www.jianshu.com/p/483a9cf61c36
https://blog.souche.com/logback-log4j-log4j2shi-ce/?utm_source=tuicool&utm_medium=referrallinux
須要將springboot內置的日誌剃掉,而後引入log4j2,pom以下web
<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中配置 spring
logging.level.root=error
控制檯打印結果apache
固然了,使用配置文件,配置能夠多樣化,下面是默認的log4j2配置,log4j2支持xml、json、yml格式的配置json
<?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裏的nametomcat
Console 控制檯日誌springboot
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>
輸出結果以下: