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

相关推荐
金銀銅鐵43 分钟前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(上)
java·后端·ai编程
福建佰胜张工1 小时前
SMC 薄型气爪 MHF2-16D1 深度解析:平行开闭、低剖面结构在自动化装配中的选型与落地
java·服务器·安全·自动化
catoop1 小时前
API Key 设计与安全生成方案:结构拆解、数据库设计与 Java 实现
java·数据库·安全
system_error_x2 小时前
SpringBoot 集成 Thymeleaf 简洁入门
java·spring boot·后端
驭渊的小故事2 小时前
Spring AI Alibaba 实战:从maven依赖治理到声明式工具调用
java·人工智能·spring
Elastic 中国社区官方博客3 小时前
我们如何通过 70 多个拉取请求,将 OpenTelemetry Java agent 迁移到 invokedynamic
java·大数据·开发语言·elasticsearch·搜索引擎·全文检索·es
tyn1883 小时前
记录本地安装nacos服务的方法及异常
java·开发语言
步行cgn3 小时前
Spring MVC 视图机制的核心接口与类
java·开发语言·后端·spring·mvc
y1su4 小时前
Leetcode 字符串模板
java·数据结构·算法·leetcode·职场和发展·动态规划
我命由我123455 小时前
Python 开发 - Python 的 pathlib
java·开发语言·后端·python·学习·java-ee·学习方法