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

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

相关文章:

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

一、代码方面 - private static final Logger log LoggerFactory.getLogger()方式 详细解释 这是一种传统的获取日志记录器&#xff08;Logger&#xff09;的方式。LoggerFactory是日志框架&#xff08;如 Log4j、Logback 等&#xff09;提供的工厂类&#xff0c;用于创建Lo…...

【项目】基于趋动云平台的Stable Diffusion开发

【项目】基于趋动云平台的Stable Diffusion开发 &#xff08;一&#xff09;登录趋动云&#xff08;二&#xff09;创建项目&#xff1a;&#xff08;三&#xff09;初始化开发环境&#xff1a;&#xff08;四&#xff09;运行代码&#xff08;五&#xff09;运行模型 &#xf…...

Git的.gitignore文件详解与常见用法

诸神缄默不语-个人CSDN博文目录 在日常使用 Git 进行版本控制时&#xff0c;我们经常会遇到一些不需要被提交到远程仓库的文件&#xff08;例如日志文件、临时配置文件、环境变量文件等&#xff09;。为了忽略这些文件的提交&#xff0c;Git 提供了一个非常有用的功能&#xf…...

客户端二维码优化居中和背景

原始 处理后...

Linux 安装运行gatk的教程

1.下载安装 wget https://github.com/broadinstitute/gatk/releases/download/4.1.8.1/gatk-4.1.8.1.zip2.解压 unzip *.zip3.查看 gatk --help 如下显示表示安装成功&#xff1a; 注意&#xff1a;仅限在该包所在位置的路径下能使用...

C++string类

1.为什么学习string类&#xff1f; 1.1C语言中的字符串 C语言中&#xff0c;字符串是以‘&#xff3c;0’结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OO…...

下载linux aarch64版本的htop

htop代码网站似乎没有编译好的各平台的包&#xff0c;而自己编译需要下载一些工具&#xff0c;比较麻烦。这里找到了快速下载和使用的方法&#xff0c;记录一下。 先在linux电脑上执行&#xff1a; mkdir htop_exe cd htop_exe apt download htop:arm64 # 会直接下载到当前目…...

MYSQL---------支持数据类型

数值类型 整数类型 TINYINT&#xff1a;通常用于存储小范围的整数&#xff0c;范围是-128到127或0到255&#xff08;无符号&#xff09;。例如&#xff0c;存储年龄可以使用TINYINT类型。示例&#xff1a;CREATE TABLE users (age TINYINT);SMALLINT&#xff1a;范围比TINYINT…...

黑马JavaWeb开发跟学(十四).SpringBootWeb原理

黑马JavaWeb开发跟学 十四.SpringBootWeb原理 SpingBoot原理1. 配置优先级2. Bean管理2.1 获取Bean2.2 Bean作用域2.3 第三方Bean 3. SpringBoot原理3.1 起步依赖3.2 自动配置3.2.1 概述3.2.2 常见方案3.2.2.1 概述3.2.2.2 方案一3.2.2.3 方案二 3.2.3 原理分析3.2.3.1 源码跟踪…...

迅为RK3568开发板编译Android12源码包-设置屏幕配置

在源码编译之前首先要确定自己想要使用的屏幕并修改源码&#xff0c;在编译镜像&#xff0c;烧写镜像。如下图所示&#xff1a; 第一步&#xff1a;确定要使用的屏幕种类&#xff0c;屏幕种类选择如下所示&#xff1a; iTOP-3568 开发板支持以下种类屏幕&#xff1a; 迅为 LV…...

Spring Boot 中 TypeExcludeFilter 的作用及使用示例

在Spring Boot应用程序中&#xff0c;TypeExcludeFilter 是一个用于过滤特定类型的组件&#xff0c;使之不被Spring容器自动扫描和注册为bean的工具。这在你想要排除某些类或类型&#xff08;如配置类、组件等&#xff09;而不希望它们参与Spring的自动装配时非常有用。 作用 …...

