1. 日志简介
从日志框架角度来看日志分为日志实现框架和日志门面框架。实现框架主要有log4j、log4j2、JUL和Logback;日志门面框架主要JCL和slf4j。SpringBoot默认使用的式slfj+logback。
2. 日志抽象框架是如何找到日志实现框架的?
首先在门面框架中定义一个接口LoggerFactoryBinder,所有的实现框架必须实现这个接口,而且实现类必须具有相同的类名和包路径org/slf4j/impl/StaticLoggerBinder。这样日志门面框架就可以根据该路径去寻找日志实现框架。
3. Springboot日志分析
SpringBoot会引入一个spring-boot-starter-logging依赖,该依赖会引入logback-classic、log4j-to-slf4j和jul-to-slf4j,他们之间的依赖关系如下图所示:
4. 日志配置
- 4.1 <configuration scan=”true” scanPeriod=”60 seconds” debug=”false” >
- Scan: 当设置为true时,配置文件若发生改变,将会重新加载
- ScanPeriod:扫描时间间隔,若没给出时间单位默认为毫秒
- Debug:若设置为true,将打印出logback内部日志信息
4.2 Configuration子节点:
- <contextName>demo</contextName>,主要用来区分不同应用程序的记录,默认为default。
- <property name=”LOG_PATH” value=”logs”>,name变量名,value变量值。我们也可以使用这种方式去加载配置文件中的key-value值,<property resource=”application.properties”>;此外还可以使用占位符,如<property name=”LOG_PATH” value=”${logging-path:-${user.home}/${spring.application.name}/logs}”>
4.3 appender的子节点比较多,这里主要说下pattern:
- Logger{length}:输出日志的logger名,可有一个整形参数,功能时缩短logger名。
ContextName|cn:上下文名称
- date{pattern}:输出日志的打印时间,模式语法与java.text.SimpleDateFormat兼容
- p|le|level:日志级别
- M|method:输出日志的方法名
- r|relative:从程序启动到创建日志记录的时间
- m|msg|message:程序提供的信息
- n:换行符
4.4 root&logger,这两个类似,root用于设置全局,logger用于应用级别的配置,它里面有个属性additivity,如果为false,就会在root中再打印一次了。
5.业务日志的分类
我们可以使用SiftingAppender将日志根据不同的key将日志进行分类,分类的key需要使用MDC进行设置,具体流程如下图所示: