当前位置: 首页 > article >正文

private static final Logger log = LoggerFactory.getLogger()和@Slf4j的区别

一、代码方面

- private static final Logger log = LoggerFactory.getLogger()方式

  • 详细解释
    • 这是一种传统的获取日志记录器(Logger)的方式。LoggerFactory是日志框架(如 Log4j、Logback 等)提供的工厂类,用于创建Logger对象。在这里,通过调用LoggerFactory.getLogger()方法来获取一个Logger实例。private static final修饰符表示log是一个私有、静态、不可变的变量。静态变量意味着它属于类级别,在类加载时初始化,并且在整个类的生命周期内只有一个实例。私有访问修饰符限制了对该变量的访问只能在当前类内部进行。这种方式可以精确地控制日志记录器的创建和配置。
  • 示例
    • 假设使用的是 Logback 作为日志框架,在一个 Java 类中:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyClass {
    private static final Logger log = LoggerFactory.getLogger(MyClass.class);
    public void doSomething() {
        log.info("开始执行doSomething方法");
        // 业务逻辑代码
        log.info("doSomething方法执行完毕");
    }
}

在这个例子中,log是MyClass类的日志记录器。在doSomething方法中,通过log.info()方法记录了方法开始和结束的信息。

  • 缺点
    比较繁琐。每次需要在类中手动声明Logger对象,并且如果在一个项目中有大量的类需要记录日志,这种重复的代码会使代码看起来不够简洁。

- @Slf4j注解方式

  • 详细解释
    • @Slf4j是 Lombok 库提供的一个注解。Lombok 是一个 Java 库,它通过注解的方式在编译阶段自动生成一些常用的代码,比如getter、setter方法,构造函数等。当在一个类上添加@Slf4j注解时,Lombok 会在编译时自动为这个类生成一个名为log的Logger对象,这个对象的类型和获取方式与使用private static final Logger log = LoggerFactory.getLogger();类似,但不需要手动编写这行代码。这样可以大大减少代码的冗余,使代码更加简洁。
  • 示例
    首先需要在项目中引入 Lombok 依赖。如果是 Maven 项目,在pom.xml文件中添加以下依赖:
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.28</version>
    <scope>provided</scope>
</dependency>

然后在 Java 类中使用@Slf4j注解:

import lombok.extern.slf4j.Slf4j;
@Slf4j
public class AnotherClass {
    public void doAnotherThing() {
        log.info("开始执行doAnotherThing方法");
        // 业务逻辑代码
        log.info("doAnotherThing方法执行完毕");
    }
}

这里可以看到,没有手动声明Logger对象,但是通过@Slf4j注解,同样可以使用log对象来记录日志。

  • 优点
    简洁性。通过使用注解,减少了手动声明日志记录器的代码,使代码更加紧凑,特别是在有大量类需要记录日志的情况下,能够显著提高代码的可读性和可维护性。

二、编译阶段的差异

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

    • 这是 Java 原生的代码方式,编译器会按照常规的代码编译流程进行处理。在运行时,Logger对象会按照代码的初始化顺序在类加载时被创建。
  • @Slf4j

    • 在编译阶段,Lombok 的注解处理器会介入。它会分析带有@Slf4j注解的类,然后根据类的信息自动生成获取Logger对象的代码。这个过程对于开发者是透明的,但实际上是在编译时对代码进行了修改和扩展。例如,它会生成类似于private static final Logger log = LoggerFactory.getLogger(MySlf4jLoggerClass.class);这样的代码。

三、灵活性与兼容性方面

  • private static final Logger log = LoggerFactory.getLogger()
    • 这种方式更加灵活。因为是手动编写获取Logger对象的代码,开发者可以根据具体的需求进行定制。例如,可以通过不同的参数来获取不同配置的Logger对象,或者在一些特殊的环境下(如不能使用 Lombok 的情况),依然能够正常获取和使用Logger对象。
  • @Slf4j
    • 依赖于 Lombok 库。如果项目没有引入 Lombok 或者 Lombok 版本不兼容等情况,使用@Slf4j就会出现问题。不过,在大多数支持 Lombok 的现代 Java 开发环境中,它能很好地工作,并且提供了便捷的日志记录方式。但是在一些严格的开发环境或者对外部库有限制的场景下,其使用可能会受到限制。

小结

@Slf4j注解提供了一种更简洁的方式来获取日志记录器,而传统的private static final Logger log = LoggerFactory.getLogger()方式则更加灵活,在某些复杂的日志配置场景或者无法使用 Lombok 的情况下仍然是一种有效的方式。


http://www.kler.cn/a/461544.html

相关文章:

  • ubuntu支持ssh
  • 40% 降本:多点 DMALL x StarRocks 的湖仓升级实战
  • 【工具推荐】XSS 扫描器-XSStrike
  • 基于深度学习算法的AI图像视觉检测
  • Vue3 子组件向父组件传递消息(Events)
  • HTTP Scheme 通常指的是在 URL 中用于指定使用 HTTP 协议的方案(scheme)
  • wpf 基于Behavior库 的行为模块
  • 网络安全 | 物联网安全:从设备到网络的全方位防护
  • day 29 进程exec函数族 ,进程实现无人机模块,exec实现minishell
  • Ribbon和Eureka的集成
  • 黑神话悟空游戏鼠标光标使用教程与下载
  • 探秘Kafka源码:关键内容解析
  • 【Leetcode 热题 100】22. 括号生成
  • 设计模式-创建型模式-工厂模式
  • 【Git_bugs】remote error GH013 Repository rule violations found for.md
  • 【网络】什么是路由协议(Routing Protocols)?常见的路由协议包括RIP、OSPF、EIGRP和BGP
  • ESP8266+STM32+阿里云保姆级教程(AT指令+MQTT)
  • 随笔 | 写在2024的最后一天
  • 线程锁和协程锁的区别
  • Redis Stream:实时数据处理的高效解决方案
  • 2分钟知晓Vscode 插件发布流程
  • 【Rust自学】8.6. HashMap Pt.2:更新HashMap
  • 智能运维分析决策系统:构建高效运维的新篇章
  • 自动化与人工结合:如何平衡效率与风险?
  • 监控 Docker 注册表
  • 基于 Slf4j 和 AOP 的自动化方法执行时间日志记录方案