【SpringBoot】【log】 自定义logback日志配置

server/2025/1/18 17:49:48/

前言:默认情况下,SpringBoot内部使用logback作为系统日志实现的框架,将日志输出到控制台,不会写到日志文件。如果在application.properties或application.yml配置,这样只能配置简单的场景,保存路径、日志格式等。复杂的场景(区分 info 和 error 的日志、每天产生一个日志文件等)满足不了,只能自定义配置文件logback-spring.xml。

一、application.properties系统配置logback日志
1.1、SpringBoot默认的日志配置
日志记录器(Logger)的行为是分等级的,日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出。

默认情况下,SpringBoot内部使用logback作为系统日志实现的框架,将日志输出到控制台,不会写到日志文件。Spring boot从控制台打印出来的日志级别默认只有INFO及以上级别,可以在application.properties中修改日志级别logging.level.root=WARN。

SpringBoot默认配置好了日志, 只要启动 Spring Boot 项目就会在控制台输出日志信息。

从上图可以看到,日志输出的内容如下:

时间日期:精确到毫秒

日志级别:ERROR,WARN,INFO,DEBUG,TRACE

进程ID:

分隔符:— 标识实际日志的开始

线程名:方括号括起来(可能会截断控制台输出)

Logger名:通常使用源代码的类名

日志内容:

控制台格式化输出内容:

# 格式化,只输出日期和内容
logging.pattern.console= "%d -%p -%m" %n


打印参数: Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,如下:

%m 输出代码中指定的消息
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为“\r
”,Unix平台为“

%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比 如%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2018年6月15日22:10:28,921
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举 例:estlog4.main(TestLog4.java: 10)

1.2、添加依赖
Spring Boot为我们提供了很多默认的日志配置,所以,只要将spring-boot-starter-logging作为依赖加入到pom.xml,则“开箱即用”。实际开发中我们不需要直接添加该依赖,你会发现spring-boot-starter其中包含了 spring-boot-starter-logging,该依赖内容就是 Spring Boot 默认的日志框架 logback

org.springframework.boot spring-boot-starter-logging 1.3、application.properties简单配置日志相关属性 下面介绍几种在application.properties就可以配置的日志相关属性。

(1)控制台输出

Spring Boot中默认配置INFO、WARN和ERROR级别的日志只输出到控制台。

我们可以在application.properties中修改日志级别logging.level.root=WARN,这样核心Logger(包含嵌入式容器、hibernate、spring)会输出更多内容,还有自己应用的日志就会输出为DEBUG级别。

(2)文件输出

①使用application.properties默认配置

默认情况下,Spring Boot将日志输出到控制台,不会写到日志文件。如果要编写除控制台输出之外的日志文件,则需在application.properties中设置logging.file或logging.path属性。

logging.file:设置文件,可以是绝对路径,也可以是相对路径。如:logging.file=my.log

logging.path:设置目录,会在该目录下创建spring.log文件,并写入日志内容,如:logging.path=/var/log

如果只配置 logging.file,会在项目的当前路径下生成一个 xxx.log 日志文件;

如果只配置 logging.path,在 /var/log文件夹生成一个日志文件为 spring.log。

注:二者不能同时使用,如若同时使用,则只有logging.file生效

默认情况下,日志文件的大小达到10MB时会切分一次,产生新的日志文件,默认级别为:ERROR、WARN、INFO。

②使用logback-spring.xml自定义配置

如果在application.properties或application.yml配置,这样只能配置简单的场景,保存路径、日志格式等。复杂的场景(区分 info 和 error 的日志、每天产生一个日志文件等)满足不了,只能自定义logback配置,SpringBoot官方推荐使用logback-spring.xml作为logback框架的自定义日志配置文件。

1.4、两种配置方式总结
SpringBoot工程自带 logback和 slf4j的依赖,所以重点放在编写配置文件上:

application.properties或 application.yml (系统层面)

logback-spring.xml(自定义文件方式)

第一种方式比较简单,可做的事情也比较简单,比如:只能配置日志文件的输出路径、日志文件的格式、日志的级别等。

第二种方式比较复杂,对日志的处理比较好,生产上推荐这种,运行维护好。如有以下需求:

a、区分 debug、info、error 等类型的日志,并分别输出到不同的日志文件。

b、对日志文件进行维护,如每天产生一个日志文件,并设置日志文件的大小和保留天数等。

