springboot使用logback自定义日志的详细过程

 更新时间:2024年12月16日 11:09:51   作者:北海597  
这篇文章主要介绍了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官方配置文档

到此这篇关于springboot使用logback自定义日志的文章就介绍到这了,更多相关springboot logback自定义日志内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用JPA传递参数的方法

    使用JPA传递参数的方法

    这篇文章主要介绍了使用JPA传递参数的方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • java实现外卖订餐系统

    java实现外卖订餐系统

    这篇文章主要为大家详细介绍了java实现外卖订餐系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • springboot项目打包发布部署的过程及jar和war的区别

    springboot项目打包发布部署的过程及jar和war的区别

    Spring Boot使用了内嵌容器,因此它的部署方式也变得非常简单灵活,可以将Spring Boot项目打包成JAR包来独立运行,Spring Boot项目既可以生成WAR包发布,也可以生成JAR包发布,那么它们有什么区别呢
    2022-11-11
  • Java文件类型校验之Apache Tika详解

    Java文件类型校验之Apache Tika详解

    本文介绍了使用Apache Tika库来判断文件类型的方法,Tika可判断多种文件类型,包括doc、ppt、xls等,通过引入Tika的Maven依赖,可以轻松转换MultipartFile为File类,从而获取文件的Mime类型,最后列出了常见文件类型的Mime类型,方便使用
    2026-03-03
  • 详解JavaScript中的函数声明和函数表达式

    详解JavaScript中的函数声明和函数表达式

    这篇文章主要介绍了详解JavaScript中的函数声明和函数表达式,是JS入门学习中的基础知识,需要的朋友可以参考下
    2015-08-08
  • 关于@SpringBootApplication详解

    关于@SpringBootApplication详解

    这篇文章主要介绍了关于@SpringBootApplication的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Java BoxLayout(盒子布局)布局管理器解析

    Java BoxLayout(盒子布局)布局管理器解析

    这篇文章主要介绍了Java BoxLayout(盒子布局)布局管理器解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 基于springboot 长轮询的实现操作

    基于springboot 长轮询的实现操作

    这篇文章主要介绍了基于springboot 长轮询的实现操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • 用Java实现全国天气预报的api接口调用示例

    用Java实现全国天气预报的api接口调用示例

    查询天气预报在APP中常用的一个常用功能,本文实例讲述了java调用中国天气网api获得天气预报信息的方法。分享给大家供大家参考。
    2016-10-10
  • 使用jpa的时候set实体类属性自动持久化的解决方案

    使用jpa的时候set实体类属性自动持久化的解决方案

    这篇文章主要介绍了使用jpa的时候set实体类属性自动持久化的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08

最新评论