Spring BootLogback和Log4j2集成与日志发展史

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring BootLogback和Log4j2集成与日志发展史相关的知识,希望对你有一定的参考价值。

一、简介

Java知名的日志有很多,比如:JUL、Log4j、JCL、SLF4J、Logback、Log4j2,那么这些日志框架之间有着怎样的关系?诞生的原因又是解决什么问题?下面一起来看。

## 1.1 JUL Java有自己的日志框架JUL(Java Util Logging)在java.util.logging下,因为对开发者不友好,使用成本太高和日志级别分类不清晰的问题,所有很少有开发者用。 ## 1.2 Log4j 因为JUL的缺陷问题,这就给了Log4j机会,所有Log4j一经推出就迅速风靡全球。 ## 1.3 JCL JCL是Jakarta Commons-Logging的缩写,Jakarta在这里指的是一个组织,而不是印度的首都雅加达,Jakarta,一个早期的Apache开源项目,用于管理各个Java子项目,诸如Tomcat, Ant, Maven, Struts, JMeter, Velocity, JMeter, Commons等。2011年12月,在所有子项目都被迁移为独立项目后,Jakarta名称就不再使用了。 JCL诞生的初衷是因为Java自身的一些包用了JUL,而Log4j用户使用的有很多,那么JCL就是提供一套API来实现不同Logger之间的切换。 ## 1.4 SLF4J SLF4J(Simple Logging Facade For Java)简单日志门面,和JCL功能类似,但JCL有一个致命的缺点就是算法复杂,出现问题难以排除,而SLF4J的诞生就是为了解决JCL的缺点。 值得一提的是SLF4J的作者就是Log4j的作者。 ## 1.5 Logback Logback是Log4j的作者的另一个开源日志组件,与Log4j相比,Logback重新了内核,使它的性能提升了很多,大约是Log4j的10倍,同时占用更小的内存,并且完整的实现了SLF4J API是你可以很方便的切换日志框架。 ## 1.6 Log4j2 Log4j2有着和Logback相同的功能,但又有自己单用的功能,比如:插件式结构、配置文件优化、异步日志等。 Log4j2是Log4j的升级,它比其前身Log4j 1.x提供了重大改进,并提供了Logback中可用的许多改进,同时修复了Logback架构中的一些固有问题。 从GitHub的更新日志来看,Logback已经有半年没有更新了,而作为知名组织的Apache下的Log4j2的更新却是非常活跃的,Log4j 1.x 于2015年8月停止维护更新了。 **GitHub地址** Logback:https://github.com/qos-ch/logback log4j2:https://github.com/apache/logging-log4j2 本文分别来看Logback和Log4j2在Spring Boot中的实现。 # 二、Logback使用 开发环境 - JDK 8 - Spring Boot 2.0.4 RELEASE - Maven - Windows 10 - IDEA 2018.2 ## 2.1 Logback的使用 Spring Boot默认集成了Logback,可以开箱即用,非常方便。因为spring-boot-starter-logging是Logback的日志实现,而Spring Boot启动项spring-boot-starter又依赖了spring-boot-starter-logging,所以Spring Boot就默认集成了Logback,包依赖如下图: ![](http://icdn.apigo.cn/blog/sb-logging-path.png?imageView2/0/w/500/h/300) 日志是默认控制台输出的,我们程序启动的时候就使用Logback,如下图所示: ![](http://icdn.apigo.cn/blog/springboot-log2.png) 日志组成解读: - 日期和时间:毫秒精度,易于排序 - 日志级别:trace、debug、info、warn、error(日志级别依次从低到高) - 进程ID - `---`分隔符 - 线程名称:括在方括号中(可以截断控制台输出) - 记录器名称:这通常是源类名(通常缩写) - 日志具体信息 ## 2.2 输入文件 如果需要输出日志到文件,只需要在application.properties配置文件设置:logging.file或logging.path,示例如下: ```xml logging.level.root=info logging.file=D:\log\my.log ``` 可以通过设置日志的级别,忽略更低级别的日志输出。 **注意:** logging.file和logging.path设置一个属性即可,如果两个都设置,则以logging.file为主,logging.path无效。 日志文件容量设置:使用“logging.file.max-history”属性为日志最大容量设置,默认10M超过则分割为多个文件。 ## 2.3 自定义日志配置 日志服务在ApplicationContext创建前就初始化了,所以通过设置属性和传统的配置XML文件,可以对日志进行管理和控制。 只需要在src/main/resources下,创建好约定名称的XML文件,即可完成对日志系统的设置,不同的日志系统有不同的约定名称,如下列表: | 日志 | 名称 | | ------- | ------------------------------------------------------------ | | logback | logback-spring.xml, logback-spring.groovy, logback.xml, 或者 logback.groovy | | log4j2 | log4j2-spring.xml 或者 log4j2.xml | Spring Boot官方建议使用“-spring”的命名规则,进行日志配置,如:logback-spring.xml而不是logback.xml。 当然你也可以自定义日志名称,只需要在application.properties配置即可,代码如下: > logging.config=classpath:logging-config.xml 来看一个logback-spring.xml示例文件: ```xml ${LOG_MSG} ${LOG_HOME}/all_${LOG_PREFIX}.log ${LOG_DIR}/all_${LOG_PREFIX}%i.log ${MAX_HISTORY} ${MAX_FILE_SIZE} ${LOG_MSG} ERROR DENY ACCEPT ${LOG_HOME}/err_${LOG_PREFIX}.log ${LOG_DIR}/err_${LOG_PREFIX}%i.log ${MAX_HISTORY} ${MAX_FILE_SIZE} ${LOG_MSG} ``` ## 2.4 代码中使用日志 在代码中使用日志,只需要使用如下代码: ```java private Logger logger = LoggerFactory.getLogger(this.getClass()); //... logger.debug("this is debug"); logger.info("this is info"); ``` # 三、Log4j2集成 ## 3.1 配置依赖组件 Spring Boot添加Log4j2依赖的同时,需要排除Logback依赖,配置pom.xml代码如下: ```xml org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-logging org.springframework.boot spring-boot-starter-log4j2 ``` ## 3.2 自定义日志配置 添加log4j2-spring.xml文件在src/main/resources文件下,配置文件代码如下: ```xml ``` 输入日志到控制台和D盘mylog.log文件中。 到此为止,已经完成了log4j2的集成,运行项目,查看日志。 示例源码:https://github.com/vipstone/springboot-example/tree/master/springboot-logging **参考资料** JAVA日志的前世今生:https://www.cnblogs.com/xiexj/p/9417128.html

以上是关于Spring BootLogback和Log4j2集成与日志发展史的主要内容,如果未能解决你的问题,请参考以下文章

如何将所有日志从hibernate和spring重定向到log4j2?

Spring Boot基础5-日志配置-logback和log4j2

Spring Boot Log4j2漏洞修复指南 (Log4J2 Vulnerability and Spring Boot)

在 Spring Boot 应用程序中未针对休眠和弹簧过滤 Log4j2 日志级别

spring boot自定义log4j2日志文件

Spring Boot发布2.6.22.5.8:升级log4j2到2.17.0