二、自定义日志配置logback-spring.xml
由于日志服务一般都在ApplicationContext创建前就初始化了,它并不是必须通过Spring的配置文件控制。因此通过系统属性和传统的Spring Boot外部配置文件依然可以很好的支持日志控制和管理。在类路径下放置自定义日志配置xml文件,SpringBoot就不会使用它本身的默认日志配置了。

2.1、日志记录框架的默认自定义配置文件名称
下图是SpringBoot官方文档的提示内容,意思是:根据您的日志记录系统,将加载相应的文件使用。即如果我们使用logback日志框架,那么可以使用logback-spring.xml、logback-spring.groovy、logback.xml、logback.groovy之一作为配置文件来加载。

根据不同的日志系统,你可以按如下规则组织配置文件名,并且放在src/main/resources下面就能被正确加载:

Logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy

Log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml

Log4j2:log4j2-spring.xml, log4j2.xml

JDK (Java Util Logging):logging.properties

2.2、SpringBoot推荐使用logback-spring.xml
SpringBoot官方推荐使用logback-spring.xml作为logback框架的自定义日志配置文件(例如:使用logback-spring.xml而不是logback.xml),因为带-spring后缀的配置文件可以使用SpringBoot提供的一些高级功能,如profile多环境日志输出。

将所有日志都存储在一个文件中文件大小也随着应用的运行越来越大并且不好排查问题,正确的做法应该是将 error日志和其他系统输出日志分开,并且不同级别的日志根据时间段进行记录存储。

在 src/main/resources 下创建 logback-spring.xml 文件,分开记录系统输出日志和Error日志:

${CONSOLE\_LOG\_PATTERN} %d{yyyy-MM-dd HH:mm:ss.SSS} \[%thread\] %-5level %logger{36} - %msg%n ${DEV\_FILE\_PATH}/output-%d{yyyy-MM-dd}.log 10MB 60 a 2GB ERROR %d{yyyy-MM-dd HH:mm:ss.SSS} \[%thread\] %-5level %logger{36} - %msg%n ${DEV\_FILE\_PATH}/error-%d{yyyy-MM-dd}.log 10MB 60 2GB 输出结果:

非彩色日志:

彩色日志:

2.3、logback配置文件的节点属性简介
Appender是负责写日志的组件,设置日志信息的去向,常用的有以下几个:

ch.qos.logback.core.ConsoleAppender (控制台)

ch.qos.logback.core.rolling.RollingFileAppender (文件大小到达指定尺寸的时候产生一个新文件)

ch.qos.logback.core.FileAppender (文件)

其中, 标签的 name 属性对应 application.properties 中的 spring.profiles.active 的配置。即 spring.profiles.active 的值可以看作是日志配置文件中对应的 springProfile 是否生效的开关。

(1) logger

用来设置某一个包或者具体的某一个类的日志打印级别、以及指定appender。logger仅有一个name属性,一个可选的level和一个可选的additivity属性。

name:用来指定受此logger约束的某一个包或者具体的某一个类。

level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特殊值INHERITED或者同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前logger将会继承上级的级别。

additivity:是否向上级logger传递打印信息。默认是true。

logger可以包含零个或多个appender-ref元素,标识这个appender将会添加到这个logger。

(2)root

也是logger元素,但是它是根logger。只有一个level属性,因为已经被命名为”root”。

level:用来设置打印级别,大小写无关:TRACE,DEBUG,INFO,WARN,ERROR,ALL和OFF,不能设置为INHERITED或者同义词NULL。默认是DEBUG。

root可以包含零个或多个appender-ref元素,标识这个appender将会添加到这个logger。rootLogger指定日志信息输出到哪个地方,可以同时指定多个输出目的地。

三、多环境输出日志文件
SpringBoot官方建议使用logback-spring.xml作为logback框架的自定义日志配置文件,使用logback-spring.xml而不是logback.xml,因为带-spring后缀的配置文件可以使用使用Spring扩展profile支持,提供profile多环境日志输出得功能。

Logback 配置文件中的 节点指令允许您根据配置文件激活参数(active) 选择性的包含和排查部分配置信息。根据不同环境来定义不同的日志输出,在 logback-spring.xml中使用 节点来定义,方法如下:

为何root配置的INFO,logger特殊指定的包/类日志DEBUG级别,最后也能打印出来?

答案:因为没有设置addtivity=“false” ,如下图即可。

logger有一个属性addtivity="true" 默认就是true,标识向上级传递日志(INFO是DEBUG的上级)。只有显示指定为false时,才不会向上级输出。

