1. 概述
日志在一个业务系统重非常重要,包含有非常重要的数据,可以用于客户反馈问题的排查、线上问题的追踪,以及根据日志数据对业务情况进行有效的监控配置,及时发现线上问题。
常用的日志框架有好几种,但最常用的是 logback、log4j 等。本文主要讲解 logback 日志框架的配置,后面再介绍 log4j 日志框架的配置。
2. 案例与解析
定义日志文件 logback.xml
<configuration>
<property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} {%thread} %-5level %logger{36} -%msg%n"/>
<property name="FILE_PATH" value="logs/logback.%d{yyyy-MM-dd}.%i.log"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!--按照上面配置的LOG_PATTERN来打印日志-->
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--按上面配置的 FILE_PATTERN 路径来存储日志-->
<fileNamePattern>${FILE_PATH}</fileNamePattern>
<!--日志保存15天-->
<maxHistory>15</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!--单个日志文件的最大,超过则新建日志文件存储-->
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<!--按照上面配置的 LOG_PATTERN 来打印日志-->
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<!--定义日志输出级别-->
<logger name="cn.edu.demo" level="WARN"/>
<logger name="cn.edu.demo.controller" level="INFO"/>
<logger name="cn.edu.demo.config" level="INFO"/>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
在 SpringBoot 项目的配置文件中配置
在 SoringBoot 的 application.properties (或者ymal格式的application.yml) 配置使用 logback
# logback
logging.config=classpath:logback.xml
配置项解析
property
定义了两个变量 LOG_PATTERN 和 FILE_PATH,分别表示日志信息应该以什么格式输出,和日志文件输出的位置以及日志文件的命名规则;
1) LOG_PATTERN
"%d{yyyy-MM-dd HH:mm:ss} {%thread} %-5level %logger{36} -%msg%n"- 定义了一个格式,命名为 “LOG_PATTERN”
- %date 或 %d 表示日期;
- %thread 表示线程名;
- %-5level 表示级别从左显示5个字符宽度;
- %logger{36} 表示 logger 名字最长36个字符;
- %msg 表示日志信息;
- %n 是换行符;
2) FILE_PATH
"logs/logback.%d{yyyy-MM-dd}.%i.log"- 定义了一个格式,命名为 “FILE_PATH”,为日志的文件的存储位置和格式,在下面的 appender 中引用这个日志文件格式;
- 如上,产生的日志文件被存储在项目的根文件夹下的 logs 目录下;
- %d 为日期,%i 为该日期下的第几个日志文件(因为业务系统有可能产生很多的日志导致日志文件过大,当我们配置文件大于某个值时就进行滚动,那么就是在同一个日期下产生多个日志文件,那我们就需要 %i 来命名各个日志文件);
- 示例,系统在 2022-12-12 产生的日志为形如 “logback.2022-12-12.0.log”、“logback.2022-12-12.1.log”、“logback.2022-12-12.2.log”、… 的日志文件;
appender
每一个appender代表了一个输出,在每个appender中的class设置对应的类即可指定日志输出的环境。例如以上的配置文件中:
- 如果我们要在控制台输出日志,那么我们就需要将 appender 的 class 属性指定为 ch.qos.logback.core.ConsoleAppender
- 如果我们要讲日志输出到文件中,并且要求日志文件按要求回滚,那么我们就需要将 appender 的 class 属性指定为 ch.qos.logback.core.rolling.RollingFileAppender
root
root 用于定义根 logger 的日志级别。logback 中的 logger 采用的是一种 “继承” 的机制,所有 class 中默认的就是采用的这个 root 中定义的日志级别,如果在 logger 中对某个包小的 class 指定了另外的日志级别才会覆盖掉这个 root 的日志级别。
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
以上的配置 root 的日志级别为 INFO,并且引用了两个 appender,表示默认情况下这两个 appender 都生效,只要继承的 logger 没有指定其他的 appender,那么默认的就是使用这两个 appender。
<!--定义日志输出级别-->
<logger name="cn.edu.demo" level="WARN"/>
<logger name="cn.edu.demo.controller" level="INFO">
<appender-ref ref="CONSOLE"/>
</logger>
<root level="INFO">
<!-- <appender-ref ref="CONSOLE"/>-->
<appender-ref ref="FILE"/>
</root>
例如以上的配置中,root 只指定了 “FILE” 这一个 appender,在 cn.edu.demo.controller
包继承了 root 的 logger,又新增了 “CONSOLE” 的 logger,那么在 cn.edu.demo.controller
包下的日志就会输出到 CONSOLE 和 FILE 中,而 cn.edu.demo
包下其他 class 中的 logger 只会将日志输出到 FILE 中,不会在控制台输出。
logger
用于覆盖 root 中指定的日志的级别.
<logger name="cn.edu.demo" level="WARN"/>
<logger name="cn.edu.demo.controller" level="INFO"/>
<logger name="cn.edu.demo.config" level="INFO"/>
以上配置中,指定了 cn.edu.demo
包下的 class 都用 WARN 级别的日志; cn.edu.demo.controller
和 cn.edu.demo.config
包下的 class 都采用 INFO 级别的日志。而其他的 class 则用 root
中定义的日志级别
3. 测试
在代码中通过如下地方式获取 logger
private static final Logger logger = LoggerFactory.getLogger(MybatisRedisCache.class);
控制台输出的日志
文件输出的日志
参考文献
[1] https://blog.csdn.net/qq_56044050/article/details/123454820