依赖配置
默认情况下,Spring Boot
会用logback
来记录日志,并用INFO
级别输出到控制台。
logback
是 Spring Boot
默认的日志框架 ,spring-boot-starter
中包含了 spring-boot-starter-logging
。
若非Spring Boot
环境则需要添加以下依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
日志级别
日志级别从低到高分为:
TRACE
< DEBUG
< INFO
< WARN
< ERROR
< FATAL
例如:日志级别设置为 WARN
,则低于 WARN
的信息都不会输出。
Spring Boot
中默认级别为INFO
,即只会输出ERROR
、WARN
和INFO
级别的日志输出到控制台。
日志配置
application.yml
日志级别
logging.level.*
: 设置指定package前缀内日志输出内容的级别
控制台输出
logging.pattern.console
:设置控制台中输出的日志的样式
文件输出
-
logging.pattern.file
:设置日志文件中日志的样式 -
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
生效
logback-spring.xml
使用xml
后要将application.yml
中的配置去掉,避免冲突。
默认情况下将logback-spring.xml
放在resources
目录下,就能自动被Spring Boot
加载。
想要自定义文件名可配置application.yml
中logging.config
指定配置文件名。
根节点<configuration>
-
scan
:设置为true
时,配置文件如果发生改变,将会被重新加载,默认值为true
。 -
scanPeriod
:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan
为true
时,此属性生效。默认的时间间隔为1分钟。 -
debug
:当此属性设置为true
时,将打印出logback
内部日志信息,实时查看logback
运行状态。默认值为false
。
二级节点<root>
root
节点是必选节点,用来指定最基础的日志输出级别,只有一个level
属性。
-
level
:用来设置打印级别,大小写不敏感,可填入TRACE
,DEBUG
,INFO
,WARN
,ERROR
,ALL
和OFF
,不能设置为INHERITED
或者同义词NULL
。默认为DEBUG
。可以包含零个或多个元素,标识这个logger
的内容将会输出到这个appender
。<root level="info"> <appender-ref ref="CONSOLE"/> <appender-ref ref="FILE_INFO"/> </root>
二级节点<contextName>
默认上下文名称为default
。可以设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改,可以通过%contextName
来打印日志上下文名称,一般不用这个属性,可有可无。
<contextName>logback</contextName>
二级节点<property>
用来定义变量值的标签, 有两个属性
name
:设置属性名,可以使用${name}
来使用变量value
:设置name
对应的值
二级节点<include>
引用其他xml
配置,例如引用默认的控制台日志输出实现
-
resource
:设置引用文件位置<!--使用默认的控制台日志输出实现--> <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
二级节点<springProperty>
读取application.yml
内的配置定义变量值
-
name
:定义变量名 -
scope
:指定存储属性作用域,一般填写context
-
source
:设置application.yml
中的配置名 -
defaultValue
:设置默认值,若application.yml
中无此配置项则使用该默认值<!--日志文件保存路径--> <springProperty name="LOG_FILE_PATH" scope="context" source="logging.file.path" defaultValue="./logs"/>
二级节点<appender>
appender
用来格式化日志输出节点,用来指定控制台输出策略和文件输出策略。
name
:设置该appender
的名称class
:设置该appender
的输出策略
控制台输出ConsoleAppender
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<appender name="consoleLogLayout" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
</layout>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<appender name="consoleLogEncoder" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
</filter>
</appender>
<root level="INFO">
<!--appender将会添加到这个loger-->
<appender-ref ref="consoleLogLayout"/>
<appender-ref ref="consoleLogEncoder"/>
</root>
</configuration>
输出到文件RollingFileAppender
日志输出到文件,随着应用的运行时间越来越长,日志也会增长的越来越多,将他们输出到同一个文件并非一个好办法。RollingFileAppender
用于切分文件日志
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
<File>${logback.logdir}/info.${logback.appname}.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${logback.logdir}/info.${logback.appname}.%d{yyyy-MM-dd}.log</FileNamePattern>
<maxHistory>90</maxHistory>
<maxFileSize>10MB</maxFileSize>
</rollingPolicy>
<encoder>
<charset>UTF-8</charset>
<pattern>%d [%thread] %-5level %logger{36} %line - %msg%n</pattern>
</encoder>
</appender>
通用三级节点<layout>
,<encoder>
class
:指定实现类
layout
和encoder
,都可以将事件转换为格式化后的日志记录,encoder
就是把 LoggingEvent
转化为字节数组并向 OutputStream
(输出流)写出,layout
就是能够把 LoggingEvent
转换成字符串。
相比较之下,layout
既不能控制 LoggingEvent
何时输出,也不能把 LoggingEvent
聚合成批(batches)。 但是encoder
既能控制LoggingEvent
输出格式,也能控制LoggingEvent
何时输出。
一般控制台输出使用layout
,文件输出使用encoder
。
有以下子节点:
-
<pattern>
:表示对日志进行编码:-
%d{HH: mm:ss.SSS}
——日志输出时间 -
%thread
——输出日志的进程名字,这在Web应用以及异步任务处理中很有用 -
%-5level
——日志级别,并且使用5个字符靠左对齐 -
%logger{36}
——日志输出者的名字 -
%msg
——日志消息 -
%n
——平台的换行符
-
-
<charset>
:表示对日志进行编码的编码字符集设定,例如UTF-8
通用三级节点<filter>
-
class
:指定过滤策略-
ch.qos.logback.classic.filter.ThresholdFilter
:级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath
和onMismatch
接收或拒绝日志。有以下子节点:<level>
:设置过滤级别
-
ch.qos.logback.classic.filter.LevelFilter
:临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL
;当日志级别低于临界值时,日志会被拒绝。有以下子节点:-
<level>
:设置过滤级别 -
<onMatch>
:用于配置符合过滤条件的操作 -
<onMismatch>
:用于配置不符合过滤条件的操作
-
-
RollingFileAppender
三级节点<File>
配置日志名称,如果没有<File>
属性,那么只会使用<rollingPolicy>
内的<FileNamePattern>
的文件路径规则,如果同时有<File>
和<FileNamePattern>
,那么当天日志是<File>
,明天会自动把今天的日志改名为今天的日期。即<File>
的日志都是当天的
RollingFileAppender
三级节点<rollingPolicy>
class
:指定滚动策略ch.qos.logback.core.rolling.TimeBasedRollingPolicy
:按照时间滚动
有以下子节点:
<FileNamePattern>
:设置文件命名格式<maxHistory>
:日志文件保留天数,默认7天<maxFileSize>
:设置日志文件大小,超过就重新生成文件,默认10M
二级节点<logger>
name
:指定受此logger
约束的某一个包或者具体的某一个类level
:设置日志打印级别,大小写不敏感,若未设置此属性,当前logger
将会继承上级的配置addtivity
:是否向上级logger
传递打印信息。默认是true
带有logger
的配置,不指定级别,不指定appender
logback-spring.xml
增加 logger
配置如下:
<logger name="com.example.controller"/>
<root level="info">
<appender-ref ref="console"/>
</root>
<root level="info">
将root
的打印级别设置为info
,指定了名字为console
的appender
。
<logger name="com.example.controller" />
将控制controller
包下的所有类的日志的打印,但是并没用设置打印级别,所以继承他的上级的日志级别“info”
;没有设置addtivity
,默认为true,将此loger
的打印信息向上级传递;没有设置appender
,此logger
本身不打印任何信息。
当执行com.example.controller
包中类的方法时,首先执行<logger name="com.example.controller"/>
,将级别为info
及大于info
的日志信息传递给root
,本身并不打印; root
接到下级传递的信息,交给已经配置好的名为console
的appender
处理,名为console
的 appender
将信息打印到控制台
带有多个loger
的配置,指定级别,指定appender
logback-spring.xml
增加 logger
配置如下:
<logger name="com.example.controller" level="WARN" additivity="false">
<appender-ref ref="console"/>
</logger>
<root level="info">
<appender-ref ref="console"/>
</root>
控制com.example.controller
包下的类的日志打印,打印级别为“WARN
”; additivity
属性为false
,表示此loger
的打印信息不再向上级传递;指定了名字为“console
”的appender
;
这时候执行com.example.controller
包下的类的方法时,先执行<logger name="com.example.controller" level="WARN" additivity="false">
,将级别为WARN
及大于WARN
的日志信息交给此logger
指定的名为console
的appender
处理,在控制台中打出日志,不再向上级root
传递打印信息。
二级节点<springProfile>
-
name
:指定输出环境,可以选择多个环境,用,
隔开<configuration> ... <!-- 测试环境+开发环境. 多个使用逗号隔开 --> <springProfile name="test,dev"> <logger name="com.example.controller" level="DEBUG" additivity="false"> <appender-ref ref="consoleLog"/> </logger> </springProfile> <!-- 生产环境 --> <springProfile name="prod"> <logger name="com.example.controller" level="INFO" additivity="false"> <appender-ref ref="consoleLog"/> </logger> </springProfile> </configuration>
参考
Spring Boot 日志配置(超详细) - 简书 (jianshu.com)
logback_2-Encoder,Layout_胡小禾的博客-CSDN博客
springboot超级详细的日志配置(基于logback) - 腾讯云开发者社区-腾讯云 (tencent.com)
logback Filter LevelFilter ThresholdFilter - Dandwj - 博客园 (cnblogs.com)