SpringBoot日志配置详情
一、介绍
在所有的项目中,日志是必不可少的,为了高效清晰的查找日志,可以配置日志输出的等级和格式。
在配置后,可以自定义输出日志到指定目录,可以按照天数来分割日志,可以按照日志级别分割日志,可以按照大小来进行分割日志。
输出的日志方式,可以说五花八门,但总有一款适合你的项目
二、简单配置
1、日志的级别
关于日志的级别打印,需要搞清楚日志等级的优先级
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component;
@Slf4j @Component public class LoggerTask {
@Scheduled(cron = "0/30 * * * * ?") public void logTask(){ log.trace("TRACE"); log.debug("DEBUG日志"); log.info("INFO日志"); log.warn("WARN日志"); log.error("ERROR日志"); } }
|
在SpringBoot的yaml配置文件中,添加相关日志的配置文件
1 2 3 4 5
| logging: level: root: info
|
以下是日志的打印,发现比info级别低的debug和trace级别的日志没有打印出来。
在实际项目中,除了日志输出的规范,合理利用日志等级,也可以达到清晰日志的规范,排查问题会变得高效
除了logging.level.root
,还可以指定对应包和类的日志级别
配置文件和测试代码
1 2 3 4 5 6 7
| logging: level: root: info com.banmoon.spring_boot_logger.mapper: debug
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| import com.banmoon.spring_boot_logger.mapper.UserMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component;
@Slf4j @Component public class LoggerTask { @Autowired private UserMapper userMapper;
@Scheduled(cron = "10 * * * * ?") public void dbDemonstration(){ log.info("====================="); int count = userMapper.countByExample(null); log.info("用户条数:{}", count); log.info("====================="); } }
|
2、日志的打印格式
虽然springBoot的日志打印格式足够清晰明了,但它支持自定义打印格式,还是记录一波吧
配置文件指定格式
1 2 3 4 5
| logging: pattern: console: "%red(%d{yyyy-MM-dd HH:mm:ss.SSS}) %green([%thread]) %blue([%-5level]) %cyan(%logger{36}:%line) %msg%n"
|
简单说明一下这段格式化的意思,学会大家就可以配置自己喜欢的格式了
1 2 3 4 5 6 7 8
| %red: 指定颜色,记得用小括号将内容包裹起来 %d: 日期时间,后面的是日期格式化 %thred: 线程名 %-5level: 日志级别,%-5表示的是打印字符个数,如果个数不足则用空格补上 %logger{36}: 输出日志的包名,最长36字符,超过则会简化,只会输出后面几个包名和类名 %line: 输出日志的行数 %msg: 输出的日志信息 %n: 换行
|
3、日志的持久化输出
在日常的开发中,控制台输出的日志就满足开发的需求了。但是在测试生产环境下,日志的持久化保存就显得格外的重要,springBoot也考虑到了这一点,也拥有相对应的配置
1 2 3 4 5 6 7 8 9
| logging: path: D:/log file: log/spring-boot-logger.log pattern: file: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5level] %logger{36}:%line %msg%n"
|
相对路径,指定logging.file
输出
绝对路径,指定logging.path
输出
注意:logging.path
和logging.file
只需指定一个便可,两个都指定时,仅会输出logging.file
的日志
三、高级配置
在创建springBoot项目后,简单的日志配置可以满足我们大部分的需求,但我们有时需要高度自定义的日志,比如说
1、配置模板
在resources
目录下,创建文件logback/logback.xml
,并在配置文件指定logback的配置文件
1 2
| logging: config: classpath:logback/logback.xml
|
logback.xml文件配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| <?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="30 seconds" debug="true">
<springProperty scope="context" name="LOG_PATH" source="logging.log_path"/> <springProperty scope="context" name="APPLICATION_NAME" source="spring.application.name"/>
<property name="LOG_FORMAT_ONE" value="%red(%d{yyyy-MM-dd HH:mm:ss.SSS}) %green([%thread]) %blue([%-5level]) %cyan(%logger{36}:%line) %msg%n" /> <property name="LOG_FORMAT_TWO" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5level] %logger{36}:%line %msg%n" />
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <Pattern>${LOG_FORMAT_ONE}</Pattern> <charset>UTF-8</charset> </encoder> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>info</level> </filter> </appender>
<appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_PATH}/info.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_PATH}/%d{yyyy-MM-dd}/info_%i.log</fileNamePattern> <maxFileSize>50MB</maxFileSize> <MaxHistory>90</MaxHistory> </rollingPolicy> <encoder> <pattern>${LOG_FORMAT_TWO}</pattern> <charset>UTF-8</charset> </encoder> </appender>
<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_PATH}/${APPLICATION_NAME}/${APPLICATION_NAME}_error.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_PATH}/${APPLICATION_NAME}/%d{yyyy-MM-dd}/${APPLICATION_NAME}_error.log</fileNamePattern> <maxHistory>180</maxHistory> <totalSizeCap>10GB</totalSizeCap> </rollingPolicy> <encoder> <pattern>${LOG_FORMAT_TWO}</pattern> <charset>UTF-8</charset> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender>
<root level="INFO"> <appender-ref ref="CONSOLE" /> <appender-ref ref="FILE_INFO" /> <appender-ref ref="FILE_ERROR" /> </root>
<logger name="com.banmoon.spring_boot_logger.mapper" level="DEBUG" additivity="false"> <appender-ref ref="CONSOLE" /> <appender-ref ref="FILE_INFO" /> <appender-ref ref="FILE_ERROR" /> </logger>
</configuration>
|
2、通过运行环境来指定对应的输出策略
1 2 3 4 5 6 7 8 9 10
| <?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="30 seconds" debug="true"> <springProfile name="dev"> <include resource="logback/logback-dev.xml" /> </springProfile> <springProfile name="test | prod"> <include resource="logback/logback-prod.xml" /> </springProfile> </configuration>
|
logback-dev.xml
文件
1 2 3 4 5 6 7 8 9 10 11
| <?xml version="1.0" encoding="UTF-8"?> <included> <root level="INFO"> <appender-ref ref="CONSOLE" /> </root>
<logger name="com.banmoon.spring_boot_logger.mapper" level="DEBUG" additivity="false"> <appender-ref ref="CONSOLE" /> </logger> </included>
|
logback-prod.xml
文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <?xml version="1.0" encoding="UTF-8"?> <included> <root level="INFO"> <appender-ref ref="CONSOLE" /> <appender-ref ref="FILE_INFO" /> <appender-ref ref="FILE_ERROR" /> </root>
<logger name="com.banmoon.spring_boot_logger.mapper" level="DEBUG" additivity="false"> <appender-ref ref="CONSOLE" /> <appender-ref ref="FILE_INFO" /> <appender-ref ref="FILE_ERROR" /> </logger> </included>
|
3、相关配置标签
标签名 |
属性 |
作用 |
configuration |
scan:是否扫描日志配置文件,默认为true scanPeriod:扫描时间间隔,默认为60 seconds debug:是否打印出logback的日志,默认为false |
logback配置,当scan 启用时,配置文件会定时检查并重新加载 |
property |
name:属性名 value:属性值 file:可以引入properties 文件的属性 |
定义参数常量,可以使用${属性名} 进行使用 |
springProperty |
name:属性名 source:取项目配置文件的属性源 scope:作用域 |
springBoot的扩展,将读取springBoot的配置文件,获取参数常量 |
appender |
name:自定义的策略名 class:指定输出策略的输出类,控制台输出或文件输出 |
输出策略 |
appender.file |
|
此策略输出的文件路径,可以绝对路径,也可以相对路径 |
appender.rollingPolicy |
class:指定回滚策略类 |
日志输出回滚策略配置 |
appender.rollingPolicy.fileNamePattern |
|
日志输出回滚的日志保存路径 |
appender.rollingPolicy.maxHistory |
|
日志最大保存天数 |
appender.rollingPolicy.totalSizeCap |
|
总日志最大的容量,指的不是单个文件 |
appender.encoder |
|
编码策略 |
appender.encoder.pattern |
|
指定输出的日志格式,控制台可以有颜色,但文件输出不行 |
appender.encoder.charset |
|
编码格式,一般都取utf-8 |
appender.filter |
class:指定过滤器类 注意:每个过滤器,子节点都不完全相同,建议查看源码和官方文档,也可以实现自己的过滤器 |
日志输出的过滤策略 |
root |
level:指定日志等级 |
该项目所有包的等级,比此等级高的日志信息会显示 |
logger |
level:指定日志等级 name:指定的包名或类名 additivity:true/false,表示日志是否向上传递,如果为true,日志在root可能会再次打印 |
功能与root基本一致,区别在于
root 是指定工程的所有包的,而logger 需要自己指定包或类 |
root.appender-ref logger.appender-ref |
ref:指定定义的appender策略的名字 |
指定输出的策略 建议在最上层指定控制台,不然启动控制台就一个springBoot的Logo |
springProfile |
|
springBoot的扩展,可以通过环境指定,实现标签内的内容 |
四、官方配置文档和git地址