代码易写,bug难改。相信很多从事Java开发的码友们都遇到过各种各样的线上bug,而解决bug依靠的就是珍贵的log信息。本文将着重讲解SpringBoot中整合Log4j2,同时也会做一些日志框架之间的横向对比,再也不用担心“log用时方恨少”的情况了。
这里引用网上对相关日志框架性能测评结果:
对比结果显而易见,原文在这里
对应的英文为Simple Logging Facade,是存取日志的标准接口,真正记录日志的功能由具体的日志框架去实现,比如java.util.logging, logback, log4j,slf4j-simple等。
常见简单日志门面:jcl,slf4j
常见日志实现类框架:log4j,logback,jul(java.util.logging)
从软件设计上来说,是遵循解耦合的原则和适应灵活多变的市场需求,达到以不变应万变的效果。日志门面模式的原型在23种设计模式中对应的是外观模式:该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。
可以抽象的将日志门面理解为应用程序与日志框架之间的中间件,起到解耦合的作用,无论日志框架怎么变更,都不会影响到应用程序的正常运行。
slf4j的本质就是门面服务,定义了一套通用的标准接口,并非真正实现了日志的输出功能,具体的实现框架可以使用Log4j、logback、Log4j2等。
而我们作为Java攻城狮,个人比较推荐的方案就是slf4j + log4j,前者是个优秀的通用的API集合,屏蔽各个日志框架之间的差异性。后者(log4j/log4j2)的性能表现上文可见那是相当的厉害啊,傲视群雄啊…因此,我们在项目当中,可不要再引用什么log4j、JUL等相关API了,直接换用日志门面的通用API,以后哪怕换日志框架,也不会对系统造成很大的影响。
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-loggingartifactId>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-log4j2artifactId>
dependency>
<configuration status="info">
<Properties>
<property name="LOG_INFO_STYLE" value="[timi:] %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n" />
<property name="FILE_PATH" value="/Users/zhengwei/Documents/SpringBoot/log-file/logs" />
<property name="FILE_NAME" value="demo-log" />
Properties>
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_INFO_STYLE}"/>
Console>
<RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/${FILE_NAME}-info.log"
filePattern="${FILE_PATH}/${FILE_NAME}-info-%d{yyyy-MM-dd}_%i.log.gz">
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_INFO_STYLE}"/>
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="12"/>
<SizeBasedTriggeringPolicy size="500MB" />
Policies>
<DefaultRolloverStrategy max="20" />
RollingFile>
<RollingFile name="RollingFileError" fileName="${FILE_PATH}/${FILE_NAME}-error.log"
filePattern="${FILE_PATH}/${FILE_NAME}-error-%d{yyyy-MM-dd}_%i.log.gz">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_INFO_STYLE}"/>
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="12"/>
<SizeBasedTriggeringPolicy size="200MB" />
Policies>
<DefaultRolloverStrategy max="10" />
RollingFile>
<RollingFile name="RollingFileSql" fileName="${FILE_PATH}/${FILE_NAME}-sql.log"
filePattern="${FILE_PATH}/${FILE_NAME}-sql-%d{yyyy-MM-dd}_%i.log.gz">
<PatternLayout pattern="${LOG_INFO_STYLE}"/>
<Policies>
<SizeBasedTriggeringPolicy size="500MB"/>
<TimeBasedTriggeringPolicy modulate="true" interval="12"/>
Policies>
RollingFile>
appenders>
<loggers>
<root level="info">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileError"/>
root>
<logger name="com.example.demo.helloworld.dao" level="debug" additivity="false">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileSql"/>
logger>
loggers>
configuration>
注:该配置文件生成的log分为三类(可以自行添加分类):info级别、error级别、SQL日志。可以根据需求自行调整。
log4j2的配置文件结构:
<Configuratio 自定义属性....>
<Properties>
<property ..../>
Properties>
<Appenders>
<Console ....>
....
Console>
<RollingFile ....>
....
RollingFile>
Appenders>
<loggers>
<root ....>
....
root>
<logger ....>
....
logger>
loggers>
Configuration>
参数 | 含义 |
---|---|
status | 指定log4j2内部日志的输出级别 |
monitorInterval | 指定log4j2自动重新检查配置文件的间隔时间,单位:s |
package | 定义log4j2插件的类所在的包名 |
参数 | 含义 |
---|---|
property | 定义固定格式参数信息 |
参数 | 含义 |
---|---|
name | 定义Appender的名称 |
target | 默认SYSTEM_OUT,也可修改为SYSTEM_ERR |
参数 | 含义 |
---|---|
name | 定义Appender的名称 |
fileName | 输出日志全路径的文件名 |
参数 | 含义 |
---|---|
name | 定义Appender的名称 |
fileName | 输出日志全路径的文件名 |
filePattern | 指定发生滚动后的旧日志归档名称,可以定义为压缩文件格式 |
注:这三个节点都有一个共同子节点
4. Loggers:有两个子节点:logger、root
参数 | 含义 |
---|---|
level | 定义日志的8个输出级别 |
AppenderRef | root的一个子节点,指定日志器输出到哪个Appender |
参数 | 含义 |
---|---|
level | 定义日志的8个输出级别 |
AppenderRef | root的一个子节点,指定日志器输出到哪个Appender |
name | 指定Logger的名称,通常为类全名或类所在的包名,使用Logger时会根据这个名称来查找 |
总的来说,整合log4j2日志系统的流程还是相当简单的,在后续的文章中会介绍整合ELK的教程,欢迎大家继续关注,也希望大家多多指点,一起进步…
参考文章:https://www.cnblogs.com/qq771490826/articles/7991706.html
官方文档:https://docs.spring.io/spring-boot/docs/2.0.1.RELEASE/reference/htmlsingle/#boot-features-custom-log-configuration
源码地址:https://github.com/zheng-weiwei/public/tree/master/springboot-log4j2