自学内容网 自学内容网

springboot使用logback自定义日志

前言

1、末尾有完整配置文件

2、日志分为五个等级,按照优先级的高低可以分为:

TRANCE < DEBUG < INFO < WARN < ERROR

springboot默认是INFO,因此低于INFOTRACEDEBUG都不会输出。

可以在propertiesyaml配置文件中修改日志级别:

logging:
  level:
    root: debug

这里的root可以换成包名,精细控制不同包的日志输出级别,比如:

logging:
  level:
    com.example.controller: debug
    com.example.mapper: error

3、其次,logback的日志分为控制台日志和文件日志。

控制台日志:也就是我们IDE运行项目时,控制台打印的信息。

文件日志:项目运行时,将运行信息写入到指定文件。需要在springboot配置文件或logback配置文件中指定日志文件的位置。

引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
</dependency>

解释:按理来讲需要引入的是spring-boot-starter-logging依赖,但是spring-boot-starter-web间接依赖于spring-boot-starter-logging,所以我们只需要引入spring-boot-starter-web即可。

使用logback

logback会自动寻找classpath根部下面的logback.xml,所以我们只需要在resource目录下创建logback.xml文件,就可以在程序启动时,自动加载自定义日志的配置文件。

如果不想叫logback.xml,想起一个有个性的名字,比如cxkLogback.xml,那么需要在propertiesyaml配置文件指定logback文件路径:

logging:
  config: classpath:cxkLogback.xml

如果想验证一下,可以将下方概览中的配置文件复制到自己的项目中运行一下,观察控制台的日志输出格式。

配置文件概览

可以简单先看一个配置文件的案例

<?xml version="1.0" encoding="UTF-8"?>
<!--
    scan:当配置文件修改后,将会重新载入。
    scanPeriod:设置检测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。
    debug:为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <!-- 定义一个名为STDOUT的控制台输出Appender -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
        <!-- 输出格式 -->
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 定义一个名为FILE的文件输出Appender -->
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <!-- 设置日志文件的存放路径和文件名,可根据实际情况修改 -->
        <file>logs/app.log</file>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 配置根日志记录器,设置日志级别为DEBUG,并将日志输出到STDOUT和FILE这两个Appender -->
    <root level="info">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </root>

</configuration>

这个文件主要定义了两个Appender,分别输出日志到控制台和文件中。

其次定义root目录的日志级别,并将两个Appender配置到root目录下,进行日志输出。

这里的root标签里面定义了level,有没有感觉在哪里见过这个东西?

没错,上文讲到,我们可以在propertiesyaml配置文件中修改日志级别,在springboot配置文件中的操作,和这里的操作是等价的。那么按照同样的道理,这里的root也可以细化成不同的包,配置不同的levelAppender。这里只是引出这个概念,具体的内容放在下文。

配置项详解

<configuration>:logback配置的根标签。它包含三个属性:scanscanPerioddebug

  • scan:当配置文件修改后,将会重新载入。值为truefalse
  • scanPeriod:时间间隔。每隔一段时间检测一次配置文件是否被修改。值可以是6012 second,数字是自定义的,不是非要填6012,如果没有给出时间单位,默认单位是毫秒。当scantrue时,此属性生效。
  • debug:是否打印logback内部日志信息,实时查看logback运行状态。值为truefalse(默认)。

<Appender>:可以理解成负责写日志的工具人。一个Appender就是一个工具人。

<logger> :设置某一个包或具体的类的日志打印级别,以及指定的Appender(分配打工人)。

<root>:根logger,也是logger的一种,且只有一个level属性。

contextName:每个logger都关联到logger上下文,默认上下文名称为default。但可以使用contextName标签设置成其他名字,用于区分不同应用程序的记录。

property:用来定义变量值的标签,property标签有两个属性,namevalue;其中name的值是变量的名称,value的值时变量定义的值。通过property定义的值会被插入到logger上下文中。定义变量后,可以使“${name}”来使用变量。

Appender的种类:

  • ConsoleAppender:控制台日志。
  • FileAppender:文件日志。
  • RollingFileAppender:滚动文件日志。会在日志文件达到某种条件后,创建新的日志文件继续写入日志。常见的条件是文件的大小,比如设置每个文件大小为2KB时,创建新的文件继续写入,文件名大致为xxx1.log,xxx2.log。

输出格式详解

举个例子:%level | %d{yyyy-MM-dd HH:mm:ss,Asia/Shanghai} | [%thread] | %-4relative | %logger{40}| -- %msg%n

%level:日志级别。

%d{yyyy-MM-dd HH:mm:ss,Asia/Shanghai}:时间。

[%thread]:当前线程。

%-4relative:从程序启动到当前日志记录事件所经过的相对时间。-表示左对齐,4表示4个字符宽度。

