SLF4J

关于日志

为什么要使用日志

如果始终使用System.out.println()类似的输出语句来输出某些信息,在开发过程中,可能是无所谓的,但是,当项目开发完成后,这些信息不应该再被显示,如果使用删除源代码、注释源代码的做法,则工作量较大,也不利于后续可能需要进行的功能更新或维护。

使用日志,可以根据级别进行输出,并根据不同的运行环境(开发环境、交付后的生产环境)来设置不同的显示级别,以保证某些信息只在开发过程中是被输出且可见的,而这些信息在交付后的生产环境中将不可见。

日志的基本使用

在Spring Boot项目中,当添加了Lombok依赖后,可以在任意类上添加@Slf4j注解,则可以在类中使用名为log的变量调用方法来输出日志(此变量是在编译期由Lombok添加的)。

调用输出日志的方法时,建议使用的方法是:

public void info(String format, Object... arguments);

即:第1个参数是字符串,表示需要输出的内容,但此字符串的各变量值均使用{}作为占位符,然后,第2个参数是可变参数,是Object类型的,则第1个参数的字符串值中的各占位符对应的值均使用第2个参数依次表示。

使用示例:

int x = 5;
int y = 10;
log.info("x={}, y={}, x+y={}", x, y, x + y);

日志的级别

在SLF4j中,日志的可显示级别,从信息的重要程度,从低到高依次为:

  • trace:跟踪信息

  • debug:调试

  • info:一般信息

  • warn:警告

  • error:错误

以上5个级别在使用log变量输出日志时都有对应的方法,方法名称就是这5个级别的名称,且这5个级别的方法的重载都是相同的!

根据调用的方法不同,输出的日志的级别就不同,例如,当调用info()系列方法(重载的多个方法)时,输出的日志就是info级别的,当调用debug()系列方法时,输出的日志就是debug()级别的。

在Spring Boot项目中,在application.properties中,使用以下语法可以设置日志的显示级别:

logging.level.包名.类名=日志的显示级别

以上配置就可以将指定的类中的日志设置为指定的显示级别。

也可以配置为:

logging.level.包名=日志的显示级别

以上配置就可以将指定的包及其子孙包中所有类的日志设置为指定的显示级别。

一旦设置显示级别后,将显示设置级别及更重要的级别的日志,例如,设置为debug时,将显示debuginfowarnerror都将显示,如果设置为warn时,将只显示warnerror级别的日志。

日志的优点

日志的优点主要有:

  • 可以配置来控制日志的显示级别

  • 日志的文本会被缓存,多次执行时,输出效率更高

  • 在进阶使用中,还可以将日志输出到指定的其它位置,例如文件、数据库等

关于SLF4j与其它日志框架

log4jlogback等日志框架都是比较主流的日志框架,而SLF4j是一套标准,它并没有具体的实现日志的功能,所以,SLF4jlog4j / logback等更像是一个接口与实现类的关系(本质并不是)。

### 关于 SLF4J 日志框架的使用指南 #### 统一日志接口的作用 SLF4J (Simple Logging Facade for Java) 提供了一个简洁的日志记录接口,允许开发者通过一致的方式调用日志功能而不必关心底层具体使用的日志库[^1]。 #### 集成多个日志实现 该工具支持与多款流行的日志解决方案协同工作,比如 Logback、Log4j 或者 JDK 自带的日志模块。这意味着团队可以选择最适合自身环境的技术栈来处理应用中的日志信息[^2]。 #### 实现方式 作为一层抽象层存在于应用程序和实际的日志引擎之间,SLF4J 让前端代码只需关注如何记录消息;至于这些数据最终会被送往哪里,则是在部署阶段才决定的事情。这种设计模式极大地提高了系统的可维护性和灵活性[^3]。 #### 性能考量 对于追求高效能的应用来说,选用合适的后端非常重要。例如 Apache Log4j 2 不仅继承和发展了前代产品的优点,还引入了许多新的特性和优化措施,如无锁异步写入机制等,从而显著提升了整体表现水平[^4]。 ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Example { private static final Logger logger = LoggerFactory.getLogger(Example.class); public void run() { if(logger.isDebugEnabled()){ logger.debug("This is a debug message"); } try{ // some code that might throw an exception } catch(Exception e){ logger.error("An error occurred", e); } logger.info("Application started successfully."); } } ``` ### 常见问题解答 - **Q:** 如果我已经有了其他类型的Logger实例怎么办? - A: 可以考虑利用桥接器将现有logger迁移到SLF4J体系下,这样既保留原有投资又享受到了新平台带来的便利. - **Q:** 如何更改正在运行程序的日志级别? - A: 这取决于所选的具体实现方案。大多数现代日志系统都提供动态调整日志级别的能力,通常可通过配置文件或者命令行参数完成设置变更. - **Q:** 是否存在性能损失的风险? - A: 尽管增加了一层间接访问路径理论上会带来额外开销,但在实践中由于高效的内部缓存策略等因素影响,这类损耗几乎可以忽略不计。实际上某些情况下反而因为减少了重复初始化操作而获得了更好的效率提升.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值