引言
日志是我们在软件开发过程中非常重要的一个组成部分,它能够记录系统运行时的各种信息和异常,方便我们在需要的时候进行排查和调试。而Log4j2是目前最为流行的Java日志框架之一,它提供了丰富的日志输出方式和配置选项,可以满足各种不同场景下的需求,一般运行程序都会在控制台输出日志,并保存日志文件;这里我简单演示一下如何使用log4j2将日志持久化为日志文件。
项目环境:
- spring boot
- 日志框架log4j2
Log4j2介绍
Log4j2是Apache SoftwareFoundation基金会的一个开源项目,它是Log4j的升级版本,相比于Log4j,Log4j2提供了更快的日志输出速度、更低的内存占用以及更加丰富的配置选项。Log4j2支持多种不同的日志级别(如DEBUG、INFO、WARN、ERROR、FATAL)和多种不同的日志输出方式(如控制台输出、文件输出、数据库输出等),可以根据需要选择不同的输出方式和级别。此外,Log4j2还支持异步日志记录、插件机制和动态配置等高级特性。
与Logback相比,Log4j2有许多优势。以下是Log4j2的一些主要优势:
- 高性能:Log4j2在日志输出方面具有非常高的性能。
- 灵活性:Log4j2提供了许多配置选项,可以灵活地配置日志记录器。
- 插件支持:Log4j2支持许多插件,可以扩展其功能。
- 异步日志记录:Log4j2支持异步记录,可以提高应用程序的性能。
- 配置简单:Log4j2的配置非常简单易懂。
日志配置
首先要对pom.xml配置文件进行修改:
去除springboot的默认日志配置,在start和web依赖上进行修改:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<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</artifactId>
<exclusions>
<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>
然后在resources文件下创建日志配置文件,可以使用yml格式或者xml格式,这里使用xml格式:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="fatal">
<!--打印在本地,根据具体存储地址填写-->
<Properties>
<Property name="baseDir" value="logs"/>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
<ThresholdFilter level="info" onMatch="ACCEPT"
onMismatch="DENY"/>
<!--disableAnsi可以启用控制台日志输出颜色-->
<PatternLayout
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight{%6p} %style{%5pid}{bright,magenta} --- [%15.15t] %style{%-40.40logger{39}}{bright,cyan}: %m%n"
disableAnsi="false"/>
</Console>
<!-- info级别日志文件输出 -->
<RollingFile name="InfoAppender" fileName="${baseDir}/info.log"
filePattern="${baseDir}/$${date:yyyy-MM-dd}/info_%i.%d{yyyy-MM-dd-HH}.log" append="true">
<!-- 过滤器 -->
<Filters>
<!-- 限制日志级别在info及以上在error以下 -->
<ThresholdFilter level="info"/>
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<!-- 日志格式 -->
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<!-- 策略 -->
<Policies>
<!-- 每隔一天转存 -->
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<!-- 文件大小 -->
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始自动清理-->
<DefaultRolloverStrategy max="10">
<Delete basePath="${baseDir}/$${date:yyyy-MM-dd}/" maxDepth="2">
<IfFileName glob="*/*.log" />
<!--7天-->
<IfLastModified age="168H" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<!-- error级别日志文件输出 -->
<RollingFile name="ErrorAppender" fileName="${baseDir}/error.log"
filePattern="${baseDir}/$${date:yyyy-MM-dd}/error_%i.%d{yyyy-MM-dd-HH}.log" append="true">
<Filters>
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<DefaultRolloverStrategy max="10">
<Delete basePath="${baseDir}/$${date:yyyy-MM-dd}/" maxDepth="2">
<IfFileName glob="*/*.log" />
<!--7天-->
<IfLastModified age="168H" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<!-- debug级别日志文件输出 -->
<RollingFile name="DebugAppender" fileName="${baseDir}/debug.log"
filePattern="${baseDir}/$${date:yyyy-MM-dd}/debug_%i.%d{yyyy-MM-dd-HH}.log" append="true">
<Filters>
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<DefaultRolloverStrategy max="10">
<Delete basePath="${baseDir}/$${date:yyyy-MM-dd}/" maxDepth="2">
<IfFileName glob="*/*.log" />
<!--7天-->
<IfLastModified age="168H" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<!--异步appender-->
<Async name="AsyncAppender" includeLocation="true">
<AppenderRef ref="ErrorAppender"/>
<AppenderRef ref="InfoAppender"/>
<AppenderRef ref="DebugAppender"/>
</Async>
</Appenders>
<Loggers>
<logger name="org.springframework" level="INFO">
</logger>
<logger name="org.mybatis" level="INFO">
</logger>
<Root level="debug" includeLocation="true">
<AppenderRef ref="Console"/>
<AppenderRef ref="AsyncAppender"/>
</Root>
</Loggers>
</Configuration>
这是我的配置,里面也写了部分注释,具体参数网上搜都有,这个日志文件仔细看看不难;
然后application.yml配置文件中引入该日志配置:
这就完成了log4j2日志框架的引入;
启动测试一下:
控制台输出正常
生成的日志文件:
error.log
info.log
debug.log
这就完成了基本配置,后期可以根据实际情况进行灵活更改;
总结
Log4j2是一个功能强大的日志框架,它可以帮助我们轻松地记录和管理应用程序的日志信息。在Spring Boot应用程序中使用Log4j2也非常简单,只需要在项目中添加Log4j2的依赖和配置文件,然后在代码中使用Logger对象输出日志即可。
在实际开发中,我们可以根据自己的需要定制Log4j2的日志输出格式和级别,以满足不同的需求。同时,我们也需要注意日志输出的性能问题,避免在高并发场景下过多地输出日志信息,从而影响应用程序的性能。