(2)springboot restful service - 关于log

52 阅读2分钟

打印日志,很普通的功能,java 里的日志框架很多 (因为历史久吧), 对于多数人选择一种主流方式记录 log 就行,这里介绍使用 logback 。(如果有自己的偏好,用自己的没问题)

spring-boot 默认集成了 logback, 不需要添加依赖。

  1. 首先添加 src/resources/logback.xml 配置文件,内容类似:

gitee.com/yren/mars/r…

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <!--设置存储路径变量-->
    <property name="log_home" value="./logs"/>
    <property name="app" value="mars" />

    <!--控制台输出appender-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!--设置输出格式-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss} | %-5p | [%thread]  %logger{50}:%L - %msg%n</pattern>
            <!--设置编码-->
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!--文件输出,时间窗口滚动-->
    <appender name="timeFileOutput" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日志名,指定最新的文件名,其他文件名使用FileNamePattern -->
        <File>${log_home}/${app}.log</File>
        <!--文件滚动模式-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名,可设置文件类型为gz,开启文件压缩-->
            <FileNamePattern>${log_home}/info.%d{yyyy-MM-dd}.%i.log.gz</FileNamePattern>
            <!--日志文件保留天数-->
            <MaxHistory>10</MaxHistory>
            <!--按大小分割同一天的-->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFileNamingAndTriggeringPolicy">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>

        <!--输出格式-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <!--            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss} | %-5p | [%thread]  %logger{50}:%L - %msg%n</pattern>
            <!--设置编码-->
            <charset>UTF-8</charset>
        </encoder>

        <!-- 设置某种 log 的输出级别, 避免干扰 -->
        <logger name="io.micrometer.datadog" level="ERROR"/>
    </appender>

    <!--指定基础的日志输出级别-->
    <root level="INFO">
        <!--appender将会添加到这-->
        <appender-ref ref="console"/>
        <appender-ref ref="timeFileOutput"/>
    </root>

    <logger name="net.sf.ehcache" level="ERROR"/>
    <logger name="io.micrometer.datadog" level="ERROR"/>
</configuration>
  1. 在 application.yml 里使用 logback.xml
# src/resources/application.yml
logging:
  config: classpath:logback.xml

3. 在 logback.xml 定义了一个 log 存储目录, , 在当前项目下建一个 logs 文件夹。这里只在 gitee 的项目里上传 logs 文件夹,不上传 log 文件也到 gitee。

有个技巧,在 logs 文件夹加中建一个空文件 ./logs/.empty

在 .gitignore 文件忽略 ./logs 文件夹,但不忽略 .empty 文件

empty_log.png

.gitignore

# .gitignore, 忽略 logs 文件夹,除 .empty 文件
/logs/*
!/logs/.empty

4. 在代码里打印一下log

@CrossOrigin
@RestController
public class InfoController {

    Logger logger = LoggerFactory.getLogger(getClass());
    ...
    @GetMapping("/")
    public Map<String, Object> info() {
        logger.info("access info endpoint (/)");
        ...
    }
}

启动一下项目 mvn clean spring-boot:run

curl http://localhost:8083

看一下 log 输出

2025-01-04 18:51:56 | INFO  | [http-nio-8083-exec-2]  c.v.saber.mars.controller.InfoController:29 - access info endpoint (/)

相关源码 gitee.com/yren/mars

gitee.com/yren/mars/t…

语雀的副本 www.yuque.com/u2177997/sr…