Spring Boot日志的打印与持久化详细解析

Spring Boot日志的打印与持久化详细解析

在Spring Boot应用中,日志是开发和调试的重要工具。通过合理的配置,我们可以实现日志的打印和持久化,方便问题的排查和解决。本文将详细介绍Spring Boot日志的打印与持久化,并包含两条示例。

Spring Boot日志的分类

Spring Boot日志分为如下五个级别:

  • TRACE:跟踪级别,最低级别,用于记录最详细的日志信息。
  • DEBUG:调试级别,用于记录程序运行细节,适合于在开发环境中使用。
  • INFO:普通日志级别,用于记录程序正常的运行状态,不影响程序的运行。
  • WARN:警告级别,用于记录一些较小的异常,不影响程序的稳定性,但需要注意。
  • ERROR:错误级别,用于记录较严重的异常,需要针对性的解决。

在应用的开发和调试过程中,我们可以根据具体需求选择日志级别。

Spring Boot日志的配置

Spring Boot采用了通用的日志接口——SLF4J(Simple Logging Facade for Java)作为业务代码和特定日志实现之间的中间层。因此,在引入Spring Boot日志功能时,我们需要引入如下两个依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

其中,spring-boot-starter为Spring Boot核心依赖,spring-boot-starter-log4j2为Log4j2的具体实现。

在引入依赖之后,我们需要在application.properties文件中,进行日志配置。例如,我们可以设置日志级别为DEBUG,将日志输出到控制台:

logging.level.root=DEBUG
logging.pattern.console=%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{15}) - %msg%n

其中,logging.level.root设置根日志的日志级别,logging.pattern.console设置日志输出到控制台时的格式。

Spring Boot日志的持久化配置

除了控制台输出,我们还可以将日志持久化到文件中。例如,我们可以将日志存储到logs目录下的spring-boot-log.log文件中:

logging.file=logs/spring-boot-log.log
logging.level.root=DEBUG
logging.pattern.console=%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{15}) - %msg%n

示例一

下面是一个示例,用于记录用户的登录日志。我们可以使用Log4j2记录用户的登录事件,将其存储到日志文件中。

@RestController
public class UserController {
    private final Logger logger = LogManager.getLogger(UserController.class);
    //省略其他代码

    @PostMapping("/login")
    public CommonResponse<User> login(@RequestBody UserLoginRequest request) {
        User user = //从数据库中查询用户信息
        if(user != null && user.getPassword().equals(request.getPassword()) {
             logger.info("用户登录成功,用户名为{}", user.getUserName());
             return new CommonResponse<>(user);
        }else {
             logger.error("用户登录失败,用户名为{}", request.getUserName());
             throw new BusinessException("用户名或密码错误");
        }
    }
}

上述代码中,我们使用LogManager获取到UserController的Logger实例,并在用户登录时,使用logger记录用户登录成功和失败的事件。使用如下配置文件,将日志记录到logs/user.log文件中:

logging.level.root=INFO
logging.file=logs/user.log
logging.pattern.console=%d{HH:mm:ss.SSS}[%thread]%highlight(%-5level)%logger{36} - %msg%n

示例二

下面是一个示例,用于记录系统的异常日志。我们可以使用Logback记录Java异常,并将其存储到日志文件中。需要注意的是:在开发和测试环境中,我们可以把异常详细信息输出到控制台,方便问题的排查和解决;而在生产环境中,我们应该避免在控制台输出详细的异常信息,以保证系统的安全性。

@ControllerAdvice
public class GlobalExceptionHandler {
    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
    //省略其他代码

    @ExceptionHandler(Exception.class)
    @ResponseBody
    public CommonResponse<?> handleException(Exception e){
        String errorMessage = "未知异常,请联系管理员";
        if(e instanceof BusinessException){
            BusinessException be = (BusinessException) e;
            errorMessage = be.getMessage();
        }
        logger.error(errorMessage, e); //记录异常日志,注意参数顺序,errorMessage在前,异常对象在后
        return new CommonResponse<>(ResultCode.SYSTEM_ERROR.getCode(), errorMessage);
    }
}

上述代码中,我们使用LoggerFactory获取到GlobalExceptionHandler的Logger实例,并在捕获到异常时,使用logger记录异常日志。使用如下配置文件,将异常信息记录到logs/exception.log文件中:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{15}) - %msg%n</pattern>
        </encoder>
    </appender>
    <appender name="dailyRollingFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/exception.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/exception-%d{yyyy-MM-dd}.log</fileNamePattern>
        </rollingPolicy>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{15}) - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="INFO">
        <appenderRef ref="console"/>
        <appenderRef ref="dailyRollingFileAppender"/>
    </root>
