1、末尾有完整配置文件
2、日志分为五个等级,按照优先级的高低可以分为:
TRANCE < DEBUG < INFO < WARN < ERROR
springboot
默认是INFO
,因此低于INFO
的TRACE
和DEBUG
都不会输出。
可以在properties
或yaml
配置文件中修改日志级别:
logging:
level:
root: debug
这里的root
可以换成包名,精细控制不同包的日志输出级别,比如:
logging:
level:
com.example.controller: debug
com.example.mapper: error
3、其次,logback的日志分为控制台日志和文件日志。
控制台日志:也就是我们IDE运行项目时,控制台打印的信息。
文件日志:项目运行时,将运行信息写入到指定文件。需要在springboot
配置文件或logback
配置文件中指定日志文件的位置。
org.springframework.boot
spring-boot-starter-logging
解释:按理来讲需要引入的是spring-boot-starter-logging
依赖,但是spring-boot-starter-web
间接依赖于spring-boot-starter-logging
,所以我们只需要引入spring-boot-starter-web
即可。
logback
会自动寻找classpath
根部下面的logback.xml
,所以我们只需要在resource
目录下创建logback.xml
文件,就可以在程序启动时,自动加载自定义日志的配置文件。
如果不想叫logback.xml
,想起一个有个性的名字,比如cxkLogback.xml
,那么需要在properties
或yaml
配置文件指定logback
文件路径:
logging:
config: classpath:cxkLogback.xml
如果想验证一下,可以将下方概览中的配置文件复制到自己的项目中运行一下,观察控制台的日志输出格式。
可以简单先看一个配置文件的案例
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
logs/app.log
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
这个文件主要定义了两个Appender
,分别输出日志到控制台和文件中。
其次定义root
目录的日志级别,并将两个Appender
配置到root
目录下,进行日志输出。
这里的root
标签里面定义了level
,有没有感觉在哪里见过这个东西?
没错,上文讲到,我们可以在properties
或yaml
配置文件中修改日志级别,在springboot
配置文件中的操作,和这里的操作是等价的。那么按照同样的道理,这里的root
也可以细化成不同的包,配置不同的level
和Appender
。这里只是引出这个概念,具体的内容放在下文。
:logback配置的根标签。它包含三个属性:scan
、scanPeriod
、debug
。
scan
:当配置文件修改后,将会重新载入。值为true
或false
。scanPeriod
:时间间隔。每隔一段时间检测一次配置文件是否被修改。值可以是60
或12 second
,数字是自定义的,不是非要填60
或12
,如果没有给出时间单位,默认单位是毫秒。当scan
为true
时,此属性生效。debug
:是否打印logback
内部日志信息,实时查看logback运行状态。值为true
或false
(默认)。
:可以理解成负责写日志的工具人。一个Appender
就是一个工具人。
:设置某一个包或具体的类的日志打印级别,以及指定的Appender
(分配打工人)。
:根logger
,也是logger
的一种,且只有一个level
属性。
contextName
:每个logger
都关联到logger
上下文,默认上下文名称为default
。但可以使用contextName
标签设置成其他名字,用于区分不同应用程序的记录。
property
:用来定义变量值的标签,property
标签有两个属性,name
和value
;其中name
的值是变量的名称,value
的值时变量定义的值。通过property
定义的值会被插入到logger
上下文中。定义变量后,可以使“${name}”
来使用变量。
Appender
的种类:
举个例子:%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
:行号。
%level | %d{yyyy-MM-dd HH:mm:ss,Asia/Shanghai} | [%thread] | %-4relative | %logger{40}| -- %msg%n
UTF-8
${springFilePath}/spring.log
%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %thread -- %msg%n
utf-8
${springFilePath}/spring.%d{yyyy-MM-dd}.%i.log
200MB
60
20GB
只需要在xml配置文件里引入配置文件即可。
什么?你问我这个文件去哪里找?根据resource
里面的路径,去lib目录的springboot依赖中找。
使用形如%clr(){red}
来给日志标签配置颜色。
要使用%clr
,有两种方式:
第一种是引入方式一的默认配置文件,在该文件里面就帮我们引入了%clr
。
第二种方式就是手动引入%clr
,可以参考一下defaults.xml
。
%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
高亮。
第一步、新建一个高亮颜色配置类。
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
的值固定为highlight
,converterClass
的值为我们上一步写的配置类。
第三步、编写pattern
%highlight(%level) | %clr(%d{yyyy-MM-dd HH:mm:ss,Asia/Shanghai}){magenta} | [%thread] | %-4relative | %clr(%logger{40}){magenta}| -- %msg%n
%highlight(%level) | %clr(%d{yyyy-MM-dd HH:mm:ss,Asia/Shanghai}){magenta} | [%thread] | %-4relative | %clr(%logger{40}){magenta}| -- %msg%n
UTF-8
${springFilePath}/spring.log
${springFilePath}/spring.%d{yyyy-MM-dd}.%i.log
200MB
60
20GB
%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %thread -- %msg%n
utf-8
1
文件路径有两种方式配置,分别是file
和path
,或者在xml文件中配置。
注:file和path二者不能同时使用,如若同时使用,则只有logging.file生效
logging.file=文件名
logging.path=日志文件路径
logging.level.包名=指定包下的日志级别
logging.pattern.console=日志打印规则
logging.file=my.log
logging.path=/var/log
注:二者不能同时使用,如若同时使用,则只有logging.file生效,可以看到这种方式配置简单,但是能实现的功能也非常有限,如果想要更复杂的需求,就需要下面的定制化配置了。
完整报错如下:
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
,需要引入默认的配置文件
或手动引入%clr
使用颜色输出会将颜色转换成ANSI码,不会有颜色,可读性较差。
【1】SpringBoot+logback优雅的配置日志
【2】logback官方配置文档