Prometheus 采集 JVM 数据

Prometheus 采集 JVM 数据通常通过集成 JMX Exporter&#xff08;Java Management Extensions Exporter&#xff09;实现。以下是完整的介绍和操作步骤&#xff1a; 1. 原理概述 JVM 数据采集依赖于 JMX&#xff08;Java Management Extensions&#xff09;&#xff0c;JVM 提…...

OpenNJet v3.2.0正式发布!

在这个版本中&#xff0c;NJet实现重大突破&#xff0c;提供了动态Upstream的能力。这是一个关键的特性&#xff0c;使得NJet可以按需动态管理上游服务器池&#xff0c;从而使得业务方可以按需配置资源池&#xff0c;实现业务分区、算法切换&#xff1b;结合动态路由技术&#…...

TinaCMS: 革命性的开源内容管理框架

在如今的数字时代&#xff0c;高效的内容管理系统&#xff08;CMS&#xff09;已成为构建内容丰富网站和应用程序的必需品。传统 CMS&#xff0c;如 WordPress 和 Drupal&#xff0c;功能丰富但复杂度高。而新一代 CMS&#xff0c;例如 TinaCMS&#xff0c;以其灵活性和开发者友…...

VuePress2配置unocss的闭坑指南

文章目录 1. 安装依赖&#xff1a;准备魔法材料2. 检查依赖版本一定要一致&#xff1a;确保魔法配方准确无误3. 新建uno.config.js&#xff1a;编写咒语书4. 配置config.js和client.js&#xff1a;完成仪式 1. 安装依赖&#xff1a;准备魔法材料 在开始我们的前端魔法之前&…...

SpringCloud(二)--SpringCloud服务注册与发现

一. 引言 ​ 前文简单介绍了SpringCloud的基本简介与特征&#xff0c;接下来介绍每个组成部分的功能以及经常使用的中间件。本文仅为学习所用&#xff0c;联系侵删。 二. SpringCloud概述 2.1 定义 ​ Spring Cloud是一系列框架的有序集合&#xff0c;它巧妙地利用了Spring…...

JavaVue-Get请求 数组参数(qs格式化前端数据)

前言 现在管理系统&#xff0c;像若依&#xff0c;表格查询一般会用Get请求&#xff0c;把页面的查询条件传递给后台。其中大部分页面会有日期时间范围查询这时候&#xff0c;为了解决请求参数中的数组文件&#xff0c;前台就会在请求前拦截参数中的日期数组数据&#xff0c;然…...

Java-多种方法实现多线程卖票

Java多线程卖票是一个经典的并发编程问题,它展示了如何在多个线程之间安全地共享和修改资 源。以下是几种实现方式: 使用synchronized关键字: 使用synchronized修饰符来同步方法或代码块,确保同一时刻只有一个线程可以访问临界区(即操 作共享资源的代码)。 使用Reen…...

LLVM防忘录

目录 Windows中源码编译LLVMWindows下编译LLVM Pass DLL Windows中源码编译LLVM 直接从llvm-project下载源码, 然后解压后用VS2022打开该目录, 然后利用VS的开发终端执行: cmake -S llvm -B build -G "Visual Studio 17 2022" -DLLVM_ENABLE_PROJECTSclang -DLLVM_…...

Elasticsearch:基础概念

一、什么是Elasticsearch Elasticsearch是基于 Apache Lucene 构建的分布式搜索和分析引擎、可扩展数据存储和矢量数据库。它针对生产规模工作负载的速度和相关性进行了优化。使用 Elasticsearch 可以近乎实时地搜索、索引、存储和分析各种形状和大小的数据。Elasticsearch 是…...

【快速实践】类激活图(CAM,class activation map)可视化

类激活图可视化&#xff1a;有助于了解一张图像的哪一部分让卷积神经网络做出了最终的分类决策 对输入图像生成类激活热力图类激活热力图是与特定输出类别相关的二维分数网格&#xff1a;对任何输入图像的每个位置都要进行计算&#xff0c;它表示每个位置对该类别的重要程度 我…...

