Spring Boot集成Log4j2+顏色設置+按時間拆分

前言

Log4j 2Log4j的升級版屬於新一代日誌框架,它基於LMAX公司開發的Disruptor(一個開源的無鎖併發框架),改善了Log4jLogback在架構設計方面的缺陷,具有超高的吞吐量和低延遲,性能比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等都花費了一些時間,使用中有問題的話歡迎一起交流。

參考文檔:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章