1、日志用途
- 故障排查和调试:当项目出现异常或者故障时,日志记录可以快速帮助我们定位到异常的部分以及知道异常的原因。
- 性能监测和优化:通过在关键代码路径中添加日志记录,可以了解应用程序的性能表现,并根据性能表现优化程序。
- 安全审计和监控:通过监视和分析系统日志,可以检测和识别潜在的安全威胁,如入侵、恶意行为或非法访问等非法行为。
- 数据统计和分析:通过对日志信息进行统计和分析,可以获取关于用户行为、系统使用情况和业务趋势等有价值信息并分析。
2、日志框架
日志框架常见的两个概念:日志门面(Logging Facade)和日志实现(Logging Implementation)
日志门面是一个抽象层,它定义了一组统一的日志接口,用于在应用程序中记录日志。它的作用是将应用程序代码与具体的日志实现解耦,使得应用程序代码不直接依赖于某个具体的日志框架。通过使用日志门面,可以在运行时灵活地切换不同的日志实现,而无需修改应用程序的代码。
日志实现是指具体的日志框架的实现,它实现了日志门面所定义的接口,并提供了实际的日志记录功能。不同的日志实现提供了不同的配置选项、功能和性能特性。开发人员可以根据项目需求选择合适的日志实现,并使用相应的配置进行日志记录。
要使用日志门面,需要在应用程序中引入相应的日志门面库(SLF4J和Commons Logging),并通过配置文件或代码设置具体的日志实现(Log4j和Logback)。这样,应用程序就可以通过调用日志门面的接口来记录日志,而具体的日志记录将由所配置的日志实现来处理。这种分离的设计允许开发人员更方便地切换和管理日志框架,并提供了更大的灵活性和扩展性。
3、日志信息
4、日志级别
trace
:级别最低,意为微量少许debug
:需要调试时打印的信息info
:普通打印信息(默认)warn
:警告信息error
:错误信息,级别较高fatal
:致命的,代码异常导致退出,系统级别的日志级别,无法手动控制
以上日志级别由上往下依次增强,而日志级别越高,控制台打印出的日志信息就越少,但打印出的日志信息越重要
项目设置的日志级别默认为 INFO
,也就是控制台只打印收到的INFO
,WARN
,ERROR
,FATAL
级别的日志,而TRACE
和DEBUG
级别的日志不进行打印。
日志级别配置只需要在配置文件中设置 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依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
如果想向创建项目那样引入依赖,又是社区版 IDEA ,可以先安装一个插 EditStarters
,然后在 pom.xml 文件中右键选择 Generate,选择 Edit Starters,选择 OK,然后就是熟悉的添加依赖的界面
7.2、使用 @Slf4j 注解输出日志
@Controller
@ResponseBody
@Slf4j
public 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
@ResponseBody
public 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 |