从零开始自搭SpringBoot项目 -- Qingluopay项目工程介绍

从零开始自搭项目 – QingLuoPay 一&#xff0c;为什么要从零开始自搭项目 首先在介绍这个项目之前先介绍一下我为什么要选择从零自搭项目&#xff0c;而不是跟着网上哪些视频等做项目。 之前的很长一段时间我也都是在网上找一些做项目的视频就包含黑马的&#xff08;神领物…...

使用 Jupyter Notebook:安装与应用指南

文章目录 安装 Jupyter Notebook1. 准备环境2. 安装 Jupyter Notebook3. 启动 Jupyter Notebook4. 选择安装方式&#xff08;可选&#xff09; 二、Jupyter Notebook 的基本功能1. 单元格的类型与运行2. 可视化支持3. 内置魔法命令 三、Jupyter Notebook 的实际应用场景1. 数据…...

.NET框架用C#实现PDF转HTML

HTML作为一种开放标准的网页标记语言&#xff0c;具有跨平台、易于浏览和搜索引擎友好的特性&#xff0c;使得内容能够在多种设备上轻松访问并优化了在线分享与互动。通过将PDF文件转换为HTML格式&#xff0c;我们可以更方便地在浏览器中展示PDF文档内容&#xff0c;同时也更容…...

使用 httputils + chronicle-bytes 实现金融级 java rpc

1、认识 chronicle-bytes Chronicle-Bytes 是一个类似于 Java NIO 的 ByteBuffer 的高效字节操作库&#xff0c;但它提供了许多扩展功能。这个项目由 OpenHFT 开发并维护&#xff0c;旨在提供高性能、低延迟的数据处理解决方案。Chronicle-Bytes 设计用于高频率交易和其他对性…...

开源模型应用落地-Qwen2.5-7B-Instruct与vllm实现推理加速的正确姿势-利用KOR框架实现结构化输出(七)

一、前言 目前,大语言模型已升级至Qwen2.5版本。无论是语言模型还是多模态模型,均在大规模多语言和多模态数据上进行预训练,并通过高质量数据进行后期微调以贴近人类偏好。在本篇学习中,将集成vllm实现模型推理加速,现在,我们赶紧跟上技术发展的脚步,去体验一下新版本模…...

利用大语言模型解决推理任务

利用大语言模型&#xff08;Large Language Models, LLMs&#xff09;来解决推理任务是目前人工智能领域中的一个重要研究方向。大语言模型&#xff0c;如GPT系列&#xff08;包括ChatGPT&#xff09;和BERT等&#xff0c;具有强大的自然语言理解和生成能力&#xff0c;已经能够…...

修复OpenLinkSaas客户端在使用AtomGit账号时页面崩溃

问题描述&#xff1a;当一个新的AtomGit用户登录OpenLinkSaas客户端后出现了页面崩溃。 从浏览器控制台来看&#xff0c;是gitNoticeList出现了null。 查看代码后发现是请求atomGit api是返回的一个null的列表 接下来我们加下保护性的代码&#xff0c;来兼容null或undefine的情…...

如何使用大语言模型进行事件抽取与关系抽取

诸神缄默不语-个人CSDN博文目录 文章目录 1. 什么是事件抽取与关系抽取&#xff1f;2. 示例&#xff1a;使用大语言模型进行事件抽取与关系抽取 1. 什么是事件抽取与关系抽取&#xff1f; 事件抽取是指从文本中识别出与某些“事件”相关的信息。这些事件通常包括动作、参与者、…...

WebRTC线程的启动与运行

WebRTC线程运行的基本逻辑&#xff1a; while(true) {…Get(&msg, …);…Dispatch(&msg);… }Dispatch(Message *pmsg) {…pmsg->handler->OnMessage(pmsg);… }在执行函数内部&#xff0c;就是一个while死循环&#xff0c;只做两件事&#xff0c;从队列里Get取…...

Unity3D ILRuntime开发原则与接口绑定详解

引言 ILRuntime是一款基于C#的热更新框架&#xff0c;使用IL2CPP技术将C#代码转换成C代码&#xff0c;支持动态编译和执行代码&#xff0c;适用于Unity3D的所有平台&#xff0c;包括Android、iOS、Windows、Mac等。本文将详细介绍ILRuntime在Unity3D中的开发原则及接口绑定技术…...

grouped = df.drop(‘name‘, axis=1).groupby(‘team‘)

这行代码&#xff1a; grouped df.drop(name, axis1).groupby(team)的作用是首先删除 DataFrame 中的 name 列&#xff0c;然后按 team 列进行分组。以下是对每个部分的详细解释&#xff1a; 1. df.drop(name, axis1) df.drop(name, axis1) 这部分代码会从 DataFrame df 中…...

mysqll连接用时太长解决方法

1、连接用时太长分析 从客户端连接mysql服务器&#xff0c;时间长达10几秒&#xff0c;此为mysql的dns的反向解析造成&#xff0c;在局域网内如果都是用ip连接&#xff0c;可以通过在配置文件中添加skip-name-resolve&#xff0c;取消此功能&#xff0c;取消后&#xff0c;就不…...

Elasticsearch:利用 AutoOps 检测长时间运行的搜索查询

作者&#xff1a;来自 Elastic Valentin Crettaz 了解 AutoOps 如何帮助你调查困扰集群的长期搜索查询以提高搜索性能。 AutoOps 于 11 月初在 Elastic Cloud Hosted 上发布&#xff0c;它通过性能建议、资源利用率和成本洞察、实时问题检测和解决路径显著简化了集群管理。 Au…...

SpringCloud源码-Ribbon

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

使用Python,pypinyin将汉字转为带音调,首字母等多种风格的拼音,自动学习生字词

使用Python&#xff0c;pypinyin将汉字转为带音调&#xff0c;首字母等多种风格的拼音&#xff0c;自动学习生字词 1. 效果图2. 安装及支持的音调分类3. 源码参考 这篇博客将介绍如何使用Python&#xff0c;pypinyin将汉字转为带音调的拼音&#xff0c;自动学习生字词&#xff…...

消防设施操作员考试题库及答案

一、单选题 1.根据国家标准《防火门》(CB1295~2008)的规定&#xff0c;门扇上带防火玻璃的防火门的代号为&#xff08;&#xff09;。 A.s B.bl C.b D.l 答案&#xff1a;C 解析&#xff1a;根据初级教材238页&#xff0c;门扇上带防火玻璃的防火门的代号为b。 2.关于彩…...

算法:IMPACT通过微生物特征分析可解释的微生物表型

文章目录 介绍框架代码参考 介绍 人类肠道微生物群由数万亿细菌组成&#xff0c;对健康和疾病有重大影响。通过现代技术的进步&#xff0c;高通量分析提供了增强我们对微生物组与复杂疾病结果之间联系的理解的潜力。然而&#xff0c;目前的微生物组模型缺乏微生物特征的可解释…...

2、zookeeper和kafka

zookeeper zookeeper基本知识 zookeeper&#xff1a;开源的分布式框架协调服务 zookeeper的工作机制 基于观察者模式设计的分布式结构&#xff0c;复制存储和管理架构当中的元信息&#xff0c;架构当中的应用接受观察者的监控&#xff0c;一旦数据有变化&#xff0c;通知对于…...

监控工具(Nagios)

2.4 Nagios 2.4.1 基础概念讲解 嘿&#xff0c;小伙伴们&#xff01;我们已经见识过了Prometheus、Grafana和Zabbix的强大功能&#xff0c;现在是时候认识一下监控界的“老大哥”——Nagios了&#xff01;Nagios是一款历史悠久的开源监控工具&#xff0c;虽然它可能没有像Zab…...