(1)可以启动服务的时候指定 profile (如不指定使用默认),如指定prod 的方式为:

java -jar xxx.jar –spring.profiles.active=prod

(2)也可以在yml配置文件中指明当前环境是什么环境,否则启动会报错,如下:

四、 解决 logback.xml 配置文件不生效的问题
问题描述:在resources目录下建立logback-spring配置文件后,只能打印控制台日志,不能创建日志文件。疯狂修改配置文件的内容,就连常用的重启、清除缓存都试过了,但是日志配置依然不生效。所以就查找原因,既然不是配置文件内部的问题,那就是配置文件根本就没起效果。

原因追溯:意外发现SpringBoot项目打包后的target/classes没有包含logback-spring.xml,这就是

logback.xml 配置不起作用的根本原因。

然后发现之前在pom.xml中加了个resources目录下文件的过滤配置,没有保留logback日志文件:

src/main/resources true application-${spring.profiles.active}.yaml application.properties application.properties 解决方案:保留logback-spring.xml和logback.xml配置文件 src/main/resources true application-${spring.profiles.active}.yaml application.properties application.properties logback.xml logback-spring.xml 现在target-classes下有了logback.xml配置文件,相关日志正常生效。

原文链接:https://blog.csdn.net/CSDN2497242041/article/details/122596582


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

相关文章

【腾讯云】AI驱动TDSQL-C Serveress 数据库技术实战营-如何是从0到1体验电商可视化分析小助手得统计功能,一句话就能输出目标统计图

欢迎来到《小5讲堂》 这是《腾讯云》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景效果图流程图创建数据库 基本信息数据库配置设置密码控制台开…

分频器code

理论学习 数字电路中时钟占有非常重要的地位。时间的计算都依靠时钟信号作为基本单元。一般而言&#xff0c;一块板子只有一个晶振&#xff0c;即只有一种频率的时钟&#xff0c;但是数字系统中&#xff0c;经常需要对基准时钟进行不同倍数的分频&#xff0c;进而得到各模块所需…

linux OutOfMemoryError 内存溢出排查

前言 内存溢出我会先分成两种情况。 一种是8g内存服务器分配给服务2g内存&#xff0c;导致服务内存溢出。 一种是8g内存服务器把内存全部分给服务导致的内存溢出。 也就是说一种是给服务加配置&#xff0c;一种需要调整服务的代码处理。 思路整理 日志排查 第一步应该是日志…

使用redis-cli命令实现redis crud操作

项目场景&#xff1a; 线上环境上redis中的key影响数据展示&#xff0c;需要删除。但环境特殊没办法通过 redis客户端工具直连。只能使用redis-cli命令来实现。 操作步骤&#xff1a; 1、确定redis安装的服务器&#xff1b; 2、找到redis的安装目录下 ##找到redis安装目…

用公网服务器实现内网穿透

首先需要一个公网服务器 下载frp 搜索github下载到frp&#xff0c;服务端frps/客户端frpc。。下载的时候要注意自己本地内网机的cpu版本和服务端cpu架构 我的电脑是mac M1PRO版本 下载的是&#xff1a;darwinarm64 比如 服务端一般是Linux&#xff08;Intel 64位CPU&#xf…

Red Hat8:搭建FTP服务器

目录 一、匿名FTP访问 1、新建挂载文件 2、挂载 3、关闭防火墙 4、搭建yum源 5、安装VSFTPD 6、 打开配置文件 7、设置配置文件如下几个参数 8、重启vsftpd服务 9、进入图形化界面配置网络 10、查看IP地址 11、安装ftp服务 12、遇到拒绝连接 13、测试 二、本地…

【Delete 删除数据语法合集】.NET开源ORM框架 SqlSugar 系列

系列文章目录 &#x1f380;&#x1f380;&#x1f380; .NET开源 ORM 框架 SqlSugar 系列 &#x1f380;&#x1f380;&#x1f380; 文章目录 系列文章目录前言 &#x1f343;一、根据实体删除1.1 强类型实体2.2 无主键实体删除2.3 Object、接口、抽象类 删除 二、根据主键三…

Java负载均衡

Java中的负载均衡原理是指通过合理分配网络请求或计算任务的方式&#xff0c;将工作负载分配到多个服务器、处理单元或服务实例上&#xff0c;从而提高系统的性能、可扩展性和可用性。负载均衡不仅可以分散请求压力&#xff0c;还能增强系统的容错能力&#xff0c;避免单点故障…