%logger{40}:输出日志记录器名称的占位符,其中40是一个可选的参数,用于指定输出的日志记录器名称的最大长度。如果不指定{40}这样的参数,默认会输出完整的日志记录器名称。

%msg:日志消息主体。

%n:换行。

%file:文件名。

%line:行号。

配置文件示例

<?xml version="1.0" encoding="UTF-8"?>
<!--
    scan:当配置文件修改后,将会重新载入。
    scanPeriod:设置检测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。
    debug:为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <!-- 日志文件路径,如果spring配置文件没有对应值,使用默认值 -->
    <springProperty scope="context" name="springFilePath" source="log.path" defaultValue="src/main/resources/log"/>

    <!-- 将日志输出到控制台 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%level | %d{yyyy-MM-dd HH:mm:ss,Asia/Shanghai} | [%thread] | %-4relative | %logger{40}| -- %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 将日志输出到文件 -->
    <!--
        使用轮转日志:日志文件超出一定大小后,会新建一个文件(Rolling)
    -->
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 设置文件路径 -->
        <file>${springFilePath}/spring.log</file>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %thread -- %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!-- 基于时间和大小的滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 日志文件输出的文件名 -->
            <fileNamePattern>${springFilePath}/spring.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 单个日志文件最大体积,超出最大值,会新建一个日志文件-->
            <maxFileSize>200MB</maxFileSize>
            <!-- 日志文件保留天数 -->
            <maxHistory>60</maxHistory>
            <!-- 所有日志文件的总体积限制 -->
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <!-- root节点时必选节点,用来指定最基础的日志输出级别,只有一个level属性 -->
    <root level="info">
        <appender-ref ref="console" />
        <appender-ref ref="file" />
    </root>

</configuration>

给日志配置颜色

方式一、使用官方默认配置

只需要在xml配置文件里引入配置文件即可。

<include resource="org/springframework/boot/logging/logback/defaults.xml"/>

什么?你问我这个文件去哪里找?根据resource里面的路径,去lib目录的springboot依赖中找。

方式二、自定义颜色配置

使用形如%clr(){red}来给日志标签配置颜色。

要使用%clr,有两种方式:

第一种是引入方式一的默认配置文件,在该文件里面就帮我们引入了%clr

第二种方式就是手动引入%clr,可以参考一下defaults.xml

<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />

%clr支持的颜色:blue、cyan、faint、green、magenta、red、yellow

faint:淡色(控制台默认颜色)

magenta:品红色

这里贴一下我的pattern

%level | %clr(%d{yyyy-MM-dd HH:mm:ss,Asia/Shanghai}){magenta} | [%thread] | %-4relative | %clr(%logger{40}){magenta}| -- %msg%n

那这个时候你就会发现了,这样自定义的话,我的level怎么没有颜色啊。

不要担心,有解决办法的。

这里提供两种解决办法:

第一种可以更改一下logback中,%clr对于level的判断,针对不同level显示不同颜色,但是这个我还不会,所以自行探索。

第二种要用的是%highlight高亮。

使用%highlight给level配置颜色

第一步、新建一个高亮颜色配置类。

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.pattern.color.HighlightingCompositeConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;

import static ch.qos.logback.core.pattern.color.ANSIConstants.*;
import static ch.qos.logback.core.pattern.color.ANSIConstants.DEFAULT_FG;

/**
 * 自定义 %highlight,实现不同日志level不同颜色
 */
public class LevelHighLightColorConfig extends HighlightingCompositeConverter {
    // 这里用的版本是springboot 2.6.13
    // 如果你发现父类中的方法不是getForegroundColorCode,可能是版本差异造成的。
    // 那么需要你对着父类ctrl+左键点击,看看父类是怎么实现的
    // 然后照猫画虎继续修改,核心逻辑就是判断然后返回不同的颜色。
    // 因为作者跟着AI配置的时候就遇到这种情况,也是模仿父类进行修改的。
    @Override
    protected String getForegroundColorCode(ILoggingEvent event) {
        Level level = event.getLevel();
        switch (level.toInt()) {
            case Level.ERROR_INT:
                return RED_FG;
            case Level.WARN_INT:
                return YELLOW_FG;
            case Level.INFO_INT:
                return GREEN_FG;
            default:
                return DEFAULT_FG;
        }
    }
}

第二步、在logback.xml配置文件中引入我们的%highlight

conversionWord的值固定为highlightconverterClass的值为我们上一步写的配置类。

<conversionRule conversionWord="highlight"
                    converterClass="com.yexiao.userCenter.config.LevelHighLightColorConfig" />

第三步、编写pattern

