红茶的个人站点

  • 首页
  • 专栏
  • 开发工具
  • 其它
  • 隐私政策
Awalon
Talk is cheap,show me the code.
  1. 首页
  2. 专栏
  3. Spring Boot 学习笔记
  4. 正文

从零开始 Spring Boot 10:日志

2022年5月7日 989点热度 0人点赞 0条评论

spring boot

图源:简书 (jianshu.com)

虽然可以通过System.out.println之类的方式向控制台直接输出一些信息进行最简单的调试,但这种方式并不正式,且很难将输出信息收集和统一管理分析。

正式的方式是使用日志,实际上很多编程语言甚至提供语言层级的日志支持,不过Java并没有相应的支持,需要我们选取一些适用于Spring Boot应用的日志框架。

事实上Spring Boot默认提供了对Logback日志框架的支持,但在实际使用中更多的是使用SLF4J。

SLF4J(Simple Logging Facade for Java)实际上是一个位于具体日志框架之上的抽象层:

image-20220507150013085

图源:SLF4J与Log4j比较(区别) - SLF4J教程™ (yiibai.com)

使用SLF4J而非具体某个日志框架,可以让你很容易地将项目中的底层日志框架进行替换和迁移。

下面简单演示一下如何在Spring Boot项目中使用SLF4J记录日志。

本篇的示例在之前项目基础上进行修改,可以通过learn_spring_boot (github.com)获取修改前的项目代码。

准备工作

添加SLF4J依赖:

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
    </dependency>

底层日志框架这里使用Spring Boot默认的logback,所以需要添加logback的相关配置:

logging.config=./src/main/resources/logback.xml
logging.level.cn.icexmoon.my_first_app=TRACE

第一条指定了logback具体的XML配置文件路径,第二条指定了记录cn.icexmoon.my_first_app包下的TRACE级别日志。

具体分为这么几个级别:

  • TRACE:一般用于追踪程序运行流程。

  • DEBUG:调试。

  • INFO:记录程序运行信息。

  • WARN:警告信息,程序并不会立即崩溃,但存在问题。

  • ERROR:错误信息,可能引发程序崩溃。

这些错误级别从上到下依次升高。上边的配置实际上是指定的需要记录的最低级别日志,也就是说比TRACE更严重的也会被记录,实际上就是记录所有级别的日志。一般需要在开发环境这样设置,在生产环境只会记录INFO或WARN以上级别的日志。

下面看相应的logback.xml配置:

<configuration>
    <!-- 日志内容格式 -->
    <property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
    <!-- 日志文件路径规则 -->
    <property name="FILE_PATH" value="D:/workspace/java/learn_spring_boot/ch10/log/%d{yyyy-MM-dd}.%i.log" />
    <!-- 控制台日志输出设置 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 按照上面配置的LOG_PATTERN来打印日志 -->
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
    </appender>
    <!-- 文件日志相关设置 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 按照上面配置的FILE_PATH路径来保存日志 -->
            <fileNamePattern>${FILE_PATH}</fileNamePattern>
            <!-- 日志保存15天 -->
            <maxHistory>15</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- 单个日志文件的最大,超过则新建日志文件存储 -->
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
​
        <encoder>
            <!-- 按照上面配置的LOG_PATTERN来打印日志 -->
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
    </appender>
    <!-- 日志记录级别 -->
    <logger name="cn.icexmoon.my_first_app" level="INFO" />
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </root>
</configuration>

这里有详细的注释,所以不做说明。

记录日志

使用SLF4J很容易,只需要通过LoggerFactory获取一个Logger对象,然后调用logger.debug或logger.info记录相应错误级别的日志即可:

package cn.icexmoon.my_first_app.controller;
​
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
​
@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello(@RequestParam(value="name",defaultValue="noname") String name){
        Logger logger =  LoggerFactory.getLogger(this.getClass());
        logger.debug("hello world!================");
        return String.format("Hello %s", name);
    }
}

通过LoggerFactory.getLogger获取Logger时需要指定一个Logger名称,通常用包名来命名,比如这里可以命名为cn.icexmoon.my_first_app.controller.HelloController.hello等,通过this.getClass获取当前类的完整名称来生成Logger名称是个更简单的方式。

运行程序并尝试访问http://localhost:8080/hello就能看到控制台输出日志,与此同时在相应的目录下也会生成日志文件。

使用注解

如果你的项目同时使用了lombok,就可以用一种更简单的方式来使用slf4j,即通过@Slf4j注解来为当前的类生成一个默认的Logger:

package cn.icexmoon.my_first_app.controller;
​
...
@Slf4j
@Api(tags="用户管理")
@RestController
@RequestMapping("/user")
public class UserController {
    ...
    @ApiOperation("获取用户列表")
    @GetMapping("")
    public String getUsers() {
        log.info("getUsers is called.========");
        Result result = new Result();
        result.setData(userServiceInterface.getUsers());
        return result.toString();
    }
}

为类添加了@Slf4j注解后,就可以直接在代码中使用log.info来记录日志。

实际上这个注解的用途相当于:

public class UserController {
    private final Logger log = LoggerFactory.getLogger(UserController.class);
    ...
}

好了,今天就到这里了,谢谢阅读。

本篇文章的最终代码可以从learn_spring_boot (github.com)获取。

参考资料

  • SLF4J参考API - SLF4J教程™ (yiibai.com)

  • SLF4J Documentation

  • Springboot配置slf4j - 知乎 (zhihu.com)

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: 暂无
最后更新:2022年8月29日

魔芋红茶

加一点PHP,加一点Go,加一点Python......

点赞
< 上一篇
下一篇 >

文章评论

取消回复

*

code

COPYRIGHT © 2021 icexmoon.cn. ALL RIGHTS RESERVED.
本网站由提供CDN加速/云存储服务

Theme Kratos Made By Seaton Jiang

宁ICP备2021001508号

宁公网安备64040202000141号