</configuration>

总结

本文介绍了Spring Boot日志的打印和持久化,分别针对不同的应用场景进行了示例说明。在实际应用中,我们应该根据具体需求,选择合适的日志级别,并将日志合理配置,以便于开发和调试。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot日志的打印与持久化详细解析 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Linux系统Jsp的环境:Apache,Tomcat配置

    下面我将为你详细讲解如何在Linux系统上配置Apache和Tomcat环境以支持JSP。 安装Apache 首先,在Linux系统上安装Apache服务器,可以使用如下命令: sudo apt-get update sudo apt-get install apache2 安装完成后,你可以在浏览器中输入服务器的IP地址或域名来检查Apache是否正确安装…

    Java 2023年5月19日
    00
  • java中怎样表示圆周率

    在Java中,可以使用常量Math.PI表示圆周率,该常量为双精度浮点型常量,其值为3.141592653589793。可以在代码中直接使用该常量来表示圆周率。 例如,以下代码展示了如何使用Math.PI来计算圆的周长和面积: double radius = 2.5; double circumference = 2 * Math.PI * radius; …

    Java 2023年5月26日
    00
  • IDEA编译Spring源码教程

      大家在学习spring时源码总是绕不开的,今天我分享一下我的spring源码编译过程,详细讲解了常见问题的解决办法。   此过程中要用到的工具及版本:     1.JDK11     2.Spring-framework 5.3.27     3.Gradle7.5.1     4.IDEA 2021.3 文章目录:     1.下载spring源码  …

    Java 2023年4月22日
    00
  • java多线程有序读取同一个文件

    要实现Java多线程有序读取同一个文件,可以使用以下步骤: 步骤一:打开文件流 首先,需要创建一个FileInputStream对象,该对象可以打开文件流并准备读取数据。代码示例如下: FileInputStream fis = new FileInputStream("file.txt"); 步骤二:创建 BufferedReader …

    Java 2023年5月19日
    00
  • Java String类的性质与比较

    针对“Java String类的性质与比较”,我准备了以下攻略: Java String类的性质 不可变性 Java中的String类是不可变的。这意味着,一旦创建了一个字符串对象,就不能更改它的内容。如果您需要修改一个字符串,必须创建一个新的对象,然后将原始对象的引用更改为指向新的字符串对象。 字符串池 Java中的字符串池是一种特殊的内存区域,它存储了所…

    Java 2023年5月27日
    00
  • 基于module-info.class的问题

    “基于module-info.class的问题” 在Java 9之前是不存在的。 Java SE 9中引入了模块化系统,它引入了一个新的文件模块描述符module-info.java。module-info.java包含有关模块的信息,包括模块依赖关系,公共包导入等。在模块化系统中,其他类需要使用Java模块,需要module-info.java中导入的包。…

    Java 2023年5月19日
    00
  • JVM的垃圾回收算法工作原理详解

    JVM的垃圾回收算法工作原理详解 什么是垃圾回收? 垃圾回收是指自动管理程序中动态分配的内存的过程。在垃圾回收的过程中,垃圾收集器会扫描程序中的内存,查找出无用的对象,然后将它们的内存空间释放掉。这样就可以避免内存泄漏和程序崩溃。 垃圾回收算法 垃圾回收算法的目标是找出内存中无用的对象,然后回收这些对象所占用的内存空间。JVM采用的主要的垃圾回收算法有标记-…

    Java 2023年5月19日
    00
  • 简单了解Java关键字throw和throws的区别

    简单了解Java关键字throw和throws的区别 在Java中,throw和throws是两个与异常相关的关键字,它们的作用和使用场景不同,但经常容易混淆。 throw关键字 throw关键字用于抛出一个异常对象。我们可以在代码中手动抛出一个异常对象并且将其名称直接传递给throw语句。抛出异常后,程序会立即终止当前的语句执行,并开始执行异常处理流程。 …

    Java 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部