springboot使用logback自定义日志

server/2025/2/25 14:41:17/

前言

1、末尾有完整配置文件

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

TRANCE < DEBUG < INFO < WARN < ERROR

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

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

logging:level:root: debug

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

logging:level:com.example.controller: debugcom.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_46">使用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配置的时候就遇到这种情况,也是模仿父类进行修改的。@Overrideprotected 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] keywordat 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官方配置文档


http://www.ppmy.cn/server/170569.html

相关文章

OpenCV 4.10.0 图像处理基础入门教程

一、OpenCV基础架构与开发环境 1.1 OpenCV核心模块解析 OpenCV 4.10.0延续了模块化架构设计&#xff0c;核心模块包含&#xff1a; Core&#xff1a;提供基础数据结构&#xff08;如Mat&#xff09;和基本运算Imgcodecs&#xff1a;独立图像编解码模块Videoio&#xff1a;视…

CentOS停服后的替代选择:openEuler、Rocky Linux及其他系统的未来展望

CentOS停服后的替代选择&#xff1a;openEuler、Rocky Linux及其他系统的未来展望 引言CentOS停服的背景华为openEuler&#xff1a;面向未来的开源操作系统1. 简介2. 特点3. 发展趋势 Rocky Linux&#xff1a;CentOS的精神继承者1. 简介2. 特点3. 发展趋势 其他可选的替代系统1…

xcode打包导出ipa

在Products目录下&#xff0c;把xxx.app文件拷贝出来&#xff0c;新建Playload文件夹&#xff0c;压缩Playload文件夹&#xff0c;得到 Playload.zip文件&#xff0c;修改 Playload.zip文件为Playload.ipa文件&#xff0c;最终这个ipa文件可以随意更改成你想要的名字即可。 …

jQuery CSS 类

jQuery CSS 类 引言 jQuery 是一种快速、简洁且强大的 JavaScript 库,它使得网页开发变得更加容易和高效。在 jQuery 中,CSS 类的使用是一个非常重要的部分,因为它们可以用来选择和操作 HTML 元素。本文将详细介绍 jQuery CSS 类的用法,包括如何使用 CSS 选择器来选择元素…

【Java 8】Lambda表达式介绍

目录 1、Lambda简介 2、语法介绍 3、Lambda表达式示例 3.1、无参数的 Lambda 表达式 3.2、单个参数的 Lambda 表达式 3.3、多个参数的 Lambda 表达式 3.4、带语句块的 Lambda 表达式 4、Lambda使用场景 4.1、替代匿名内部类 4.2、集合操作 4.3、排序 4.4、函数式接口…

基于 JavaWeb 的 SSM+Maven 微信小程序快递柜管理系统设计和实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

低代码技术在医院的应用与思考

近年来&#xff0c;低代码这一概念在医疗信息化领域频繁出现。那么&#xff0c;低代码究竟是什么&#xff1f;它因何而生&#xff1f;在医院信息系统建设与运维中&#xff0c;低代码技术又有哪些适用的应用场景&#xff1f;对于用户而言&#xff0c;低代码技术又存在哪些有待改…

Apache Tomcat RCE 稳定复现 保姆级!(CVE-2024-50379)附视频+POC

原文链接 Apache Tomcat 最新RCE 稳定复现分析 保姆级&#xff01;&#xff01;&#xff01;附复现视频POC 前言 最近爆出 Apache Tomcat条件竞争导致的RCE&#xff0c;影响范围当然是巨大的&#xff0c;公司也及时收到了相关情报&#xff0c;于是老大让我复现&#xff0c;以…