c++不够用知识补充-using namespace

感觉c的知识储备不够用了&#xff0c;忘记的再捡起来&#xff1f;&#xff01; C之using namaspace;(未完)_namspace include-CSDN博客文章浏览阅读238次。初学C时&#xff0c;只要是程序都是用这个来打头。#includeusing namespace std;以前也不求甚解&#xff0c;知道随着对…...

奇异值分解SVD

线性变换 SVD在2*2矩阵 SVD推广到任意大小矩阵 去掉奇异值小的部分&#xff1a; 原始的时空矩阵模式1模式2模式3...

如何在 Windows 10/11 上录制带有音频的屏幕 [3 种简单方法]

无论您是在上在线课程还是参加在线会议&#xff0c;您都可能需要在 Windows 10/11 上录制带有音频的屏幕。互联网上提供了多种可选方法。在这里&#xff0c;本博客收集了 3 种最简单的方法来指导您如何在 Windows 10/11 上使用音频进行屏幕录制。请继续阅读以探索&#xff01; …...

Linux centos7 docker安装 (yum快速安装)

Linux centos7 docker安装 &#xff08;yum快速安装&#xff09; 1. 查看内核1.1 内核升级操作&#xff08;可选&#xff09; 2. 部署docker2.1 卸载旧版本2.2 安装需要的软件包2.3 添加阿里云镜像源2.4 部署docker&#xff08;可手动选择版本&#xff0c;默认安装最新版本&…...

深入Android架构(从线程到AIDL)_08 认识Android的主线程

目录 3、 认识Android的主线程(又称UI线程) 复习&#xff1a; 各进程(Process)里的主线程​编辑 UI线程的责任&#xff1a; 迅速处理UI事件 举例 3、 认识Android的主线程(又称UI线程) 复习&#xff1a; 各进程(Process)里的主线程 UI线程的责任&#xff1a; 迅速处理UI事…...

接受Header使用错Map类型,导致获取到的Header值不全

问题复现 在 Spring 中解析 Header 时&#xff0c;我们在多数场合中是直接按需解析的。例如&#xff0c;我们想使用一个名为 myHeaderName 的 Header&#xff0c;我们会书写代码如下&#xff1a;RequestMapping(path "/hi", method RequestMethod.GET) public Str…...

等保测评和密评的相关性和区别

等保测评和密评在网络安全领域均扮演着至关重要的角色&#xff0c;它们之间既存在相关性&#xff0c;又各具特色。 以下是对两者相关性和区别的详细阐述&#xff1a;相关性 1.法律基础&#xff1a;等保测评和密评都是依据国家相关法律法规开展的活动。 等保测评主要依据《网…...

朱姆沃尔特隐身战舰:从失败到威慑

前言 "朱姆沃尔特"号驱逐舰是美国海军雄心勃勃的项目&#xff0c;旨在重塑未来海战。它融合了隐身、自动化和强大火力&#xff0c;然而由于技术问题和预算超支&#xff0c;原计划建造32艘的目标被大幅缩减&#xff0c;最终只建造了三艘。该舰的设计特点包括“穿浪逆船…...

create-a-weather-app-using-flask-python

使用 Flask | Python 创建天气应用程序 原文:https://www . geesforgeks . org/create-a-weather-app-use-flask-python/ 先决条件: 烧瓶安装 Flask 是一个用 Python 编写的轻量级框架。它是轻量级的&#xff0c;因为它不需要特定的工具或库&#xff0c;并且允许快速的 web 开…...

BurpSuite2024.11

新增功能 2024 年 11 月 25 日&#xff0c;版本 24.11 此版本引入了站点地图过滤器 Bambdas、匹配和替换 Bambdas、用于 API 扫描的动态身份验证令牌&#xff0c;以及用于入侵者攻击的增强负载管理。我们还进行了多项用户体验改进、性能改进和一些错误修复。 使用 Bambdas 过…...