springboot学习第9期 - 日志配置

125 阅读3分钟

Spring Boot 默认使用 Logback 日志框架,当启动服务的时候或者使用 @Slf4j 手动打印日志的时候,可以看到控制台有日志打印:

这是默认的格式,然而我们可以手动配置,自定义格式,还可以将日志保持到文件中。

最小配置

无需新增任何依赖,只要在 resource 目录下新建日志配置文件 logback-spring.xml 文件即可,服务启动的时候,springboot 会自动加载该文件,无需手动配置加载启动。

下面展示一个最小的配置:

<configuration>
    <!-- 定义 控制台输出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 最简单的格式:时间 [线程] 级别 类名 - 消息 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 根日志级别 -->
    <root level="INFO">
        <!--  使用上面定义的 CONSOLE 输出-->
        <appender-ref ref="CONSOLE"/>
    </root>
</configuration>

解读一下上面的配置:

1、首先定义了一个日志输出,名称叫做 CONSOLE, 采用 ConsoleAppender 输出,意思是输出到控制台。下面将该 CONSOLE 挂到根日志器上,告诉 logback:所有日志最终都交给名叫 CONSOLE 的那个 appender 输出。

2、然后 CONSOLE 里面又定义了日志的输出格式,其中也引用了内置的一些占位符:

占位符含义说明
%d{yyyy-MM-dd HH:mm:ss.SSS}日期时间
%thread线程名称
%-5level日志级别-表示左对齐,5 表示占5个字符宽度
%logger{36}Logger名称(通常是类名)26表示最长打印36个字符,超过会被截断
%msg日志消息体
%n换行符windows 是\r\n

3、最后根日志器又声明了打印的日志级别,只有 INFO 和 INFO 之上的才会被打印。

日志级别一共有:

TRACE < DEBUG < INFO < WARN < ERROR

最后打印效果如下:

添加颜色

打印到控制台添加颜色才有意义,如果打印到文件中,没必要加颜色。

<configuration>
  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <!-- 添加颜色 -->
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{36}) - %msg%n</pattern>
    </encoder>
  </appender>

  <root level="INFO">
    <appender-ref ref="CONSOLE"/>
  </root>
</configuration>

%highlight 加在 日志级别上,不同的级别,会打印不同的颜色。

最后打印效果如下:(还可以调整对其方式)

打印到文件中

声明日志文件打印,最后根日志器设置控制台和文件都启用。

<configuration>
  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <!-- 添加颜色 -->
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{36}) - %msg%n</pattern>
    </encoder>
  </appender>

  <!-- 文件(按天滚动,最多保留 30 天,单个文件 100 MB) -->
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logs/app.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- 日志文件名格式:app-2024-07-31.0.log.gz -->
      <fileNamePattern>logs/app-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
      <!-- 单个文件最大 100 MB -->
      <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <maxFileSize>100MB</maxFileSize>
      </timeBasedFileNamingAndTriggeringPolicy>
      <!-- 日志保留 30 天 -->
      <maxHistory>30</maxHistory>
      <!-- 磁盘总量上限(可选) -->
      <totalSizeCap>10GB</totalSizeCap>
    </rollingPolicy>
    <encoder>
      <!-- 文件不需要彩色 -->
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <root level="INFO">
    <appender-ref ref="CONSOLE"/>
    <appender-ref ref="FILE"/>
  </root>
</configuration>

效果: