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等都花费了一些时间,使用中有问题的话欢迎一起交流。

参考文档:

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