SpringBoot 日志记录

简介

  1. Spring 使用commons-loggin作为内部日志,但底层日志实现是开放的,可对接其它日志框架。

  2. 支持jullog4j2logback等。SpringBoot 提供了默认的控制台输出配置,也可以配置日志输出为文件。

  3. SpringBoot 默认使用的是logback

日志配置

  1. 每个starrer场景,都会导入一个核心场景spring-boot-starter。

  2. 核心场景引入了日志的所有功能spring-boot-starter-logging。

  3. 默认使用logback+slf4j组合作为默认底层日志

  4. 日志是系统一启动就要用,xxxAutoConfiguration是系统启动好了以后放好的组件,后来用的。

  5. 日志是利用监听器机制配置好的,ApplicationListener。

  6. 日志所有的配置都可以通过修改配置文件实现。以loggin开始的所有配置。

日志格式

Drawing

注意:logback没有FATAL级别,对应的是ERROR

# 控制台日志输出格式
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} ==> %msg%npro
Drawing
自定义日志示例

我们会发现自定义的没颜色,SpringBoot的默认日志为我们设置了颜色等更多的配置。

我们也可以单独来设置日志的输出时间格式

# 日志时间格式
logging.pattern.dateformat=yyyy-MM-dd HH:mm:ss.SSS
Drawing
SpringBoot 日志示例

记录日志

@RestController
public class UserController {
    Logger logger = LoggerFactory.getLogger(getClass());
    @GetMapping("/user")
    public String getUser() {    
        logger.info("user info");
        return "Hello Spring Boot!";
    }
}
Drawing
业务中记录日志的方式

日志级别

  • 由低到高:ALL < TRACE < DEBUG < INFO < WARN < EROR < FATAL < OFF

  • ALL:打印所有日志。

  • TRACE:追踪框架详细流程日志,一般不使用。

  • DEBUG:开发调试细节日志。

  • INFO:关键、感兴趣日志。

  • WARN:警告信息。

  • ERROR:业务错误日志,记录各种异常。

  • FATAL:致命错误,比如jvm系统奔溃。

  • OFF:关闭所有日志记录

不指定级别的所有类,都使用root指定的级别作为默认级别,SpringBoot日志的默认值级别是INFO。

application.properties中配置loggin.level.<logger-name>=<level>指定日志级别

# root logger
logging.level.root=info
# mybatis logger
logging.level.com.github.pagehelper=info
# controller logger
logging.level.com.example.demo.controller=info

日志分组

将相关的logger分组在一起,统一配置。例如:Tomcat相关日志统一设置

logging.group.tomcat=org.apache.catalina,org.apache.coyote,org.apache.tomcat
logging.level.tomcat=trace

SpringBoot预定义两个组

Name
Loggers

web

org.springframework.core.codec, org.springframework.http, org.springframework.web, org.springframework.boot.actuate.endpoint.web, org.springframework.boot.web.servlet.ServletContextInitializerBeans

sql

org.springframework.jdbc.core,

org.hibernate.SQL,

org.jooq.tools.LoggerListener

文件输出

SpringBoot默认只是把日志写在控制台,如果想要额外记录到文件,可以在application.properties添加logging.file.name或logging.file.path配置。

loggin.file.name
logging.file.path
示例
效果

未指定

未指定

仅控制台输出

指定

未指定

my.log

写入文件

未指定

指定

/var/log

写入指定目录,文件名为spring.log

指定

指定

以loggin.file.name为准

文档归档与滚动切割

  • 归档:每天的日志单独存到一个文档中。

  • 切割:每个文件10MB,超过大小切割成另外一个文件。

每天的日志应单独分割出来存档,如果使用logback,可以通过application.yaml文件指定规则。

如果是其它日志系统,需自行配置(添加log42.xml或log4j-spring.xml)

# 日志的文件名格式,默认为:${LOG_FILE}.%d{yyyy-MM-dd}.log
logging.logback.rollingpolicy.file-name-pattern=logs/rolling.%d{yyyy-MM-dd}.%i.gz
# 日志保存的天数,默认为值为7
logging.logback.rollingpolicy.max-history=30
# 日志文件的最大大小,默认为:10MB
logging.logback.rollingpolicy.max-file-size=10MB
# 日志文件的总大小默认为:0,即不限制
logging.logback.rollingpolicy.total-size-cap=1GB

切换日志组合

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <!-- 首先排除 SpringBoot 自带的日志包-->
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- log4j2 日志包 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

log4j2支持yaml和json格式的配置文件

格式
依赖
文件名

YAML

com.fasterxml.jackson.core:jackson-databind + com.fasterxml.jackson.dataformat:jackson-dataformat-yaml

log4j2.yaml + log4j2.yml

JSON

com.fasterxml.jackson.core:jackson-databind

log4j2.json + log4j2.jsn

最佳实践

  1. 导入任何第三方框架之前,首先要排除它的日志包,因为SpringBoot底层控制好了日志。

  2. 修改application.properties配置文件,就可以调整日志的所有行为。甚至可以编写日志框架自己的配置文件放在类路径下就行,比如logback-spring.xmllog4j2-spring.xml

  3. 如需对接专业日志系统,只需要把logback记录的日志灌到kafka之类的中间接。

最后更新于

这有帮助吗?