前言
Log4j 2是Log4j的升級版屬於新一代日誌框架,它基於LMAX公司開發的Disruptor(一個開源的無鎖併發框架),改善了Log4j和Logback在架構設計方面的缺陷,具有超高的吞吐量和低延遲,性能比Log4j1.x和Logback高10倍以上。 另外,它還支持自定義日誌的輸出方式,比如,將文件以json格式輸出,支持輸出到socket或者kafka等。
這麼好的東西,當然要趕緊用起來呀,下面就來看一下具體用法吧。
詳細配置
pom配置
pom.xml文件中需要排除其他日誌框架依賴,同時引入log4j2所需的依賴(spring-boot-starter-log4j2,disruptor,jackson-databind)。示例代碼如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.lixk</groupId>
<artifactId>log4j2-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>log4j2-demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!--使用log4j2,一定要排除其他日誌依賴-->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--引入log4j2所需的依賴(spring-boot-starter-log4j2,disruptor,jackson-databind)-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
log4j2.xml配置
在資源文件夾resources
下創建log4j2.xml
文件,文件內容如下
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<properties>
<!--日誌輸出位置-->
<property name="LOG_HOME">./logs</property>
</properties>
<Appenders>
<!--*********************控制檯日誌***********************-->
<Console name="consoleAppender" target="SYSTEM_OUT">
<!--設置日誌格式及顏色-->
<PatternLayout
pattern="[%style{%d}{bright,green}][%highlight{%p}][%style{%t}{bright,blue}][%style{%C}{bright,yellow}]: %msg%n%style{%throwable}{red}"
disableAnsi="false" noConsoleNoAnsi="false"/>
</Console>
<!--*********************文件日誌***********************-->
<RollingFile name="fileAppender"
fileName="${LOG_HOME}/log4j2-demo.log"
filePattern="${LOG_HOME}/log4j2-demo-%d{yyyy-MM-dd}-%i.log">
<!--設置日誌格式-->
<PatternLayout>
<pattern>[%d][%p][%t][%C] %m%n</pattern>
</PatternLayout>
<Policies>
<!-- 設置日誌文件切分參數 -->
<SizeBasedTriggeringPolicy size="100 MB"/>
<TimeBasedTriggeringPolicy/>
</Policies>
<!--設置最大存檔數-->
<DefaultRolloverStrategy max="20"/>
</RollingFile>
</Appenders>
<Loggers>
<!-- 根日誌設置 -->
<Root level="debug">
<AppenderRef ref="consoleAppender" level="debug"/>
<AppenderRef ref="fileAppender" level="info"/>
</Root>
<!--spring日誌-->
<Logger name="org.springframework" level="info"/>
<!--druid數據源日誌-->
<Logger name="druid.sql.Statement" level="warn"/>
<!-- mybatis日誌 -->
<Logger name="com.mybatis" level="warn"/>
</Loggers>
</Configuration>
運行效果
另外,如果想實現不同級別的日誌輸出到不同的文件,或者分目錄壓縮存檔等功能,可以參考以下log4j2.xml
配置
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<properties>
<property name="LOG_HOME">./logs</property>
</properties>
<Appenders>
<!--*********************控制檯日誌***********************-->
<Console name="consoleAppender" target="SYSTEM_OUT">
<!--設置日誌格式及顏色-->
<PatternLayout
pattern="%style{%d{ISO8601}}{bright,green} %highlight{%-5level} [%style{%t}{bright,blue}] %style{%C{1.}}{bright,yellow}: %msg%n%style{%throwable}{red}"
disableAnsi="false" noConsoleNoAnsi="false"/>
</Console>
<!--*********************文件日誌***********************-->
<!--debug級別日誌-->
<RollingFile name="debugFileAppender"
fileName="${LOG_HOME}/debug.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/debug-%d{yyyy-MM-dd}-%i.log.gz">
<Filters>
<!--過濾掉info及更高級別日誌-->
<ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<!--設置日誌格式-->
<PatternLayout>
<pattern>%d %p %C{1.} [%t] %m%n</pattern>
</PatternLayout>
<Policies>
<!-- 設置日誌文件切分參數 -->
<!--<OnStartupTriggeringPolicy/>-->
<SizeBasedTriggeringPolicy size="10 MB"/>
<TimeBasedTriggeringPolicy/>
</Policies>
</RollingFile>
<!--info級別日誌-->
<RollingFile name="infoFileAppender"
fileName="${LOG_HOME}/info.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz">
<Filters>
<!--過濾掉warn及更高級別日誌-->
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<!--設置日誌格式-->
<PatternLayout>
<pattern>%d %p %C{1.} [%t] %m%n</pattern>
</PatternLayout>
<Policies>
<!-- 設置日誌文件切分參數 -->
<!--<OnStartupTriggeringPolicy/>-->
<SizeBasedTriggeringPolicy size="10 MB"/>
<TimeBasedTriggeringPolicy/>
</Policies>
</RollingFile>
<!--warn級別日誌-->
<RollingFile name="warnFileAppender"
fileName="${LOG_HOME}/warn.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log.gz">
<Filters>
<!--過濾掉error及更高級別日誌-->
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<!--設置日誌格式-->
<PatternLayout>
<pattern>%d %p %C{1.} [%t] %m%n</pattern>
</PatternLayout>
<Policies>
<!-- 設置日誌文件切分參數 -->
<!--<OnStartupTriggeringPolicy/>-->
<SizeBasedTriggeringPolicy size="10 MB"/>
<TimeBasedTriggeringPolicy/>
</Policies>
</RollingFile>
<!--error及更高級別日誌-->
<RollingFile name="errorFileAppender"
fileName="${LOG_HOME}/error.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz">
<!--設置日誌格式-->
<PatternLayout>
<pattern>%d %p %C{1.} [%t] %m%n</pattern>
</PatternLayout>
<Policies>
<!-- 設置日誌文件切分參數 -->
<!--<OnStartupTriggeringPolicy/>-->
<SizeBasedTriggeringPolicy size="10 MB"/>
<TimeBasedTriggeringPolicy/>
</Policies>
</RollingFile>
<!--json格式error級別日誌-->
<RollingFile name="errorJsonAppender"
fileName="${LOG_HOME}/error-json.log"
filePattern="${LOG_HOME}/error-json-%d{yyyy-MM-dd}-%i.log.gz">
<JSONLayout compact="true" eventEol="true" locationInfo="true"/>
<Policies>
<SizeBasedTriggeringPolicy size="10 MB"/>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<!-- 根日誌設置 -->
<Root level="debug">
<AppenderRef ref="consoleAppender" level="info"/>
<AppenderRef ref="debugFileAppender" level="debug"/>
<AppenderRef ref="infoFileAppender" level="info"/>
<AppenderRef ref="warnFileAppender" level="warn"/>
<AppenderRef ref="errorFileAppender" level="error"/>
<AppenderRef ref="errorJsonAppender" level="error"/>
</Root>
<!--spring日誌-->
<Logger name="org.springframework" level="info"/>
<!--druid數據源日誌-->
<Logger name="druid.sql.Statement" level="warn"/>
<!-- mybatis日誌 -->
<Logger name="com.mybatis" level="warn"/>
</Loggers>
</Configuration>
備註
配置成功之後看起來挺簡單,但是,在配置的過程中真是踩了不少坑。比如,控制檯打印的日誌怎麼配上顏色,網上找了好多,都不行,可能我用的版本太新了吧。Spring官網有個可行的方案,但是要指定環境變量,不喜歡這種方式。然後,通過看源碼發現,在配置文件的PatternLayout標籤裏指定disableAnsi="false" noConsoleNoAnsi="false"
這兩個參數即可。。。
其他的,像日誌切分策略,備份策略,過濾器,json格式日誌輸出到kafka等都花費了一些時間,使用中有問題的話歡迎一起交流。
參考文檔:
- Apache官網:http://logging.apache.org/log4j/2.x/manual/configuration.html
- 《Logging in Spring Boot》:https://www.baeldung.com/spring-boot-logging
- 《Intro to Log4j2 – Appenders, Layouts and Filters》:https://www.baeldung.com/log4j2-appenders-layouts-filters