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 类中:
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文件中添加以下依赖:
xml 复制代码
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.28</version>
    <scope>provided</scope>
</dependency>

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

java 复制代码
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 的情况下仍然是一种有效的方式。

相关推荐
等一场春雨44 分钟前
Java 23 集合框架详解:ArrayList、LinkedList、Vector
java·开发语言
Hello Dam1 小时前
分布式环境下定时任务扫描时间段模板创建可预订时间段
java·定时任务·幂等性·redis管道·mysql流式查询
javaweiming1 小时前
根据中文名称首字母进行分组
java·汉字转拼音
水宝的滚动歌词6 小时前
设计模式之建造者模式
java·设计模式·建造者模式
孤蓬&听雨6 小时前
Java SpringBoot使用Apache POI导入导出Excel文件
java·spring boot·apache·excel导出·excel导入
紫琪软件工作室8 小时前
自定义有序Map
java
刘婉晴8 小时前
【蓝桥杯研究生组】第14届Java试题答案整理
java·蓝桥杯
Upuping8 小时前
「全网最细 + 实战源码案例」设计模式——外观模式
java·后端·设计模式
等一场春雨8 小时前
Java 21 使用新的日期和时间 API (java.time) 计算当前日期是某活动起始时间的第几天
java·开发语言
南宫生9 小时前
力扣-数据结构-12【算法学习day.83】
java·数据结构·学习·算法·leetcode