日志初见
前言
日志可以用来帮助开发人员进行故障排查、性能监控、安全监控以及业务流程跟踪等。相比于最原始的System.out.println()
输出,日志框架可以对日志程序信息进行分级分类展示,具有更好的可读性,同时可以方便地对日志信息进行控制与存储,十分便利!这里主要记录如何使用Spring Boot默认支持的Logback
进行日志的配置。如果有误,还望指出~
在哪里打印
日志打印行为一般发生在Service层。
Service层是业务逻辑的主要实现地点,包含了应用程序的核心逻辑,在Service层打印日志可以更加紧贴业务逻辑。
此外,Service层通常包含可重用的业务逻辑,这些逻辑可能被多个Controller调用。通过在Service层记录日志,可以确保在每个调用点都有相同的日志记录,而不需要在每个Controller中重复编写日志记录代码。
如何打印
在需要打印日志信息的Java类中引入Logger
实例,并调用相关方法即可。
1 |
|
如果项目中引入了lombok
依赖,可以通过@Log4j2
注解,直接将Logger
实例添加到类中。
1 |
|
如何设置打印格式
Spring Boot会扫描项目src\main\resources
路径下的logback.xml
/ logback-spring.xml
(优先级更高)来设置日志打印格式,下面是一个配置文件的示例。
1 |
|
该配置文件的架构如下:
其中:
appender节点
Logback 允许日志在多个地方进行输出。站在 Logback 的角度来说,输出目的地叫做 appender。appender 包括console、file、remote socket server、MySQL、PostgreSQL、Oracle 或者其它的数据库、JMS、remote UNIX Syslog daemons 中。
logger节点
一个 logger 可以有多个 appender。对于给定的 logger,每一个允许输出的日志都会被转发到该 logger 的所有 appender 中去。
如果再给一个叫做 L 的 logger 添加了一个 file appender,那么 L 以及 L 的子级 logger 都可以在文件和控制台打印日志。
<root />
是根日志记录器,相当于<logger name="root" />
,是所有logger的父节点。additivity属性
logger 的 additivity 属性是用来控制日志事件是否向父节点 logger 传递。
- 当 additivity 属性设置为 true 时,日志事件不仅会被当前 logger 处理,也会被传递给父节点 logger 处理。
- 当 additivity 属性设置为 false 时,日志事件只会被当前 logger 处理,不会被传递给父节点 logger 处理。
如果一个 logger 的 additivity 属性设置为 false,表示该 logger 不会将日志事件传递给其父节点 logger。这通常用于避免日志事件在多个 logger 中重复输出的情况。比如,如果我们在应用程序中有一个名为
com.example
的 logger,而其父节点是 root logger,如果我们想要避免输出重复的日志,我们可以将com.example
logger 的 additivity 属性设置为 false,这样日志事件就只会被com.example
logger 处理,不会再传递给 root logger 处理了。
几种日志框架的区别
SLF4J
slf4j 就是众多日志接口的集合,他不负责具体的日志实现,只在编译时负责寻找合适的日志系统进行绑定。具体有哪些接口,全部都定义在 slf4j-api 中。查看 slf4j-api 源码就可以发现,里面除了 publicfinalclassLoggerFactory
类之外,都是接口定义。
因此,slf4j-api 本质就是一个接口定义。总之,Slf4j 更好的兼容了各种具体日志实现的框架,如图:
Log4j
Apache Log4j 是一个非常古老的日志框架,并且是多年来最受欢迎的日志框架。 它引入了现代日志框架仍在使用的基本概念,如分层日志级别和记录器。
2015 年 8 月 5 日,该项目管理委员会宣布 Log4j 1.x 已达到使用寿命。 建议用户使用 Log4j 1 升级到 Apache Log4j 2。
Log4j2
Apache Log4j 2是对 Log4j 的升级,它比其前身 Log4j 1.x 提供了重大改进,并提供了 Logback 中可用的许多改进,同时修复了 Logback 架构中的一些固有问题。
与 Logback 一样,Log4j2 提供对 SLF4J 的支持,自动重新加载日志配置,并支持高级过滤选项。 除了这些功能外,它还允许基于 lambda 表达式对日志语句进行延迟评估,为低延迟系统提供异步记录器,并提供无垃圾模式以避免由垃圾收集器操作引起的任何延迟。
所有这些功能使 Log4j2 成为这三个日志框架中最先进和最快的。
Logback
logback 是由 log4j 创始人设计的又一个开源日志组件,作为流行的 log4j 项目的后续版本,从而替代 log4j。
Logback 的体系结构足够通用,以便在不同情况下应用。 目前,logback 分为三个模块:logback-core,logback-classic和logback-access。
- logback-core:模块为其他两个模块的基础。
- logback-classic:模块可以被看做是log4j的改进版本。此外,logback-classic 本身实现了 SLF4J API,因此可以在 logback 和其他日志框架(如 log4j 或 java.util.logging(JUL))之间来回切换。
- logback-access:模块与 Servlet 容器(如 Tomcat 和 Jetty)集成,以提供 HTTP 访问日志功能。
总结
建议直接选择 SLF4J 而不是 Log4j,commons logging,logback 或 java.util.logging。
- 在开源库或内部库中使用 SLF4J,将使其独立于任何特定的日志记录实现,这意味着无需为多个库管理多个日志记录配置,您的客户端将会很需要这一点;
- SLF4J 提供了基于占位符的日志记录,通过删除检查(
isDebugEnabled()
,isInfoEnabled()
等)来提高代码的可读性; - 另外,临时字符串数量越少意味着垃圾收集器的工作量就越少,这意味着应用程序的吞吐量和性能会更好。
参考链接
- 让自己的日志优雅呈现(logback.xml配置)_日志文件需要华丽吗-CSDN博客
- logback中logger 的additivity=”false”的作用 - 知乎 (zhihu.com)
- 第三章:Logback 的配置 | Logback (gitbook.io)
- Spring Boot 日志配置 - spring 中文网 (springdoc.cn)
- 常用日志框架(Log4j,Slf4j,Logback)之间到底有啥区别-腾讯云开发者社区-腾讯云 (tencent.com)