SpringBoot 日志文件从入门到实战

1. 日志的作用

日志是程序的重要组成部分 , 虽然不是必须的 , 但如果不打开控制台查看日志 , 将很难排查错误.

除了发现和定位问题之外 , 我们还可以通过日志实现以下功能:

  • 记录用户登录日志 , 方便分析用户是正常登录还是恶意破解用户.
  • 记录系统的操作日志 , 方便恢复数据和定位操作人.
  • 记录程序的执行时间 , 方便以后优化程序提供数据支持.

日志真实使用案例:

  • 应用程序日志记录:开发人员在应用程序中添加日志记录功能,以便在应用程序运行时跟踪和调试问题。例如,当应用程序出现错误时,开发人员可以查看日志文件以了解错误的原因。
  • 安全日志记录:安全管理员可以使用安全日志记录来跟踪系统中的安全事件。例如,当系统出现入侵尝试时,安全管理员可以查看日志文件以了解入侵者的行为和尝试的目的。
  • 网络日志记录:网络管理员可以使用网络日志记录来跟踪网络活动。例如,当网络出现故障时,网络管理员可以查看日志文件以了解故障的原因。
  • 应用程序性能分析:开发人员可以使用日志记录来分析应用程序的性能。例如,他们可以记录应用程序中的每个操作的执行时间,并使用这些信息来查找性能瓶颈。
  • 运维日志记录:运维人员可以使用日志记录来跟踪系统的运行状况。例如,当系统出现故障时,运维人员可以查看日志文件以了解故障的原因,并采取适当的措施来解决问题。

2. 日志怎么用

Spring Boot 框架中内置了日志框架 , 因此我们每次在项目启动的时候就能看到日志输出.

image-20230423202925378

通过上述日志信息可以得出三个问题:

  • Spring Boot 内置的日志框架是什么?
  • 开发中如何在项目中自定义打印日志?
  • 日志输出默认是在控制台的 , 如何将日志永久的保存起来?

3. 自定义日志打印

开发者自定义打印日志的实现步骤:

  1. 在程序中得到日志对象.
  2. 使用日志对象的相关语法输出要打印的内容.

3.1 程序中得到日志对象

每个类都有自己专属的日志 , 期望这个日志是唯一的不被他人修改 final

private static final Logger log = LoggerFactory.getLogger();

Tips: 一定要选择 slf4j 中的 Logger.

Spring 内置日志框架为 SLF4Jlogback , 可以在 Maven 的内置扩展中查看.

image-20230423201909014

其中:

  • SLF4J 是一个 Java 日志 API,它提供了一个抽象层,使得应用程序可以在不改变代码的情况下使用不同的日志实现。(类似于房屋中介)

  • Logback 是一个开源的 Java 日志框架 , 可以满足各种应用程序的日志需求。

SLF4J 的实现原理就是 门面模式 , 门面模式与代理模式非常相似 , 用户发送的日志请求 , 首先会来到SLF4J , 之后SLF4J 会自动匹配适合的日志框架 , 这样的设计方式会大大增强代码的灵活性和可移植性 , 程序员可以通过 SLF4J 的抽象层 , 轻松切换日志框架.

3.2 使用日志对象打印日志

 @RequestMapping("/sayHi") // = @WebServlet("/url")
    public String sayHi(){
    
    
//        System.out.println("打印日志");
        log.trace("i'm trace");//所有的痕迹都打印
        log.debug("i'm debug");
        log.info("i'm info");
        log.warn("i'm warn");
        log.error("i'm error");
        return "Hello world!" + "->" + myconfigration;
    }

执行结果如下:

我们发现没有看到 trace 和 debug 日志. 这是因为 info 为日志的默认级别 , 因此只输出 >= info 的日志.

image-20230423205154313

3.3 日志格式说明

image-20230423205631370


4. 日志级别

4.1 日志级别的作用

  • 日志级别可以帮你筛选出重要的信息 , 比如设置日志的级别为 ERROR, 开发中只查看程序的报错信息 , 可以节省开发者筛选信息的时间.
  • 调试和故障排查:在开发和测试阶段,可以将日志级别设置为DEBUG或TRACE,记录应用程序的详细运行信息,以便在出现问题时进行调试和故障排查。
  • 监控和性能分析:在生产环境中,可以将日志级别设置为INFO或WARN,记录应用程序的重要事件和异常情况,以便进行监控和性能分析。
  • 安全审计和合规性检查:在安全审计和合规性检查中,可以将日志级别设置为ERROR或FATAL,记录应用程序的安全事件和故障情况,以便进行安全审计和合规性检查。
  • 日志管理和存储:根据不同的日志级别进行日志管理和存储,将不同级别的日志存储到不同的日志文件中,以便进行日志管理和分析。

