springBoot中日志的使用
日志基础
首先你需要知道日志门面,日志实现,日志桥接器。
基于日志实现,常用的有logback,log4j2,这两个日志实现是的创始人是同一个,概念差不多,这里以log4j2为例,有如下几个核心概念:
- 记录器: 负责日志记录,可以精确到具体某个类,有一个默认的根记录器,你需要了解记录器之间的继承关系
- 追加器: 负责日志输出的具体位置,一个记录器可以对应多个追加器
- 布局: 一般是定义在追加器中,定义了日志的输出格式
- 日志级别: 定义了日志的输出级别,一般日志级别越低,输出越详细
springboot中日志实现
官方文档;https://docs.spring.io/spring-boot/docs/2.6.13/reference/html/features.html#features.logging
logging:
# 指定日志配置文件位置,指定之后,外部配置文件失效,但是可以被配置文件内部引用,注意logback-spring.xml这个名称不能修改
config: classpath:log/logback-spring.xml
level:
#指定根记录器的级别
root: debug
# 单独指定某个记录器的日志级别
cn.sry1201.demo.DemoApplication: debug
file:
# 定义日志文件总大小
max-total-size: 2GB
# 日志文件路径
path: ./MYLOG/${spring.application.name}
# 日志文件名称
name: ${spring.application.name}.log
pattern:
console: '%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}'
file: '%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} --- %msg%n'
主要是通过日志桥接器统一桥接到logback上,如下图,日志实现只有logback-core
- SpringBoot底层也是使用slf4j+logback的方式进行日志记录
a. logback桥接:logback-classic - SpringBoot也把其他的日志都替换成了slf4j;
a. log4j 适配: log4j-over-slf4j
b. jul适配:jul-to-slf4j
c. 这两个适配器都是为了适配Spring的默认日志:jc
日志级别
可以设置TRACE,DEBUG,INFO,WARN,ERROR,FATAL或OFF之一
日志格式
%d表示时间
%thread表示线程名
%-5level 表示日志级别,允许以五个字符长度输出
%logger{50}表示具体的日志输出者,比如类名,括号内表示长度
%msg表示具体的日志消息,就是logger.info("xxx")中的xxx
%n表示换行
%color(xxx)来指定对应列的输出颜色,可以实现控制台输出的颜色高亮
日志迭代(轮转)
如果您使用的是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
Logging System | Customization |
---|---|
Logback | logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy |
Log4j2 | log4j2-spring.xml or log4j2.xml |
JDK (Java Util Logging) | logging.properties |
这里我们使用 logback-spring.xml文件,需要说明的是使用日志配置后,springboot中的其他日志配置项不再生效,但是可以在日志配置文件中引用springBoot中的日志配置选项
logback-spring.xml这个文件名称不可以修改,否则spring加载不到,流程应该是spring加载后,转换其中spring独有的配置,然后在给logback进行加载。
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<configuration scan="true" scanPeriod="10 seconds" >
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<!--这里是读取spring配置文件中的数据,读取不到使用默认值,${}获取的是系统属性,部分系统属性可以参考官网,logging.pattern.console 会被spring转成系统属性CONSOLE_LOG_PATTERN -->
<springProperty scope="context" name="consolePattern" source="logging.pattern.console" defaultValue="${CONSOLE_LOG_PATTERN}"/>
<springProperty scope="context" name="filePattern" source="logging.pattern.file" defaultValue="${FILE_LOG_PATTERN}" />
<springProperty scope="context" name="maxFileSize" source="logging.file.max-size" defaultValue="100MB"/>
<springProperty scope="context" name="maxTotalFileSize" source="logging.file.max-total-size" defaultValue="20GB"/>
<springProperty scope="context" name="maxFileHistory" source="logging.file.max-history" defaultValue="30"/>
<springProperty scope="context" name="rootLevel" source="logging.level.root" defaultValue="info"/>
<springProperty scope="context" name="logHome" source="logging.file.path" defaultValue="${user.home}/logs"/>
<property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} --- %msg%n"/>
<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
<!-- 输出到控制台-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<!--过滤掉低于trace级别的日志-->
<level>trace</level>
</filter>
<encoder>
<pattern>${consolePattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 时间滚动输出level为INFO日志 -->
<appender name="ALL-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${logHome}/log_all.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>${LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 每天日志归档路径以及格式 -->
<fileNamePattern>${logHome}/all/%d{yyyy-MM-dd}/log-all-%d{yyyy-MM-dd}-%i.log.zip</fileNamePattern>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
<maxHistory>${maxFileHistory}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${maxFileSize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<totalSizeCap>${maxTotalFileSize}</totalSizeCap>
</rollingPolicy>
<!--过滤掉所有级别低于info的日志-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
<appender name="ERROR-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${logHome}/log_error.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>${LOG_PATTERN}</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${logHome}/error/%d{yyyy-MM-dd}/log-error-%d{yyyy-MM-dd}-%i.log.zip</fileNamePattern>
<!--日志文件保留天数-->
<cleanHistoryOnStart>true</cleanHistoryOnStart>
<maxHistory>${maxFileHistory}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${maxFileSize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 此日志文件只记录ERROR级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--以下三行配置是日志级别匹配上了就接收,没匹配上就拒绝-->
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="DEBUG-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${logHome}/log_debug.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>${LOG_PATTERN}</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${logHome}/debug/%d{yyyy-MM-dd}/log-debug-%d{yyyy-MM-dd}-%i.log.zip</fileNamePattern>
<!--日志文件保留天数-->
<cleanHistoryOnStart>true</cleanHistoryOnStart>
<maxHistory>${maxFileHistory}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${maxFileSize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 只打印debug级别的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 引用spring.profiles.active 配置,确定生效的日志-->
<springProfile name="prod">
<root level="${rootLevel}">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="ALL-LOG"/>
<appender-ref ref="ERROR-LOG"/>
</root>
</springProfile>
<springProfile name="dev,test">
<root level="${rootLevel}">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="ALL-LOG"/>
<appender-ref ref="ERROR-LOG"/>
<appender-ref ref="DEBUG-LOG"/>
</root>
</springProfile>
<springProfile name="local">
<root level="${rootLevel}">
<appender-ref ref="CONSOLE"/>
</root>
</springProfile>
</configuration>
切换日志框架
- 将 logback切换成log4j2
- 将logback的场景启动器排除(slf4j只能运行有1个桥接器)
- 添加log4j2的场景启动器
- 添加log4j2的配置文件,注意命名:log4j2-spring.xml
<!--Log4j2的场景启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!--全局排除spring-boot-starter-logging内的所有依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
关联信息
- 关联的主题:
- 上一篇:
- 下一篇:
- image: 20221021/1
- 转载自: