1、日志用途

  • 故障排查和调试:当项目出现异常或者故障时,日志记录可以快速帮助我们定位到异常的部分以及知道异常的原因。
  • 性能监测和优化:通过在关键代码路径中添加日志记录,可以了解应用程序的性能表现,并根据性能表现优化程序。
  • 安全审计和监控:通过监视和分析系统日志,可以检测和识别潜在的安全威胁,如入侵、恶意行为或非法访问等非法行为。
  • 数据统计和分析:通过对日志信息进行统计和分析,可以获取关于用户行为、系统使用情况和业务趋势等有价值信息并分析。

2、日志框架

日志框架常见的两个概念:日志门面(Logging Facade)和日志实现(Logging Implementation)

日志门面是一个抽象层,它定义了一组统一的日志接口,用于在应用程序中记录日志它的作用是将应用程序代码与具体的日志实现解耦,使得应用程序代码不直接依赖于某个具体的日志框架。通过使用日志门面,可以在运行时灵活地切换不同的日志实现,而无需修改应用程序的代码。

日志实现是指具体的日志框架的实现,它实现了日志门面所定义的接口,并提供了实际的日志记录功能不同的日志实现提供了不同的配置选项、功能和性能特性。开发人员可以根据项目需求选择合适的日志实现,并使用相应的配置进行日志记录。

要使用日志门面,需要在应用程序中引入相应的日志门面库(SLF4J和Commons Logging),并通过配置文件或代码设置具体的日志实现(Log4j和Logback)这样,应用程序就可以通过调用日志门面的接口来记录日志,而具体的日志记录将由所配置的日志实现来处理。这种分离的设计允许开发人员更方便地切换和管理日志框架,并提供了更大的灵活性和扩展性。

3、日志信息

4、日志级别

  • trace:级别最低,意为微量少许
  • debug:需要调试时打印的信息
  • info:普通打印信息(默认)
  • warn:警告信息
  • error:错误信息,级别较高
  • fatal:致命的,代码异常导致退出,系统级别的日志级别,无法手动控制

以上日志级别由上往下依次增强,而日志级别越高,控制台打印出的日志信息就越少,但打印出的日志信息越重要

项目设置的日志级别默认为INFO,也就是控制台只打印收到的INFOWARNERRORFATAL级别的日志,而TRACEDEBUG级别的日志不进行打印。

日志级别配置只需要在配置文件中设置1ogging.leve1配置项就行。

项目重启后就可以看到debug日志

5、日志打印

在程序中获取日志对象需要使用日志工厂LoggerFactory

// 这里的Logger类输入org.slf4j包下的,不可导错包private Logger logger = LoggerFactory.getLogger(TestController.class);

public void someMethod() {log.trace("trace 级别");log.debug("debug 级别");log.info("info 级别");log.warn("warn 级别");log.error("error 级别");}

6、日志持久化

# 日志保存名称logging:file:name: D:\\home\\springboot.log

7、lombok日志输出

7.1、添加lombok依赖

org.projectlomboklomboktrue

如果想向创建项目那样引入依赖,又是社区版 IDEA ,可以先安装一个插EditStarters,然后在 pom.xml 文件中右键选择 Generate,选择 Edit Starters,选择 OK,然后就是熟悉的添加依赖的界面

7.2、使用 @Slf4j 注解输出日志

@Controller@ResponseBody@Slf4jpublic class UserController {@RequestMapping("/login")public void func1() {log.trace("trace等级日志");log.debug("debug等级日志");log.info("info等级日志");log.warn("warn等级日志");log.error("error等级日志");}}

注意:如果使用 @Slf4j 注解的话,需要使用 log 对象调用各种方法,这是 lomlok提供的对象名

通过加一个注解就能使得获取日志对象操作变得简单,lombok 究竟是如何做到这一点的能,注解的背后又是什么呢

通过查看目录 target 答案就被揭晓,我们知道 target 实际上就是编译好的字节码文件目录,JVM 最后真正执行的就是字节码文件

这是编译好的字节码文件,可以发现 @Slf4j注解不见了,代码里出现了老版获取日志文件的代码

@Controller@ResponseBodypublic class UserController {private static final Logger log = LoggerFactory.getLogger(UserController.class);public UserController() {}@RequestMapping({"/login"})public void func1() {log.trace("trace等级日志");log.debug("debug等级日志");log.info("info等级日志");log.warn("warn等级日志");log.error("error等级日志");}}

7.3、lombok原理

  • 对于一个普通的Java程序来说,当用户写好代码之后进行编译,然后生成一个.class为后缀的字节码文件,将其放到JVM虚拟机上去运行就可以让程序跑起来了

  • 对于lombok框架支持后,它就会与普通的java程序一同进行编译,然后生成.class为后缀的字节码文件

7.4、lombok更多注解

  • 基本注解
注解作用
@Getter⾃动添加 getter ⽅法
@Setter⾃动添加 setter ⽅法
@ToString⾃动添加 toString⽅法
@EqualsAndHashCode⾃动添加 equals 和 hashCode ⽅法
@NoArgsConstructor⾃动添加⽆参构造⽅法
@AllArgsConstructor⾃动添加全属性构造⽅法,顺序按照属性的定义顺序
@NonNull属性不能为 null
@RequiredArgsConstructor⾃动添加必需属性的构造⽅法,final + @NonNull 的属性为必需
  • 组合注解
注解作用
@Data@Getter + @Setter + @ToString +@EqualsAndHashCode +@RequiredArgsConstructor +@NoArgsConstructor
  • 日志注解
注解作用
@Slf4j添加⼀个名为 log 的⽇志,使⽤ slf4j