<pattern>%highlight(%level) | %clr(%d{yyyy-MM-dd HH:mm:ss,Asia/Shanghai}){magenta} | [%thread] | %-4relative | %clr(%logger{40}){magenta}| -- %msg%n</pattern>

完整配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!--
    scan:当配置文件修改后,将会重新载入。
    scanPeriod:设置检测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。
    debug:为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <conversionRule conversionWord="highlight"
                    converterClass="com.yexiao.userCenter.config.LevelHighLightColorConfig" />

    <!-- 日志文件路径,如果spring配置文件没有对应值,使用默认值 -->
    <springProperty scope="context" name="springFilePath" source="log.path" defaultValue="src/main/resources/log"/>

    <!-- 将日志输出到控制台 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%highlight(%level) | %clr(%d{yyyy-MM-dd HH:mm:ss,Asia/Shanghai}){magenta} | [%thread] | %-4relative | %clr(%logger{40}){magenta}| -- %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 将日志输出到文件 -->
    <!--
        使用轮转日志:日志文件超出一定大小后,会新建一个文件(Rolling)
    -->
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 设置文件路径 -->
        <file>${springFilePath}/spring.log</file>
        <!-- 基于时间和大小的滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 日志文件输出的文件名 -->
            <fileNamePattern>${springFilePath}/spring.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 单个日志文件最大体积,超出最大值,会新建一个日志文件-->
            <maxFileSize>200MB</maxFileSize>
            <!-- 日志文件保留天数 -->
            <maxHistory>60</maxHistory>
            <!-- 所有日志文件的总体积限制 -->
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %thread -- %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
    </appender>

    <!-- root节点时必选节点,用来指定最基础的日志输出级别,只有一个level属性 -->
    <root level="info">
        <appender-ref ref="console" />
        <appender-ref ref="file" />
    </root>

</configuration>1

Tips

1、文件路径配置问题

文件路径有两种方式配置,分别是filepath,或者在xml文件中配置。

注:file和path二者不能同时使用,如若同时使用,则只有logging.file生效
logging.file=文件名
logging.path=日志文件路径
 
logging.level.包名=指定包下的日志级别
logging.pattern.console=日志打印规则
  • logging.file,设置文件,可以是绝对路径,也可以是相对路径。如:logging.file=my.log
  • logging.path,设置目录,会在该目录下创建spring.log文件,并写入日志内容,如:logging.path=/var/log

注:二者不能同时使用,如若同时使用,则只有logging.file生效,可以看到这种方式配置简单,但是能实现的功能也非常有限,如果想要更复杂的需求,就需要下面的定制化配置了。

2、使用%clr添加颜色,启动报错

完整报错如下:

Exception in thread "main" java.lang.IllegalStateException: Logback configuration error detected: 
ERROR in ch.qos.logback.core.pattern.parser.Compiler@7a362b6b - There is no conversion class registered for composite conversion word [clr]
ERROR in ch.qos.logback.core.pattern.parser.Compiler@7a362b6b - Failed to create converter for [%clr] keyword
ERROR in ch.qos.logback.core.pattern.parser.Compiler@7a362b6b - There is no conversion class registered for composite conversion word [clr]
ERROR in ch.qos.logback.core.pattern.parser.Compiler@7a362b6b - Failed to create converter for [%clr] keyword
at org.springframework.boot.logging.logback.LogbackLoggingSystem.loadConfiguration(LogbackLoggingSystem.java:166)
at org.springframework.boot.logging.AbstractLoggingSystem.initializeWithConventions(AbstractLoggingSystem.java:82)
at org.springframework.boot.logging.AbstractLoggingSystem.initialize(AbstractLoggingSystem.java:60)
at org.springframework.boot.logging.logback.LogbackLoggingSystem.initialize(LogbackLoggingSystem.java:114)
at org.springframework.boot.context.logging.LoggingApplicationListener.initializeSystem(LoggingApplicationListener.java:264)
at org.springframework.boot.context.logging.LoggingApplicationListener.initialize(LoggingApplicationListener.java:237)
at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEnvironmentPreparedEvent(LoggingApplicationListener.java:200)
at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:173)
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:127)
at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:74)
at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:54)
at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:358)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:317)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1255)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1243)
at com.kaka.jtest.springboot.Application.main(Application.java:24)

解决办法:

没有引入%clr,需要引入默认的配置文件

<include resource="org/springframework/boot/logging/logback/defaults.xml"/>

或手动引入%clr

<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
3、不要在日志文件里面使用颜色输出

使用颜色输出会将颜色转换成ANSI码,不会有颜色,可读性较差。

参考链接

【1】SpringBoot+logback优雅的配置日志

【2】logback官方配置文档


原文地址:https://blog.csdn.net/m0_51274464/article/details/145272769

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!