目录
Spring Boot在所有内部日志中使用Commons Logging,但是默认配置也提供了对常用日志的支持,如:Java Util Logging,Log4J, Log4J2和Logback。每种Logger都可以通过配置使用控制台或者文件输出日志内容。
1 配置 logback
默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台。
1.1 日志格式
SpringBoot 的默认输出的日志格式如下:
输出如下元素:
- 时间日期:精确到毫秒,可以用于排序
- 日志级别:ERROR、WARN、INFO、DEBUG、TRACE
- 进程ID
- 分隔符:采用
---
来标识日志开始部分 - 线程名:方括号括起来(可能会截断控制台输出)
- Logger名:通常使用源代码的类名
- 日志内容:我们输出的消息
Logback 是没有FATAL级别的日志,它将被映射到ERROR。
日志级别从低到高分为:TRACE< DEBUG< INFO< WARN< ERROR< FATAL。
1.2 日志输出
SpringBoot 默认为我们输出的日志级别为INFO、WARN、ERROR,如需要使用 “debug”,可以通过以下方式开启
- 命令模式配置: java -jar myapp.jar --debug
- 资源文件配置:在 application.properties 配置 “debug=true”
1.3 文件保存
默认情况下,SpringBoot 仅将日志输出到控制台,不会写入到日志文件中去。如果除了控制台输出之外还想写日志文件,则需要在 application.properties 设置 logging.file 或 logging.path 属性。
日志文件在达到10 MB 时进行切割,默认情况下会记录 ERROR、WARN、INFO 级别消息。
- logging.file.max-size:限制日志文件大小
- logging.file.max-history:限制日志保留天数
1.4 配置日志文件
默认情况下,Logback 用 INFO 级别输出到控制台,不会保存到文件。
spring boot 默认会加载 classpath:logback-spring.xml 或者 classpath:logback-spring.groovy。如需要自定义文件名称,在 application.properties 中配置 logging.config 选项即可。
1.4.1 默认情况
测试代码:
package com.example.demo.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/log")
public class LogController {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@RequestMapping("writelog")
public String writeLog() {
logger.debug("This is a debug message");
logger.info("This is an info message");
logger.warn("This is a warn message");
logger.error("This is an error message");
return "OK";
}
}
在浏览器中输入http://localhost:8080/log/writelog 将会看到以下结果:
没有配置任何其它配置,就可以看到来自logback root logger的输出信息。我们注意到debug级别的日志没有记录下来,那是因为Spring Boot为Logback提供了默认的配置文件 base.xml。
base.xml内容:
<?xml version="1.0" encoding="UTF-8"?>
<!--
Base logback configuration provided for compatibility with Spring Boot 1.1
-->
<included>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
<include resource="org/springframework/boot/logging/logback/file-appender.xml" />
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</included>
base.xml 中 root logger的日志级别被重写为Info级别,这就是上面例子中debug级别的日志没有打印的原因。
1.4.2 通过application.properties文件对Logback进行配置
配置日志文件:log.log
配置 com.example.demo.controller 日志级别为:debug
logging.file=log.log
logging.level.com.example.demo.controller = debug
结果:
1.4.3 通过额外的文件配置Logback
在 src/main/resources 下创建 logback-spring.xml 文件,实例如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<property name="PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n" />
<!--文件路径 -->
<property name="LOG_HOME" value="/indexdata/log/"/>
<!-- 开发环境 -->
<springProfile name="dev">
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${PATTERN}</pattern>
</encoder>
</appender>
<logger name="com.example.demo" level="debug"/>
</springProfile>
<!-- 测试 正式 环境 -->
<springProfile name="test,prod">
<!-- 每天产生一个文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 文件名称 -->
<fileNamePattern>${LOG_HOME}/info/info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 30天 -->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${PATTERN}</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>100MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 出错日志 appender -->
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/error/error.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${PATTERN}</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>100MB</MaxFileSize>
</triggeringPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 -->
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<logger name="com.example.demo" level="INFO">
<appender-ref ref="FILE"/>
<appender-ref ref="ERROR"/>
</logger>
</springProfile>
</configuration>
1.4.1 <springProfile>
<springProfile> 标签使我们让配置文件更加灵活,它可以选择性的包含或排除部分配置。
<springProfile name="dev">
<!-- 开发环境时激活 -->
</springProfile>
<springProfile name="dev,test">
<!-- 开发,测试的时候激活-->
</springProfile>
<springProfile name="!prod">
<!-- 当 "生产" 环境时,该配置不激活-->
</springProfile>
1.4.2 <appender>
格式化日志输出节点,有俩个属性name和class,class用来指定哪种输出策略,常用就是控制台输出策略和文件输出策略。
控制台输出ConsoleAppender:ch.qos.logback.core.ConsoleAppender
输出到文件 RollingFileAppender:ch.qos.logback.core.rolling.RollingFileAppender
1.4.3 <loger>
<loger>用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<
appender>。有三个属性:
name: 用来指定受此loger约束的某一个包或者具体的某一个类。
level: 用来设置打印级别:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
addtivity: 是否向上级loger传递打印信息。默认是true。
2 配置 log4j2
主要介绍spring boot集成log4j2日志框架。
2.1 添加依赖
打开pom.xml文件,去除logback的依赖包,添加log4j2的依赖包
2.2 配置文件
默认的properties配置对log4j2不够友好,我们应用外部配置文件,在资源文件夹src/main/resources下添加log4j2.xml或者log4j2-spring.xml,启动后spring boot自动加载,配置文件的示例如下:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<properties>
<!-- 文件输出格式 -->
<property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} |-%-5level [%thread] %c [%L] -| %msg%n</property>
</properties>
<appenders>
<Console name="CONSOLE" target="system_out">
<PatternLayout pattern="${PATTERN}" />
</Console>
</appenders>
<loggers>
<logger name="com.roncoo.education" level="debug" />
<root level="info">
<appenderref ref="CONSOLE" />
</root>
</loggers>
</configuration>
参考: