SpringBoot 默认使用 Logback 作为日志输出工具,同时也支持 Java Util Logging 及 Log4J2。
一、显式引入 logback 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
二、设置日志输出级别
日志级别从低到高分为
TRACE < DEBUG < INFO < WARN < ERROR < FATAL
日志级别配置的前缀为 logging.level
root 用于设置应用的日志级别,也可以对指定包设置单独的日志级别
logging.level.root=WARN
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=ERROR
三、文件输出
默认情况下,SpringBoot 只输出日志至控制台,不会输出到文件。
但其实 SpringBoot 的日志默认配置中是有设置文件输出的,通过属性 logging.file 或 logging.path 进行开启
logging.file 设置文件,可以是绝对路径,也可以是相对路径。该配置比 logging.path 优先级更高。
logging.path 设置目录,会在该目录下创建spring.log文件。
logging.path=/var/log/
logging.file=/var/log/log.log
三、自定义 logback 日志输出
SpringBoot 默认会加载 logback-spring.xml 或者 logback.xml 中的配置,SpringBoot 推荐使用 logback-spring.xml。
日志中可以使用的配置属性
属性名 参数名 说明
logging.exception-conversion-word LOG_EXCEPTION_CONVERSION_WORD
logging.file LOG_FILE 日志输出文件名
logging.path LOG_PATH 日志输出路径
logging.file.max-size LOG_FILE_MAX_SIZE 输出日志文件大小限制
logging.file.max-history LOG_FILE_MAX_HISTORY 输出日志保留数量
logging.pattern.console CONSOLE_LOG_PATTERN 日志输出格式(命令行)
logging.pattern.dateformat LOG_DATEFORMAT_PATTERN 日志输出时间格式
logging.pattern.file FILE_LOG_PATTERN 日志输出格式(文件)
logging.pattern.level LOG_LEVEL_PATTERN 日志级别输出格式,默认为(%5p)
PID PID 当前应用的PID
格式
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
...
</configuration>
参数介绍
scan 为 true 时,配置文件如果发生改变,将会被重新加载,默认为 true。
scanPeriod 扫描间隔时间,默认单位为毫秒,默认为 1 分钟。
debug 为 true 时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
节点介绍
1、contextName
设置上下文名称,默认为 default,通过 %contextName 来打印日志上下文名称,一般来说我们不用这个属性。
<contextName>logback</contextName>
2、property
设置变量,可以使“${}”来使用变量。
<property name="CONSOLE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p --- [%15.15t] %-40.40logger{39} : %m%n"/>
<property name="LOG_FILE" value="spring.log"/>
<property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p --- [%t] %-40.40logger{39} : %m%n"/>
3、root
必选节点,用来指定日志输出级别,只有一个level属性,默认是DEBUG。
<root level="debug">
<appender-ref ref="console" />
<appender-ref ref="file" />
</root>
4、appender
ConsoleAppender
输出至控制台
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
RollingFileAppender
输出至文件,当文件达到指定大小时自动进行切分
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<!-- 如果没有 file 属性,那么只会使用 fileNamePattern 的文件路径规则 -->
<!-- 如果即有 file 属性又有 fileNamePattern 属性,那么当天日志文件名使用 file 的配置,而以往的日志文件则会使用 fileNamePattern 的配置-->
<file>${LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 文件路径,定义了日志的切分方式,把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间 -->
<fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
<!-- 单个日志文件最大值,大于该值时则会根据 fileNamePattern 规则 %i 生成新的日志文件 -->
<maxFileSize>10MB</maxFileSize>
<!-- 只保留最近30天的日志 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
5、logger
对指定包或者指定类进行日志输出设置
设置包 com.msf.controller 的日志打印级别为 warn,且只在命令行输出
<logger name="com.msf.controller" level="WARN" additivity="false">
<appender-ref ref="console"/>
</logger>
测试
@RequestMapping("/")
public String sayHello() {
LOGGER.info("info");
LOGGER.debug("debug");
LOGGER.warn("warn");
LOGGER.error("error");
return "Hello";
}
可以看到命令行输出内容如下,info 以及 debug 的内容并没有被输出,查看日志文件则没有任何输出
WARN --- [nio-8080-exec-2] com.msf.controller.HelloController : warn
ERROR --- [nio-8080-exec-2] com.msf.controller.HelloController : error
范围有重叠的话,范围小的有效。
6、springProfile
多环境日志输出,多个 profile 使用逗号间隔,也可以使用 ! 表示否的意思
<!-- 开发、测试环境 -->
<springProfile name="test,dev">
<logger name="com.msf.controller" level="DEBUG" additivity="false">
<appender-ref ref="console"/>
</logger>
</springProfile>
<!-- 生产环境 -->
<springProfile name="prod">
<logger name="com.msf.controller" level="WARN" additivity="false">
<appender-ref ref="console"/>
<appender-ref ref="file" />
</logger>
</springProfile>
配置 profile
spring.profiles.active=dev
7、springProperty
在日志配置文件中引用 application.properties 配置
在 application.properties 中添加配置
app.name=msf
在 logback-spring.xml 中添加 springProperty 元素对 app.name 进行引用
<springProperty scope="context" name="appname" source="app.name"/>
springProperty 的使用跟 property 元素是一样的
最后帖一下通过本文系列操作后,形成最终配置文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<springProperty scope="context" name="appName" source="app.name"/>
<property name="CONSOLE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${appName}--- [%15.15t] %-40.40logger{39} : %m%n"/>
<property name="LOG_FILE" value="spring.log"/>
<property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p --- [%t] %-40.40logger{39} : %m%n"/>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<!-- 如果没有 file 属性,那么只会使用 fileNamePattern 的文件路径规则 -->
<!-- 如果即有 file 属性又有 fileNamePattern 属性,那么当天日志文件名使用 file 的配置,而以往的日志文件则会使用 fileNamePattern 的配置-->
<file>${LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 文件路径,定义了日志的切分方式,把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间 -->
<fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
<!-- 单个日志文件最大值,大于该值时则会根据 fileNamePattern 规则 %i 生成新的日志文件 -->
<maxFileSize>10MB</maxFileSize>
<!-- 只保留最近30天的日志 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<!-- 开发、测试环境 -->
<springProfile name="test,dev">
<logger name="com.msf.controller" level="DEBUG" additivity="false">
<appender-ref ref="console"/>
</logger>
</springProfile>
<!-- 生产环境 -->
<springProfile name="prod">
<logger name="com.msf.controller" level="WARN" additivity="false">
<appender-ref ref="console"/>
<appender-ref ref="file" />
</logger>
</springProfile>
<root level="debug">
<appender-ref ref="console" />
<appender-ref ref="file" />
</root>
</configuration>