从零开始 Spring Boot 10:日志

从零开始 Spring Boot 10:日志

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更严重的也会被记录,实际上就是记录所有级别的日志。一般需要在开发环境这样设置,在生产环境只会记录INFOWARN以上级别的日志。

下面看相应的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.debuglogger.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)获取。

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值