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.controllercn.edu.demo.config 包下的 class 都采用 INFO 级别的日志。而其他的 class 则用 root 中定义的日志级别

 

3. 测试

在代码中通过如下地方式获取 logger

private static final Logger logger = LoggerFactory.getLogger(MybatisRedisCache.class);

 

控制台输出的日志


springboot logback 没有记录Exception springboot日志配置logback_日志输出

 

文件输出的日志


springboot logback 没有记录Exception springboot日志配置logback_sed_02