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

news2025/1/4 15:54:13

一、代码方面

- 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.coloradmin.cn/o/2269519.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【非关系型数据库Redis 】 入门

Redis入门 一、非关系型数据库概述 &#xff08;一&#xff09;概念 非关系型数据库&#xff08;NoSQL&#xff0c;Not Only SQL&#xff09;是相对于传统的关系型数据库而言的一种数据存储管理系统。它摒弃了关系型数据库中严格的表结构、SQL 语言操作以及复杂的事务等特性…

0基础跟德姆(dom)一起学AI 自然语言处理10-LSTM模型

1 LSTM介绍 LSTM&#xff08;Long Short-Term Memory&#xff09;也称长短时记忆结构, 它是传统RNN的变体, 与经典RNN相比能够有效捕捉长序列之间的语义关联, 缓解梯度消失或爆炸现象. 同时LSTM的结构更复杂, 它的核心结构可以分为四个部分去解析: 遗忘门输入门细胞状态输出门…

Ribbon源码分析

一、Spring定制化RestTemplate&#xff0c;预留出RestTemplate定制化扩展点 org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration 二、Ribbon定义RestTemplate Ribbon扩展点功能 org.springframework.cloud.netflix.ribbon.RibbonAutoConfiguratio…

【C++】智能指针详解(实现)

在本篇博客中&#xff0c;作者将会带领你理解并自己手动实现简单的智能指针&#xff0c;以加深对智能指针的理解。 一.什么是智能指针&#xff0c;为什么需要智能指针 智能指针是一种基于RAII思想实现的一种资源托管方式&#xff0c;至于什么是RAII&#xff0c;后面会讲到。 对…

【微服务】【Sentinel】认识Sentinel

文章目录 1. 雪崩问题2. 解决方案3. 服务保护技术对比4. 安装 Sentinel4.1 启动控制台4.2 客户端接入控制台 参考资料: 1. 雪崩问题 微服务调用链路中的某个服务故障&#xff0c;引起整个链路中的所有微服务都不可用&#xff0c;这就是雪崩。动图演示&#xff1a; 在微服务系统…

macos 支持外接高分辩率显示器开源控制软件

macos 支持外接高分辩率显示器开源控制软件 软件&#xff08;app应用&#xff09;名&#xff1a;BetterDisplay 官方地址&#xff1a; https://github.com/waydabber/BetterDisplay

JVM实战—7.如何模拟GC场景并阅读GC日志

大纲 1.动手模拟出频繁Young GC的场景 2.JVM的Young GC日志应该怎么看 3.代码模拟动态年龄判定规则进入老年代 4.代码模拟S区放不下部分进入老年代 5.JVM的Full GC日志应该怎么看 6.问题汇总 1.动手模拟出频繁Young GC的场景 (1)程序的JVM参数示范 (2)如何打印出JVM GC…

javaEE-文件操作和IO-文件

目录 一.什么是文件 1.文件就是硬盘(磁盘)上的文件。 2.计算机中存储数据的设备&#xff1a; 3.硬盘的物理特征 4.树型结构组织和⽬录 5.文件路径 文件路径有两种表示方式&#xff1a; 6.文件的分类 二、java中文件系统的操作 1.File类中的属性&#xff1a; 2.构造方…

使用 Docker 搭建 Hadoop 集群

1.1. 启用 WSL 与虚拟机平台 1.1.1. 启用功能 启用 WSL并使用 Moba 连接-CSDN博客 1.2 安装 Docker Desktop 最新版本链接&#xff1a;Docker Desktop: The #1 Containerization Tool for Developers | Docker 指定版本链接&#xff1a;Docker Desktop release notes | Do…

数据结构(系列)

在Python中&#xff0c;列表&#xff08;list&#xff09;是一种基本的数据结构&#xff0c;它可以存储一系列的元素。列表是可变的&#xff0c;即可以对其进行增删改查操作。 栈&#xff08;Stack&#xff09;是一种具有特定限制的线性数据结构&#xff0c;在栈中&#xff0c…

