Skip to content

日志配置

简介

  • Spring 使用 commons-logging 作为内部日志,但底层日志实现是开发的,可对接其他日志框架
  • 支持 jullog4j2logback
  • 默认使用 logback

Springboot 如何把日志默认配置好的

1、每个 starter 场景,都会引入一个核心场景 spring-boot-starter

2、核心场景引入了日志配置 spring-boot-starter-logging

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

4、日志是系统一启动就要用, xxxAutoConfiguration 是系统启动好了之后放进去的组件,因此日志是用监听器机制配置的 ApplicationListener

5、日志的所有功能都可以通过修改配置文件来实现

日志格式

shell
2024-12-26T16:35:30.770+08:00  INFO 28628 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port 8080 (http)
2024-12-26T16:35:30.798+08:00  INFO 28628 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]

默认输出格式:

  • 时间和日期:毫秒级精度
  • 日志级别:ERROR, WARN, INFO, DEBUG, or TRACE.
  • 进程 ID
  • ---: 消息分割符
  • 线程名: 使用[]包含
  • Logger 名: 通常是产生日志的类名
  • 消息: 日志记录的内容

记录日志

java
Logger logger = LoggerFactory.getLogger(getClass());
logger.info("哈哈哈哈哈");

先在类上加 @slf4j
log.info("哈哈哈哈哈");

日志级别

默认日志级别是 info,可以在 application.properties 中设置日志级别

properties
#默认所有日志没有精确指定级别就使用 root 的默认级别
logging.level.root=debug
#也可以精确指定某个包或者类的日志级别
logging.level.com.xxx.xxx=debug

日志分组

properties
# 将多个包分为同一个组
logging.group.xxx=com.xxx.xxx,com.xxx.xxx
# 对一个组设置日志级别
logging.level.xxx=debug

# springboot 默认为我们提供了 web 和 sql 组
logging.level.web=debug
logging.level.sql=debug

文件输出

properties
# 只写名字,默认生成在当前项目同位置的 demo.log 中
logging.file.name=demo.log
# 写名字 + 路径
logging.file.name=/opt/applog/demo.log

文件归档和自动切割

INFO

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

切割: 每个文件 100MB,超过大小切割为另外一个文件

如果使用 logback ,可以通过 application 配置文件配置

yaml
logging:
  logback:
    rollingpolicy:
      # 滚动策略配置,默认每天一个,超过单个文件最大 size 进行切割
      file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
      # 单个日志文件的最大大小,默认为 10M
      max-file-size: 10MB
      # 应用启动时是否清楚以前文档,默认值 false
      clean-history-on-start: false
      # 日志文件被删除前,可以容纳的最大大小,默认为 0B,如果设置 1G,则磁盘存储超过1G后会删除旧日志文件
      total-size-cap: 0B
      # 保存的最大历史文件天数,默认为 7天
      max-history: 7
  file:
    name: /opt/applog/my.log

使用其他日志框架

xml
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
        
<!--   导入 spring-boot-starter 就近原则,优先级高于 
spring-boot-starter-web 依赖的 spring-boot-starter     -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
<!--    排除掉默认的日志依赖        -->
    <exclusions>
        <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>

最佳实战

  • 导入任何第三方框架,先排除它的日志包,因为 Boot 底层控制好了日志
  • 修改 application 配置文件,就可以调整日志的所有行为,如果不够可以编写日志框架配置文件放在类路径下,比如 logback-spring.xml
  • 如需对接专业日志系统,只需把 logback 记录的日志输入到相应的中间件,这和 Springboot 没关系,都是日志框架自己的配置,修改配置文件即可
  • 业务中使用 slf4j-api 记录日志