26. Logging
使用spring-boot-starter
或者spring-boot-starter-logging
引入日志。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
Spring Boot
为JUL
、LOG4J2
、Logback
提供了默认配置
。
默认情况
下,当你引入spring-boot-starter
,默认会使用SLF4J
和Logback
。
如果你需要使用
别的日志实现
或日志门面
,排除相应包
,引入相关包
。
1️⃣ 默认使用SLF4J
和Logback
2️⃣ 在spring-core
中,使用的是spring-jcl
进行日志输出。spring-jcl
可以理解成是SLF4J
、Logback
、JUL
、JCL
等日志框架和日志门面的终极门面
。
26.1 日志格式
默认格式
默认日志格式
如下
2014-03-05 10:57:51.112 INFO 45469 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/7.0.52
2014-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
1️⃣ 日期和时间 - %d{yyyy-MM-dd:hh:mm:ss.SSS}
2️⃣ 日志级别 - %5p
3️⃣ Process ID - PID
4️⃣ 线程名称 - %15.15t
5️⃣ 类和方法名称 - %-40.40logger
6️⃣ 消息 - %msg%n
完整如下
%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID} --- [%15.15t] %40.440logger : %msg%n
支持颜色
可以使用clr(p1){p2}
格式输出带颜色的日志
。
clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow}
支持的颜色如下
blue
cyan
faint
green
magenta
red
yellow
你可以使用spring.output.asni.enabled=always/detect/never
Never
- 表示不使用颜色delect
- 如果终端支持颜色,那么就开启颜色。不支持,就不开启。always
- 永远开启(不要使用,当终端不支持颜色,会导致乱码)
# 终端是否启用颜色 -
spring.output.asni.enabled=delect
设置格式
使用logging.pattern.console
和logging.pattern.file
来设置日志格式
。
# 控制台pattern
logging.pattern.console=%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow} %clr(%5p){} %clr(${PID}){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger){cyan} %clr(:){faint} %msg%n
# 文件pattern
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID} --- [%15.15t] %40.440logger : %msg%n
26.3 文件输出
默认不输出文件。
如果需要使用文件,使用logging.file.path
和logging.file.name
。
# 26.3 文件
logging.file.path=F:/logs/
logging.file.name=F:/logs/sell.log
如果想输出到相对工程路径
,使用相对目录
。
logging.file.path=./logs/
默认情况
,如果你的实现是logback
,还支持
按照大小滚动
按照时间清除备份
按照大小清除备份
# 日志滚动策略
logging.file.max-size=2KB
# 日志滚动名称
logging.pattern.rolling-file-name=F:/logs/sell.%d{yyyy-MM-dd}.%i.log
# 开启之后,根据max-history和totcal-size-cap进行清除 - 仅仅logback生效
logging.file.clean-history-on-start=true
# 日志备份- 最多保存7填报
logging.file.max-history=7
# 日志备份 - 超过2KB,会被删除
loging.file.total-size-cap=2KB
26.4 日志级别
默认情况下,仅仅输出info
级别往上。
设置root级别
使用debug=true
或者logging.level.root=debug
可以设置debug
级别。区别是
debug=true
- 仅仅针对一些模块设置debug
logging.level.root=debug
- 所有模块设置debug
# 26.4 日志级别 - level
debug=true
logging.level.root = debug
对特定包设置level
使用logging.level.包名=级别
。
logging.level.com.yuki=debug
日志组
如果不同的包的日志级别相同
,可以把他们放在一组
,也叫日志组。
比如,我controller
包设置debug
,dao包、service包
设置info
。
使用logging.group.xx=xx,xx
设置日志组
。
# 设置组
logging.group.yweb=com.yuki.log.web
logging.group.ydao=com.yuki.log.service, com.yuki.log.dao
# 设置级别
logging.level.yweb=info
logging.level.ydao=debugxxxxxxxxxx logging.group.yweb=com.yuki.log.weblogging.group.ydao=com.yuki.log.service, com.yuki.log.daologging.level.yweb=infologging.level.ydao=debugloggingproperties
26.6 使用自己的日志配置
springboot
加载日志配置的流程是
- 查看
classpath
中是否有相关日志配置
- 都没有,使用
defaults.xml
和属性配置
也就是说,如果你想自定义更多配置
,比如
按照时间滚动文件
针对不同级别,输出到不同文件名称中
。比如,debug
输出到debug.log
。
Logging System | Customization |
---|---|
Logback | logback-spring.xml ,logback.xml |
Log4j2 | log4j2-spring.xml 或log4j2.xml |
JDK(Java Util 日志记录) | logging.properties |
logback-spring.xml
和logback.xml
区别是。
logback-spring
中提供了spring-profile
和spring-properties
标签,可以给不同环境提供不同配置
。logback-spring
可以访问application.properties
中内容。
如果可能,我们建议您将
-spring
变体用于日志记录配置(例如logback-spring.xml
而不是logback.xml
)。如果使用标准配置位置,Spring 将无法完全控制日志初始化。
使用特定日志
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<!-- 排除logback + slf4j -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 使用 log4j + slf4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
26.7 logback-spring.xml
如果你使用logback-spring.xml
,可以使用springProfile
和logbackproperties
。可以实现
不同环境,配置不同日志路径
<!-- properties - 通用属性 -->
<!-- 样式 -->
<property name="log.pattern" value="%yellow(%d{yyyy-MM-dd HH:mm:ss.SSS}) %5level %magenta(${PID}) --- %magenta([%15.15t]) %cyan(%-40.40logger{39}) : %msg%n" />
<property name="log.maxHistory" value="30" />
<property name="log.level" value="info" />
<!-- 🌻spring-profile - 设置文件路径🌻 -->
<springProfile name="dev">
<!-- 🌻设置属性 🌻-->
<springProperty name="log.path" source="log.path" defaultValue="F:/logs/dev/" />
</springProfile>
<springProfile name="prod">
<!-- 🌻设置属性 🌻-->
<springProperty name="log.path" source="log.path" defaultValue="F:/logs/prod/" />
</springProfile>
26.8 汇总
logback配置文件
<?xml version="1.0" encoding="utf-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- properties - 通用属性 -->
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5level ${PID} --- [%15.15t] %-40.40logger{39} : %msg%n" />
<property name="log.path" value="F:/logs/" />
<property name="log.maxHistory" value="30" />
<property name="log.level" value="debug" />
<!-- appender - 输出 -->
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${log.pattern}</pattern>
<charset>utf-8</charset>
</encoder>
</appender>
<appender name="debugAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${log.pattern}</pattern>
</encoder>
<file>${log.path}/debug.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/debug/debug-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>${log.maxHistory}</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="infoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${log.pattern}</pattern>
</encoder>
<file>${log.path}/info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/info/info-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>${log.maxHistory}</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${log.pattern}</pattern>
</encoder>
<file>${log.path}/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error/error-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>${log.maxHistory}</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- logger - 日志记录器 -->
<logger name="root" level="info">
<appender-ref ref="consoleAppender" />
</logger>
<logger name="com.yuki" level="${log.level}" additivity="true">
<appender-ref ref="debugAppender" />
<appender-ref ref="infoAppender" />
<appender-ref ref="errorAppender" />
</logger>
</configuration>
application.proerties中的常用log属性
# 26.1 日志格式 - pattern
# 日志颜色
spring.output.ansi.enabled=detect
# 日志格式 - 有颜色
logging.pattern.console=%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow} %clr(%5p){} %clr(${PID}){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger){cyan} %clr(:){faint} %msg%n
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID} --- [%15.15t] %40.440logger : %msg%n
# 26.3 文件 - file
logging.file.path=F:/logs/
logging.file.name=F:/logs/sell.log
# 日志滚动
logging.file.max-size=2KB
# 文件名称 - 仅当日志实现是logack时候,才生效(支持)
logging.pattern.rolling-file-name=F:/logs/sell.%d{yyyy-MM-dd}.%i.log
# 开启之后,根据max-history和totcal-size-cap进行清除 - 仅仅logback生效
logging.file.clean-history-on-start=true
# 最多保存7天
logging.file.max-history=7
# 日志备份超过2KB,会被删除
logging.file.total-size-cap=2KB
# 26.4 日志级别 - level
# root设置级别
debug=true
logging.level.root = debug
# 自己的包设置级别
logging.level.com.yuki=debug
# 日志组
logging.group.yweb=com.yuki.log.web
logging.group.ydao=com.yuki.log.service, com.yuki.log.dao
logging.level.yweb=info
logging.level.ydao=debug
属性 | 变量 | 作用 |
---|---|---|
logging.pattern.console | CONSOLE_LOG_PATTERN | 🍎控制台pattern |
logging.pattern.file | FILE_LOG_PATTERN | 🍎文件pattern |
spring.output.ansi.enabled | 🍎是否启用颜色 | |
logging.file.path | 🍐日志目录 | |
logging.file.name | LOG_FILE | 🍐日志文件 |
logging.file.max-size | LOG_FILE_MAX_SIZE | 🍐最大滚动大小 |
logging.pattern.rolling-file-name | 🍐滚动名称 | |
logging.file.max-history | LOG_FILE_MAX_HISTORY | 🍐保存时间 |
logging.file.total-size-cap | 🍐超过,备份会被清除 | |
logging.file.clean-history-on-start | 🍐启动时候,清除 | |
debug | 🍇日志级别 | |
logging.level.xxx | 🍇保日志级别 | |
logging.group.xxx | 🍇日志组 |