【Linux】HTTP cookie与session

在登录B站时&#xff0c;有登录和未登录两种状态&#xff0c; 问题&#xff1a;B站是如何认识我这个登录用户的&#xff1f;问题&#xff1a;HTTP是无状态、无连接的&#xff0c;怎么能够记住我&#xff1f; HTTP协议是无状态、无连接的。比如客户端&#xff08;浏览器&#…

Java - 日志体系_Simple Logging Facade for Java (SLF4J)日志门面_SLF4J集成logback 及 原理分析

文章目录 Pre官网集成步骤POM依赖使用第一步&#xff1a;编写 Logback 的配置文件第二步&#xff1a;在代码中使用 SLF4J 原理分析1. 获取对应的 ILoggerFactory2. 根据 ILoggerFactory 获取 Logger 实例3. 日志记录过程 小结 Pre Java - 日志体系_Apache Commons Logging&…

5.系统学习-PyTorch与多层感知机

PyTorch与多层感知机 前言PyTroch 简介张量&#xff08;Tensor&#xff09;张量创建张量的类型数据类型和 dtype 对应表张量的维度变换&#xff1a;张量的常用操作矩阵或张量计算 Dataset and DataLoaderPyTorch下逻辑回归与反向传播数据表格 DNN&#xff08;全连结网络&#x…

ubuntu 如何使用vrf

在Ubuntu或其他Linux系统中&#xff0c;您使用ip命令和sysctl命令配置的网络和内核参数通常是临时的&#xff0c;这意味着在系统重启后这些配置会丢失。为了将这些配置持久化&#xff0c;您需要采取一些额外的步骤。 对于ip命令配置的网络接口和路由&#xff0c;您可以将这些配…

Unity Shader TexelSize的意义

TexelSize在制作玻璃折射效果时会用到。 // Get the normal in tangent space fixed3 bump UnpackNormal(tex2D(_BumpMap, i.uv.zw)); // Compute the offset in tangent space float2 offset bump.xy * _Distortion * _RefractionTex_TexelSize.xy; i.scrPos.xy offset * i…

嵌入式硬件杂谈(七)IGBT MOS管 三极管应用场景与区别

引言&#xff1a;在现代嵌入式硬件设计中&#xff0c;开关元件作为电路中的重要组成部分&#xff0c;起着至关重要的作用。三种主要的开关元件——IGBT&#xff08;绝缘栅双极型晶体管&#xff09;、MOSFET&#xff08;金属氧化物半导体场效应晶体管&#xff09;和三极管&#…

【亲测有效】k8s分布式集群安装部署

1.实验环境准备 准备三台centos7虚拟机&#xff0c;用来部署k8s集群&#xff1a; master&#xff08;hadoop1&#xff0c;192.168.229.111&#xff09;配置&#xff1a; 操作系统&#xff1a;centos7.3以及更高版本都可以配置&#xff1a;4核cpu&#xff0c;4G内存&#xff…

【SQL server】教材数据库(5)

使用教材数据库&#xff08;1&#xff09;中的数据表完成以下题目&#xff1a; 1 根据上面基本表的信息定义视图显示每个学生姓名、应缴书费 2 观察基本表数据变化时&#xff0c;视图中数据的变化。 3利用视图&#xff0c;查询交费最高的学生。 1、create view 学生应缴费视…

去除el-tabs 下面的灰色横线,并修改每一项的左右间距,和字体颜色

HTML <el-tabs v-model"activeName" class"demo-tabs" tab-click"handleClick"><el-tab-pane label"全部" :name"null"></el-tab-pane><el-tab-pane label"问答陪练" name"general-t…

纯血鸿蒙ArkUI的网格布局详解

网格布局概要 网格布局是由行和列分割的单元格组成&#xff0c;通过指定项目所在的单元格做出各种各样的布局。网格布局具有较强的页面均分能力&#xff0c;子组件占比控制能力&#xff0c;是一种重要的自适应布局组件&#xff0c;其使用场景有九宫格图片展示、日历、计算器等…