综上所述,日志级别的作用主要是在应用程序中记录日志时,根据不同的重要程度将日志分为不同级别,以便在不同场景下对日志进行筛选和过滤,从而实现调试和故障排查、监控和性能分析、安全审计和合规性检查等功能。

4.2 日志级别的分类与使用

日志的级别分为:

  • TRACE:最详细的日志级别,用于记录应用程序的详细运行信息,包括方法调用、变量值等。
  • DEBUG:用于调试应用程序,记录应用程序的调试信息,包括变量值、方法调用等。
  • INFO:记录应用程序的重要事件和状态信息,例如应用程序启动、关闭、配置信息等。
  • WARN:记录应用程序的警告信息,例如应用程序出现异常但不影响正常运行的情况。
  • ERROR:记录应用程序的错误信息,例如应用程序出现异常并影响了正常运行的情况。
  • FATAL:记录应用程序的严重错误信息,例如应用程序崩溃或无法继续运行的情况。

不同的日志级别对应不同的日志内容,包含的信息也不同。通常,可以根据应用程序的需要选择合适的日志级别进行记录,以便在不同场景下对日志进行筛选和过滤,从而实现调试和故障排查、监控和性能分析、安全审计和合规性检查等功能。

级别越高能收到的消息就越少 , 如果把日志级别设为 warn , 那么就只能收掉 warn , error 和 fatal 的信息.

4.3 日志级别的设置

日志级别的设置只需在配置文件中设置"logging.level"配置项即可.

配置根路径级别的日志:

#  日志级别设置
# 所有项目设置为 error
logging:
	level:
		root: error
@RestController // = @Controller + @ResponseBody
public class testController {
    
    
    //1.得到日志对象
    private static final Logger log = LoggerFactory.getLogger(testController.class);
    //注册一个路由
    @RequestMapping("/sayHi") // = @WebServlet("/url")
    public String sayHi(){
    
    
        //System.out.println("打印日志");
        log.trace("i'm trace");
        log.debug("i'm debug");
        log.info("i'm info");
        log.warn("i'm warn");
        log.error("i'm error");
        return "Hello world!" + "->" ;
    }
}

结果显示:

明显只打印 error 及 error 以上的日志信息.

image-20230424115543447

Tips: 如果不设置日志输出级别 , 默认为 info

4.4 综合练习

将所有项目的日志级别设置为 error , 而 controller 类中设置为 trace

logging:
	level:
		root: error
		com:
			example:
				demo:
					controller: trace

5. 日志的持久化

以上日志都是输出在控制台上 , 然而生产环境中需要我们把日志保存起来 , 以便后续回溯定位问题 , 将日志保存起来的过程就叫做持久化.

5.1 配置日志文件的保存路径:

Tips: 路径一定要写绝对路径

logging:
	file:
		path: D:\\java\\

5.2 配置日志文件的文件名:

系统会自动在指定路径下创建一个 spring_log 文件 , 里面存储 日志文件.

logging:
	file:
		path: D:\\java\\spring_log

image-20230424122038585

5.3 综合练习:

将 controller 包下 error 级别以上的⽇志保存到 log_all.log 下,将 service包 下 warn 级别以上的⽇志保存到 log_all.log 下

logging:
  level:
    com:
      example:
        demo:
          controller: error
          service: warn
  file:
    path: D:\\java\\log_all.log

5.4 不同批次的日志是覆盖还是追加?

观察得出结论 , 日志文件一旦产生 , 那么日志文件及其内容就会永久的保存 , 不会出现文件或内容的丢失 , 所以不同批次的日志是追加.


6. 更简单的日志输出

每次写日志时 , 都要写下面代码 , 当业务过于复杂就会很麻烦:

private static final Logger log = LoggerFactory.getLogger(testController.class);

因此我们可使用 lombok 框架

lombok 是一个编译期的框架 , 在编译期 , lombok 的注解处理器会自动扫描 Java 源代码 , 并根据注解生成 Java 代码 , 最终与源代码合并 , 生成 Java 类文件. 生成的 Java 类文件可以像原 Java 文件一样被 编译 , 打包 , 部署.

在这里插入图片描述

@RestController
@Slf4j //给当前的类添加一个叫 log 的日志对象
public class LogController {
    
    
    @RequestMapping("/log")
    public String log(){
    
    
        log.info("我是 info");
        log.warn("我是 warn");
        log.error("我是 error");
        return "log sayhi";
    }
}



猜你喜欢

转载自blog.csdn.net/liu_xuixui/article/details/130684323