日志框架有很多类型,Spring boot支持三种log4j2,java.logging,logback。我在实际项目中使用logback居多,而且spring boot默认的日志框架也是logback,所以其他两种类型省略。
不论是logback与spring boot集成,还是与spring集成,掌握logback框架的知识是核心点。
单独使用logback时,只需要两个步骤
- 引入logback-core,logback-classic,slfj等jar包
- 编写配置文件,文件名可以是logback-test.xml,logback.xml,logback.groovy中的任意一个。
具体的核心配置项,配置logger,配置Appender,配置Encoder。
- 配置logger:配置root logger,配置自定义logger
- 配置Appender:配置consoleAppender,配置FileAppender。
- 配置Encoder:配置日志信息的pattern。
与Spring boot集成也是类似的。
1、配置Logger
配置root logger和自定义logger,只需要在application.properties添加Logging.level.<logger-name>=<level>的配置项。
root logger的配置
logging.level.root = info
自定义logger的配置,例如包名是learn.springBoot
Logging.level.learn.springBoot = debug
Spring boot在上述两种形式上添加了组的概念,可以将多个logger-name归为一组,从而统一定义它们的日志级别
# group logging.group.test=learn.springBoot, learn.test logging.level.test=debug
上述例子中将learn.test,learn.springBoot归为一组,统一定义它们的日志级别
2、配置Appender
最常使用的两种Appender是ConsoleAppender和FileAppender。
2.1 ConsoleAppender
ConsoleAppender是spring boot的默认值。单独使用logback时,配置ConsoleAppender,需要配置它的三个属性,encoder,target,withJansi。
- Encoder:配置Console的日志格式,对应logging.pattern.console配置项。
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} %n
2. Target:输出流,默认值是System.out。
3. withJansi:不同级别的日志使用不同的颜色。无需配置此项,可以在IDE上安装LogViewer插件,然后可以配置插件,我觉得这种方式更简单。
2.2 FileAppender
单独使用FileAppender时,通常配置的类型都是RollingFileAppender,TriggerPolicy和RollingPolicy通常都是使用的SizeAndTimeBasedRollingPolicy。
它的配置项有以下几项:
- File:设置日志文件的名称,对应logging.file.name 或 logging.file.path配置项,name指定日志文件的名称; path指定日志文件存放的路径,此时日志文件的名称为spring.log。二者只配置一个
- Append:日志追加到文件末尾,而不是覆盖之前的内容,使用默认值即可
- immediateFlush:使用默认值true即可
- fileNamePattern:当触发生成新日志时,新日志文件的名称格式,对应logging.pattern.rolling-file-name
${file_root_app_history_dir}/%d{yyyy/MM,aux}/%d{yyyy-MM-dd}_log%i.zip
5. maxSize:当日志文件超过此值时,触发生成新日志,对应logging.file.max-size
logging.file.max-size=5MB
6.maxHistory:指定日志文件保留的最长时间值,单位由fileNamePattern决定,例如上述配置的日期单位为天。对应logging.file.max-history
logging.file.max-history=365
7. totalSizeCap:指定日志文件的总大小,超出总大小时,会触发旧日志的删除。对应logging.file.total-size-cap
logging.file.total-size-cap=20G
8. encoder:配置日志信息的格式,对应logging.pattern.file
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} %logger %n[%thread] %7level: %message %n
9.cleanHistoryOnStart:是否在logback启动时触发一次旧日志的删除,使用默认值即可,默认情况下由maxHistory,totalSizeCap触发即可。
3、杂项
3.1 loggingConfig
从上述配置看,通过Spring boot去配置logback还是比较麻烦的,因为没有层次结构,当想指定为logback配置文件时,可以使用Logging.config配置项, 或者设置
org.springframework.boot.logging.LoggingSystem属性值。
它的值有三种类型
- 当为none时,关闭spring boot的日志功能
- 当为特定文件名称时,指定为特定的日志框架。
-
- Logback:logback.xml,logback-spring.xml,logback.groovy,logback-spring.groovy
- Log4j2:log4j2.xml,log4j2-spring.xml
- JDK:logging.properties
3. 当为自定义文件名称时,使用spring boot默认的日志框架,即logback。
通常情况下不要使用logback.xml,这是因为logback日志框架本身也会自动加载此文件。
3.2 SpringProfile
在日志框架的配置文件中扩展springProfile标签。当日志配置信息包裹在SpringProfile下时,只有满足标签的name属性,才会生效
<springProfile name="test"> <root level="debug"> <appender-ref ref="SYSOUT"></appender-ref> </root> </springProfile>
上述配置的含义是:当激活的profile中包含test时,root logger的日志级别设置为debug。
3.3 SpringProperty
在日志框架的配置文件中扩展springProperty标签。功能是日志配置信息中可以引入spring boot的配置项
<springProperty scope="context" name="fluentHost" source="myapp.fluentd.host" defaultValue="localhost"/>
其中
- Scope:日志框架变量的作用域
- Name:日志框架变量的名称
- Source:spring boot配置项的名称
- defaultValue:默认值
4、示例
# Logback configuration debug=true # Logger # root Logger logging.level.root=debug # self define logger logging.level.learn.springBoot=info # group logging.group.test=learn.springBoot, learn.test logging.level.test=debug # Appender # Console Appender logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} %logger %n[%thread] %7level: %message %n # File Appender app_name = learnSpringBoot file_root_app_dir = H:\logs\${app_name} file_root_app_history_dir =H:\logs\history logging.file.path = ${file_root_app_dir} logging.file.name = ${file_root_app_dir}\${app_name}_log.txt logging.pattern.rolling-file-name=${file_root_app_history_dir}/%d{yyyy/MM,aux}/%d{yyyy-MM-dd}_log%i.zip logging.file.max-size=5MB logging.file.max-history=365 logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} %logger %n[%thread] %7level: %message %n