type
status
date
slug
summary
tags
category
icon
password
URL
文章来源说明

日志框架发展

  1. 张三开发了日志框架log4j 受到欢迎,并被apatch基金收纳,jdk官方开发出了日志框架 jul java.util.logging
  1. 张三发现log4j不好用,离开apache 独自开发日志门面 slf4j(不实现日志,整合日志)适配器,桥接器
  1. apache 开发出log4j2 性能高出log4j好多倍,张三开发出logback性能高出log4j 好多倍
 
日志实现
日志门面
log4j 淘汰
JCL
jul java.util.logging
SLF4J
log4j2
logback
 
早年工作使用log4j代码如下
sun公司在jdk1.4后增加了java.util.logging也就是jul,然后你的leader让你把日志改成jcl,这个时候你只能一行行将log4j的api 改成jul的api
 
很明显两者api完全不同,那有没有办法将这些api接口抽象出来,这样以后调用这些接口即可
于是jcl(jakarta commons logging)便出现了,common-logging-xx.jar,jcl 只提供log接口,具体实现则动态寻找
notion image
 
于是代码则变成下面这样
至于这个Log具体的实现类,JCL会在ClassLoader中进行查找。这么做,有三个缺点,缺点一是效率较低,二是容易引发混乱,三是在使用了自定义ClassLoader的程序中,使用JCL会引发内存泄露。 JCL动态查找机制进行日志实例化,执行顺序为:commons-logging.properties---->系统环境变量------->log4j--->jul--->simplelog---->nooplog
 
log4j作者觉得不好用,自己写了1个新接口,那是slf4j
notion image
 
slf4j日志门面机制和jcl机制不一样,相当于是个游戏机,但是本身没有游戏,只提供运行平台,需要运行什么游戏slf4j并不管,你放什么光盘就运行什么游戏
 

slf4j和其他各种日志组件桥接说明

jar包名
说明
slf4j-log4j12-1.7.13.jar
Log4j1.2版本的桥接器,你需要将Log4j.jar加入Classpath。
log4j-slf4j-impl.jar
Log4j2版本的桥接器,还需要log4j-api.jar log4j-core.jar
sl4j-jdk14-1.7.13jar
java.util.logging的桥接器,Jdk原生日志框架。
slf4j-nop-1.7.13.jar
NOP桥接器,默默丢弃一切日志。
slf4j-simple-1.7.13.jar
一个简单实现的桥接器,该实现输出所有事件到System.err. 只有Info以及高于该级别的消息被打印,在小型应用中它也许是有用的。
slf4j-jcl-1.7.13.jar
Jakarta Commons Logging 的桥接器. 这个桥接器将Slf4j所有日志委派给Jcl。
logback-classic-1.0.13.jar(requires logback-core-1.0.13.jar)
slf4j的原生实现,Logback直接实现了Slf4j的接口,因此使用Slf4j与Logback的结合使用也意味更小的内存与计算开销
 
如图所示,应用调了sl4j-api,即日志门面接口。日志门面接口本身通常并没有实际的日志输出能力,它底层还是需要去调用具体的日志框架API的,也就是实际上它需要跟具体的日志框架结合使用。由于具体日志框架比较多,而且互相也大都不兼容,日志门面接口要想实现与任意日志框架结合可能需要对应的桥接器,上图红框中的组件即是对应的各种桥接器! 我们在代码中需要写日志,变成下面这么写
 
在代码中,并不会出现具体日志框架的api。程序根据classpath中的桥接器类型,和日志框架类型,判断出logger.info应该以什么框架输出!注意了,如果classpath中不小心引了两个桥接器,那会直接报错的! 因此,在阿里的开发手册上才有这么一条
强制:应用中不可直接使用日志系统(log4j、logback)中的 API ,而应依赖使用日志框架 SLF4J 中的 API 。使用门面模式的日志框架,有利于维护和各个类的日志处理方式的统一。
 
 
notion image
 
 

logback日志集成

notion image
 
总结:
1. SpringBoot底层也是使用slf4j+logback的方式进行日志记录 1. logback桥接:logback-classic 2. SpringBoot也把其他的日志都替换成了slf4j; 1. log4j 适配: log4j-over-slf4j 2. jul适配:jul-to-slf4j 3. 这两个适配器都是为了适配Spring的默认日志:jc

springboot日志使用

日志级别

可以设置TRACE,DEBUG,INFO,WARN,ERROR,FATAL或OFF之一
日志分别为 跟踪 调试 信息 警告 异常
 

控制台输出格式

可以使用logging.pattern.console修改默认的控制日志格式
  • 2022-12-01 20:00:01
    • 日期和时间:毫秒精度 易于排序
    • %clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint}
      • %clr 当前内容的颜色{faint}
    • %d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}
      • ${value:value2} springboot的占位符 + null条件的表达式(如果value为null 使用value2)
      • LOG_DATEFORMAT_PATTERN: 系统环境变量中的值, springboot底层会根据对应的配置项将值设置到对应的环境变量中
    • %d{-yyyy-MM-dd HH:mm:ss.SSS}
      • %d logback日期显示方式
      • {-yyyy-MM-dd HH:mm:ss.SSS} 日期的格式
  • TRACE
    • 日志级别
    • %clr(${LOG_LEVEL_PATTERN:-%5p})
    • %clr 颜色 会根据不同的日志级别输出对应的颜色
    • ${LOG_LEVEL_PATTERN:-%5p}
    • %5 代表当前内容所占字符长度
    • p 输出日志事件的级别。
  • 文件输出
默认情况下,Spring Boot仅记录到控制台,不写日志文件。如果除了控制台输出外还想写日志文件,则需要设置一个logging.file.name或logging.file.path属性(例如,在中application.properties)。 日志迭代
如果您使用的是Logback,则可以使用application.properties或application.yaml文件微调日志轮播设置。对于所有其他日志记录系统,您需要直接自己配置轮转设置(例如,如果使用Log4J2,则可以添加log4j.xml文件)。
名称
描述
logging.logback.rollingpolicy.file-name-pattern
归档的文件名
logging.logback.rollingpolicy.clean-history-on-start
如果应在应用程序启动时进行日志归档清理。
logging.logback.rollingpolicy.max-file-size
归档前日志文件的最大大小。
logging.logback.rollingpolicy.total-size-cap
删除日志档案之前可以使用的最大大小。
logging.logback.rollingpolicy.max-history
保留日志存档的天数(默认为7)
  • logging.logback.rollingpolicy.file-name-pattern
    • ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
      • ${LOG_FILE} 对应 logging.file.name
      • %d{yyyy-MM-dd} 日期 年-月-日
      • %i 索引, 当文件超出指定大小后进行的文件索引递增

自定义日志配置文件

可以通过在类路径中包含适日志配置文件来激活各种日志记录系统或使用logging.config
 
 
 
注意:
  • 如果使用自定义日志配置文件 会使用springboot中全局配置文件的logging相关配置失效
  • 结合SpringBoot提供Profile来控制日志的生效
    • 注意: 一定要将日志配置文件的文件名改成logback-spring.xml, 因为 logback.xml 会在Springboot容器加载前先被logback给加载到, 那么由于logback无法解析springProfile 将会报错:
    • ERROR in ch.qos.logback.core.joran.spi.Interpreter@4:71 - no applicable action for [springProperty], current ElementPath is [[configuration][springProperty]] ERROR in ch.qos.logback.core.joran.spi.Interpreter@4:71 - no applicable action for [springProfile], current ElementPath is [[configuration][springProfile]]
    •  

切换日志框架

将logback换成log4j2
1. 将logback的场景启动器排除(slf4j只能运行有1个桥接器) 2. 添加log4j2的场景启动器 3. 添加log4j2的配置文件

项目一份示例日志文件

电商项目-交易注解和内部类
Loading...