扒一扒Lombok的@Slf4j注解,我发现还有点意思。

Lombok @Slf4j log对象没有info等方法 不可用解决方法 一、Lombook插件没安装(几率很小) 可能是idea没有安装lombook插件导致的,去plugin里面安装下Lombok插件就可以了,但是几率很小,高版本idea可以直接排除。 二、SpringBoot的项目依赖冲突 排除 原因一 后可能是由于日志实现在springboot的starter中已经有了,但是又导入了logback-classic,排除冲突问题。 三、普通项目 如果你只导入了Lombook 那么你只是导入了日志的门面,你还需要导入日志的实现 <dependency> & 阅读详情

扒一扒Lombok的@Slf4j注解,我发现还有点意思。

大家好

听说不是 Log4j 爆出漏洞了嘛,然后前几天有小伙伴来问我:我项目里面用的是 Lombok 的 @Slf4j 这个会有影响吗?

你说这事多巧,我也用的这个注解,所以我当时稍微的看了一下。

先说结论:有没有影响还是取决于你项目中依赖的 log4j2 包,和 Lombok 没有任何关系。

另外“求求你提问之前三思,不要浪费我们的时间,不要问那些你自己就能搞清楚的问题”这句话不是我说的,是 Lombok 的作者说的:

他为什么会说出这样的略带一丝丝气愤的话呢?

我带你看看。

从issue 说起

你在 github 上找到 Lombok 项目,然后查看它的 issue 会看到关于 log4j 的问题已经被置顶了:

所以关于这个问题,我就从这个 issue 说起吧,这里面有 Lombok 维护者的权威回答。

github.com/projectlomb…

这个 issue 的标题翻译过来就是:

结论:关于 log4j 的 0day 问题,Lombok 本身不受影响。

注意啊,这个里面有个非常耐人寻味的单词:itself。

一般我们说 Lombok 不受影响就行了,为什么还得加个 itself(本身)呢?

这里面就是有故事的。

首先是 12 月 10 日下午 5 点 41 分,也就是漏洞被爆出的那个下午,有个哥们在 Lombok 的 issue 提出了这个问题:

他说:铁子们,出事了,log4j 爆出惊天大漏洞,赶紧补吧。

然后有个叫做 Rawi01 的老铁跳出来说:

老哥,你能解释一下这个漏洞 对 Lombok 有什么影响吗?据我所知,log4j 只是在运行测试时不出现编译错误时才需要。

这个老哥明显是对 Lombok 比较了解的,他其实已经指出关键的地方了:Lombok 并没有依赖 log4j。

但是紧接着有人指出:

Lombok 提供了一个注解,叫做 @log4j。这玩意使用了 Log4J 的库吧,毕竟要用它记录日志。

确实有这个注解啊,给大家看一下:

我一般是用 @Slf4j 这个注解,但是它确实是还提供了其他的日志注解,这个先按下不表,等下再说。

现在的主线任务是这个 issue,接着往下看。

接下来,来了一个控场的哥们,看一下他说了啥:

他先艾特了前面的说 @log4j 注解的这个哥们,给他解释说:虽然 Lombok 会生成代码来创建一个 logger 的实例,但我们并没有 ship, distribute or require 任何特定的版本,如果用户要用这个注解,需要他们自己提供对应的依赖。

这里我有三个词我还没翻译:ship, distribute or require。

require 其实很简单,就是要求。

意思是我们没有要求用户使用的时候必须给到指定版本的依赖。说白了就是,假设你要用 @Log4j,那就提供对应的依赖,至于这个依赖的版本是什么 Lombok 并不关心。

剩下的 ship 直译过来是“运送” 的意思,而 distribute 有“分发”的意思。

这个我用一张图片来解释吧:

可以看到,在项目中我引用了 Lombok,但是它并没有传递依赖进来任何其他的包。不像是 spring-boot-starter 后面跟着一大坨东西。

我理解这就是他想要表达的:we do not ship, distribute or require any specific version.

然后接着说:在我们的代码库中确实可以找到一个 log4j2 的版本,但那只是在测试代码里面使用,以便能够无错误地编译生成的代码。

最后这个哥们总结到:放心,老铁们,Lombok 仍然可以安全的使用。但我觉得虽然是测试代码中引用到了 Log4j ,也还是应该把依赖关系更新到安全的版本。

怎么样,是不是感觉这个老哥说话有一种不可置疑的自信感。

我读完这个回答之后就是有这样的感觉,隐隐觉得这就是个大佬。

于是我去扒了一下这个老哥的背景:

本来我是想从他的 github 主页上寻找答案,居然没有发现和 Lombok 相关的项目。

而且只有 49 个 followers,看着也不符合大佬的数据呀:

于是我转战浏览器,搜索了:Roel Spilker Lombok.

找到了这个:

才发现,好家伙,他是 Lombok 的爸爸啊,难怪说话这么硬气。

还发现了一个花边新闻:他们之前还把关于 Lombok 的想法贡献给了 Oracle,但是被拒绝了。官方不支持,他们只有揭竿而起,自己搞了。

现在 Lombok 的市场占有率还是很高的吧,算是把这事儿干成功了。

另外,其实这里就可以直接看到他的身份:

Collaborator,就是合作人。他的回答可以等同于官方回答了。

到这里事情还算是发展的比较顺利,官方亲自下场来解答这个问题,且已经明说了:

算是可以完结撒花了。

但是,就怕出现但是啊,后面发生的事情我就觉得有点离谱了。

首先是 SunriseChair 老哥献出了一杀:

他首先引用了作者的回复,然后说,如果你在你的 maven 或者 gradle 中声明 Lombok 这个依赖项,那么 Log4j 的依赖项不也会被包括在内吗?这可能是 classpath 上唯一的依赖,而 Lombok 生成的代码也会用到它?如果我说错了,请纠正我......

他想要表达的是什么意思呢。

首先我觉得是他读完作者的回答后觉得 Lombok 是依赖了 Log4j 的,所以他的核心问题就是,如果我引用了 Lombok 那么 Log4j 的依赖岂不是也会传递进来?

但是作者都说了:there is a version to be found in our code base, but that's 仅仅用于测试类中。

但凡你稍微了解一点开源项目的工作原理,也就知道测试相关的部分都不会提供出去,如果你要看测试类,你得把项目源码拉下来。

简单来说就是如果你通过 maven 依赖了 Lombok,测试相关的东西你肯定是看不到的。

接着一位叫做 RuanNunes 的老哥也出来补枪了,献上了二杀,他说他在整个项目里面搜索到了这个东西:

这个配置是存在漏洞的。

然后作者对这两个问题进行了一一回复:

首先,说 Lombok 依赖了 log4j 的老哥听着:Lombok 没有对 log4j 或任何其他库进行依赖。如果你在你的代码中使用 @Log4j 注解,但是又不直接或间接地依赖 log4j ,你的编译就会产生一个错误信息。

关于这一点,前面的依赖分析截图也已经说明了,我就不再贴一次了。

然后说找到漏洞的哥们听着:在你找到的这个漏洞的同一目录下有一个文本文件,但凡你去看一眼,你就知道我们不会将该文件作为我们发布的一部分。

所以我理解压根不会发布出去,即使有漏洞,对于 Lombok 的用户来说也没有任何毛病吧?

我也去找了一下作者说的这个文件,就是它:

github.com/projectlomb…

这个文件里面清清楚楚的说了:not part of lombok itself.

如果前面这两个问题,已经让作者有点点不爽的感觉的话,那么接下来这个问题,可能就是引爆点,完成三杀,一波带走:

这个哥们上来就说:老铁,我问个问题哈。我使用的是 @slf4j 注解,这个漏洞和我有关系吗?

不行了不行了,血压上来了。

我觉得这个哥们提问之前完全没有看前面的回复,如果他在作者进行了两次解释之前提出这个问题,那么我觉得完全可以理解。

但是在作者已经在这个 issue 里面解释了两次“Lombok 不受影响”的前提下,他哗一下,上来就是一个暴击:

老哥,我用的这个注解有问题吗?

我写到这里都有点血压上来了。

这特么特别像是之前有一次在一个群里和别人讨论事务失效的场景,已经讨论到尾声了,突然跳出来一个哥们,甩出来一个代码片段,这个片段的写法就是一个经典的 this 调用导致事务注解失效的场景,而这就是我们刚刚讨论中的一部分。

知道我们在讨论这个问题,哪怕你稍微往上翻一翻呢,了解一下上下文再提问不好吗?

不扯远了,也许是我过度解读把,反正我觉得提问的艺术大家都得好好学一下。

回到我们的主线剧情,看一下作者是怎么回答这个问题的:

他说:老铁,这个问题我帮不了你啊。我对于这个漏洞一无所知,我甚至不明白为什么你会认为它也会影响 @Slf4j。

我可以告诉你的是,Lombok 没有使用、传递、要求对这些库的依赖。

我们的工作原理是生成了你"看不见的源代码"。

如果你有任何理由怀疑类似的问题也可能发生在他们的产品中,请联系 Slf4j 的维护者。

不知道是不是我个人的感觉,我觉得作者回复这个问题的时候已经有一点怒气了:这都是些什么问题啊?前我已经回复了两次不受影响啊?怎么感觉我的项目使用者怎么都不了解 Lombok 的基本原理呢?

在作者回复完这个冒失的提问者之后,这个提问者还是很礼貌的回复了一下:

谢了老铁,我检查了,我使用的是 SpringBoot 默认的 logback。

作者也把这个问题给置顶了,且修改了这个 issue 的标题。

所以,经过前面的一番解读,现在你再看这个标题:

为什么作者要强调“itself”,因为 Lombok 确实是提供了日志的功能,但是至于引用什么包,哪个版本的包,和 Lombok 都没有任何关系。 Lombok 本身(itself)是安全的。

最最后,作者给了 log4j 漏洞对于 Lombok 的 Latest assesment(最新评估),算是总结性发言:

给大家翻译一下关键的东西。

这个漏洞只存在于 2.16.0 版本以下的 Log4j code 包中,而不存在于任何其他日志框架中。

Lombok 没有传递依赖任何 Log4j 包,也没有声明对任何东西的依赖。

如果你使用任何 Lombok 的注解,比如 @Log4j,Lombok 将生成使用这些库的代码,但是你的项目里面必须要包含对这些库的依赖,否则 Lombok 生成的代码将无法编译。

同样地,你要负责在你的运行时中拥有这些包,否则类的初始化可能会失败。

在 Lombok 测试代码中,我们曾经有一个包含这个漏洞的版本,但是由于测试不处理任何用户输入(测试是硬编码的),而且生成的代码甚至没有被执行,运行测试并没有导致执行测试的机器上出现 RCE(远程代码/命令执行漏洞)。

所以,老铁们,Lombok 本身不需要做任何改变,也不对你的项目负任何安全责任,毕竟包不是我们引进来的。

如果你不同意目前的评估,请在这个问题上添加评论。

但是,请确保你已经阅读了其他评论,并确保你理解了这个问题。

最后这两句话,单独拎出来,我可太喜欢这两句话了:

求求你提问之前三思,不要浪费我们的时间,不要问那些你自己就能搞清楚的问题。

如果你认为我们遗漏了什么,或者有新的信息,请大声的说出来。

然后,你注意这里作者用的小标题是:The balancing act.

翻译过来是“平衡的行为”,啥玩意?

NO,NO,NO:

一个小俚语送给大家,不必客气。

补充说明

前面把主线剧情过完了,现在我来几个补充说明吧。

先说前面按下不表的关于日志的注解。

其实 Lombok 里面关于日志的注解还真是挺多的,可以直接看官方的文档:

projectlombok.org/features/lo…

这么多注解,一个个的讲也没啥意思,我这里就挑 @Slf4j 、@Log4j2 这两个演示一下吧。

首先,我们可以搞个纯净的 SpringBoot 项目,只包含这两个依赖:

这个时候如果我什么都不动,只是稍微改一下启动类:

然后为了排除干扰项我把日志打印的级别调整到 Error:

logging.level.root=error

同时关闭 banner 输出:

spring.main.banner-mode=off

banner 就是这个玩意:

这个时候启动项目,日志输出是这样的:

可以看到我们这个时候使用的日志是 logback,原因我在之前的文章里面也讲过了,因为 Springboot 默认使用的日志实现是 logback。

这一点,从项目依赖上也可以看出来:

另外,你注意一下,我特意把 import 部分也截出来了,除了 @Slf4j 注解外,这里并没有引入任何日志相关的注解。

然后,我再关注一下这个时候编译出来的 class 文件:

自动引入了 slf4j 相关的包,然后生成了这行代码:

private static final Logger log = LoggerFactory.getLogger(LogdemoApplication.class);

这个时候不知道你有没有想到编译时注解相关的东西,但是不慌,这里还是先按下不表。

来,我问你:为什么它能引入 slf4j 相关的包?

因为我依赖了呀:

好,如果这个时候我把 logback 的核心依赖给拿掉,会出现什么事情,你觉得会不会编译不过呢?

不会编译不过,因为 Slf4j 包还在,它只是一个日志门面。

但是运行的时候会抛出异常,因为找不到日志相关的具体实现类:

然后,如果我想用 log4j2 日志实现怎么办呢?

之前的文章中也写过:

把 Springboot 默认的依赖拿掉,然后引入 Log4j2 的包。

这个时候项目依赖图是这样的,可以看到没有 logback-core 了,只有 log4j-core:

再次运行项目,日志实现就变成了 Log4j:

你发现了吗,我除了动了一下 pom 依赖外,其他的代码一行都没有动,日志框架就从 logback 变化为了 log4j。

而且 class 文件没有任何变化,所以我也就不去截图了。

这就是 Slf4j 的功劳,这就是“门面”的含义,这就是为什么都建议大家在项目中使用 Slf4j,而不是具体的诸如 logback、log4j 这样具体的日志实现。

接下来说一下 @Log4j2 这个注解。

我们还是把依赖恢复到最开始纯净的状态,也就是这样:

然后我们把注解修改为 @Log4j2,但是我们项目中这个时候并没有引入 Log4j-core 包,那么你觉得会有问题吗?

不会有问题的,我们可以看一下。

先看一下输出:

此时的日志实现类是 SLF4JLogger。

这玩意哪里来的?

看一下 class 文件:

这个两个类是来自于 log4j-api 包里面,同时由于 log4j-to-slf4j 包的存在,所以最后的实现类桥接到了 SLF4JLogger 中去:

如果我把 log4j-api 包移除掉,你说会不会编译不过呢?

肯定编译不过的,因为包都不存在了,搞不出来 class 文件:

如果我不想用 SLF4JLogger 这个类呢,我就想用真正的 log4j。

简单,把 log4j 的依赖搞进来:

好,我前面说了这么多的废话,不厌其烦的给你排除、引入日志相关的包,给你看输出啥的,而且整个过程中并不涉及到 Lombok 包的变化,都是为了再次印证这两句话:

如果你使用任何 Lombok 的注解,比如 @Log4j,Lombok 将生成使用这些库的代码,但是你的项目里面必须要包含对这些库的依赖,否则 Lombok 生成的代码将无法编译。

比如我前面把 log4j-api 包移除掉了,是不是编译就没有过?

同样地,你要负责在你的运行时中拥有这些包,否则类的初始化可能会失败。

比如我前面把 logback-core 的包移除了,编译的时候没有问题,但是服务运行的时候,是不是抛出找不到类的异常?

是不是再次证明:

聊聊原理

前面我提到了一句“编译时注解”,不知道大家对于这个玩意了不了解。

不了解其实也很正常,因为我们写业务代码的时候很少自定义编译时注解,顶天了搞个运行时注解就差不多了。

Lombok 的核心工作原理就是编译时注解。

其实我了解的也不算深入,只是大概知道它的工作原理是什么样的,对于源码没有深入研究。

但是我可以给你分享一下两个需要注意的地方和可以去哪里了解这个玩意。

首先第一个需要注意的地方是这里:

log 相关注解的源码位于这个部分,可以看到很奇怪啊,这些文件是以 SCL.lombok 结尾的,这是什么玩意?

这是 lombok 的小心思,其实这些都是 class 文件,但是为了避免污染用户项目,它做了特殊处理。

所以你打开这类文件的时候选择以 class 文件的形式打开就行了,就可以看到里面的具体内容。

比如你可以看看这个文件:

lombok.core.handlers.LoggingFramework

你会发现你们就像是枚举似的,写了很多日志的实现:

这个里面把每个注解需要生成的 log 都硬编码好了。正是因为这样,Lombok 才知道你用什么日志注解,应该给你生成什么样的 log。

比如 log4j 是这样的:

private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(TargetType.class);

这也同时可以和我们前面的 class 文件对应起来:

而 SLF4J 是这样的:

private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(TargetType.class);

第二个需要注意的地方是找到入口:

这些 class 文件加载的入口在于这个地方,是基于 Java 的 SPI 机制:

AnnotationProcessorHider 这个类里面有两行静态内部类,我们看其中一个, AnnotationProcessor ,它是继承自 AbstractProcessor 抽象类:

javax.annotation.processing.AbstractProcessor

这个抽象类,就是入口中的入口,核心中的核心。

在这个入口里面,初始化了一个类加载器,叫做 ShadowClassLoader:

它干的事儿就是加载那些被标记为 SCL.lombok 的 class 文件。

然后我是怎么知道 Lombok 是基于编译时注解的呢?

其实这玩意在我看过的两本书里面都有写,有点模糊的印象,写文章的时候我又翻出来读了一遍。

首先是《深入理解 Java 虚拟机(第三版)》的第四部分程序编译与代码优化的第 10 章:前端编译与优化一节。

里面专门有一小节,说插入式注解的:

Lombok 的主要工作地盘,就在 javac 编译的过程中。

在书中的 361 页,提到了编译过程的几个阶段。

从Java代码的总体结构来看,编译过程大致可以分为一个准备过程和三个处理过程:

  • 1.准备过程:初始化插入式注解处理器。

  • 2.解析与填充符号表过程,包括:

    • 词法、语法分析。将源代码的字符流转变为标记集合,构造出抽象语法树。
    • 填充符号表。产生符号地址和符号信息。
  • 3.插入式注解处理器的注解处理过程:插入式注解处理器的执行阶段,本章的实战部分会设计一个插入式注解处理器来影响Javac的编译行为。

  • 4.分析与字节码生成过程,包括:

    • 标注检查。对语法的静态信息进行检查。
    • 数据流及控制流分析。对程序动态运行过程进行检查。
    • 解语法糖。将简化代码编写的语法糖还原为原有的形式。(java中的语法糖包括泛型、变长参数、自动装拆箱、遍历循环foreach等,JVM运行时并不支持这些语法,所以在编译阶段需要还原。)
    • 字节码生成。将前面各个步骤所生成的信息转换成字节码。

如果说 javac 编译的过程就是 Lombok 的工作地盘,那么其中的“插入式注解处理器的注解处理过程”就是它的工位了。

书中也提到了 Lombok 的工作原理:

第二本书是《深入理解 JVM 字节码》,在它的第 8 章,也详细的描述了插件化注解的处理原理,其中也提到了 Lombok:

最后画了一个示意图,是这样的:

如果你看懂了书中的前面的十几页的描述,那么看这个图就会比较清晰了。

总之,Lombok 的核心原理就是在编译期对于 class 文件的魔改,帮你生成了很多代码。

这也是作者提到的:

invisible source code,看不见的源码。

这里的看不见,指的是 java 文件中的看不见,在 class 文件中它还是无处遁形。

Java项目中使用Lombok的@Slf4j注解时出现‘找不到符号log‘的终极解决方案 本文深入解析了Java项目中使用Lombok的@Slf4j注解时出现'找不到符号log'错误的根本原因,并提供了从基础到进阶的完整解决方案。文章重点介绍了如何通过配置IntelliJ IDEA的注解处理功能、清理缓存以及关键地在Maven编译器插件中正确配置annotationProcessorPaths来彻底解决此问题,帮助开发者一劳永逸地修复这一常见编译错误。 阅读详情

相关推荐

SpringBoot开发——使用@Slf4j注解实现日志输出

SpringBoot使用@Slf4j注解实现日志输出

bjzhang75的博客 2225

注解@Slf4j的简单使用教程

@Slf4j注解的使用

y516369的博客 4万+

日志管理艺术:Slf4j与Logback实用指南(基于Gradle千字长文)

在当今软件开发领域,日志记录是一项至关重要的任务,它不仅帮助开发人员跟踪应用程序的运行状态和行为,还有助于故障排查、性能优化和安全监控。在日志记录领域,slf4j(Simple Logging Facade for Java)和logback是两个备受推崇的工具,它们为 Java 应用程序提供了强大而灵活的日志记录功能。slf4j作为一个简单的日志门面,提供了统一的日志记录接口,使开发人员能够轻松切换不同的日志实现框架,而无需修改应用程序的代码。而logback则是slf4j的一个实现,它提供了高性能、灵活

Xayla的博客 3332

【Java注解系列】注解 @Slf4j

`@Slf4j` 是 Lombok 提供的一种注解,用于在类中自动生成一个名为 `log` 的日志对象。通过使用 `@Slf4j` 注解,可以方便地在代码中使用日志功能,而无需手动创建和初始化日志对象。

wang2leee的博客 1万+

Logisim实战:手把手教你设计硬布线版MIPS CPU(多周期/8指令/附电路图)

本文是一份详细的Logisim实战指南,手把手教你设计一个采用硬布线控制的多周期MIPS CPU。文章深入剖析了硬布线控制与微程序控制的核心理念差异,并逐步讲解了从定义执行状态、构建状态跳转逻辑到生成控制信号、集成测试的完整流程,最终实现一个支持8条指令、可运行简单程序的处理器模型。

g9h0i1的博客 592

Ubuntu系统 nano 编辑器使用教程

• 原因:文件编码不兼容(如 Windows 的 CRLF 换行符)。• 若使用 SSH 工具(如 PuTTY),确保终端设置中未占用。掌握这些操作后,你可以高效使用 nano 完成大部分文本编辑任务!• 底部快捷键栏:显示常用操作的快捷键(• 如果文件已修改,会提示是否保存:按。• 顶部状态栏:显示文件名和编辑状态。表示 Ctrl + G(查看帮助)。保存时自动生成备份文件(原文件名后加。• 强制保存只读文件:用。启动 nano 时添加。启动 nano 时添加。(重做)触发自动缩进。

qq_44534541的博客 2083

lombok @Slf4j注解

前言: @Slf4j是啥,它是干啥的? @Slf4j是用作日志输出的,一般会在项目每个类的开头加入该注解,如果不写下面这段代码,并且想用log private final Logger logger = LoggerFactory.getLogger(当前类名.class); 就可以用@Slf4来代替;这样就省去这段很长的代码。 import ... @Controller @RequestMapping("/abc") @Slf4j public class QueryBillCon.

AlbenXie的博客 3万+

生物信息学工具链搭建:用conda一键搞定MCScanX所有依赖(Ubuntu20.04实测)

本文详细介绍了在Ubuntu20.04系统上使用conda一键部署MCScanX及其所有依赖的高效方法,解决了传统源码编译安装中的依赖冲突问题。通过conda环境管理工具,研究者可以快速搭建生物信息学工具链,实现基因组共线性分析的高效运行,显著提升研究效率。

backprop5master的博客 247

@Slf4j注解

@Slf4j 最初在看到这个注解的时候是在一个Controller类中看到的 @Slf4j @RestController @RequestMapping("/api/pc") publiuc class XXController{} @RestController和@RequestMapping是SpringBoot中比较常见注解用于声明这是一个Controller以及请求的基础路径 那么在看...

鸡蛋壳1.7的博客 3万+

SUMO仿真教程(5) —— 使用“XML“语言自定义构建路网

文章目录一.简要介绍1.node file2.edge file3.lane definitions(1)路段细分(2)邻近的对向车道(3)删除边或车道4.type file(1)简要概述(2)edge定义中引用type文件的示例(3)指定车辆种类的速度限制5.connections file(1)简要概述:(2)connection的属性参数(3)删除连接(4)设置连接的优先级(5)同一边的多个连接二.演示示例:1.自定义编写node file2.自定义编写edge file3.自定义编写type fil

weixin_50632459的博客 5015

从Stereo-seq原始数据到Seurat对象:华大空间转录组分析流程实战解析

本文详细解析了从Stereo-seq原始数据到Seurat对象的完整分析流程,重点解决华大空间转录组数据处理中的三大痛点:bin_size参数设置、批量处理内存管理及格式转换信息丢失。通过Python的stereopy库和R的SeuratDisk包,实现.gem到.h5ad再到.h5seurat的高效转换,为研究者提供了一套可复用的空间转录组分析解决方案。

weixin_30315723的博客 217

深入理解Lombok的@Slf4j注解:简化日志开发的利器

Slf4j是Lombok提供的一个注解,用于在Java类中快速集成日志功能。它通过自动生成这行代码,让开发者无需手动编写重复的日志对象声明。默认生成log// 此时日志对象名为CUSTOM_LOGGER@Slf4j通过极简的注解驱动,解决了Java日志开发中的冗余代码问题。结合Slf4j的门面模式,既保证了日志框架的灵活性,又提升了开发效率。正确理解其背后的设计思想,能帮助我们在项目中更优雅地管理日志。扩展阅读​SLF4J官方手册Lombok注解原理。

m0_69091618的博客 6154

【Unity Shader】2D模型 3D模型混用的穿模问题(Spine在3D场景中出现前后穿模问题的解决办法)

问题描述: 在3D场景中使用Spine模型(2D), 因为Spine需要像Billboard类似的处理,永远是垂直与相机的, 所以一般情况下2D模型能正常显示且前后的阻挡关系也是没有问题的,如下图所示,一切都很美好.(这里用一个四边形,图中的福字表示2D模型) 可是如果后面蓝色的格子比较高,或者2D角色本身也比较高,那么就会出现模型穿插的问题,如下图所示: 如果吧2D模型竖立起来,前后关系肯定是没有问题的,所以也能避免模型穿插的问题,可是就没有Billboard效果,圆形的福字已经被压扁了,如下图:

Vitens的专栏 4590

IntelliJ IDEA使用lombok的@Slf4j后无法使用log问题解决

问题 lombok一直用起来很爽,特别是使用lombok+mybatis-plus的脚手架后,开发效率非常高,今天在开发过程中突然发现使用了@Slf4j注解后在类中无法通过log调用日志打印方法。 现象如图 使用@Slf4j 调用log方法时提示 此处无法调用log方法 问题分析 因为之前导入的包倒错,使用了groovy.util.logging.Slf4j;这个包,修改过来之后,重新进行了maven的clean。问题仍然存在,排除包错误的问题 因为其他类中都可以调起方法,只有这个刚写了类出现这种问题

一只小码渣的博客 16万+

别再只用跳层连接了!手把手教你用DASI和MDCR模块提升红外小目标检测精度

本文详细介绍了如何利用DASI和MDCR模块提升红外小目标检测精度。通过分析传统跳层连接的缺陷,提出维度感知的特征选择性融合(DASI)和多尺度感受野精炼器(MDCR)的创新方案,显著提升小目标检测性能。实验证明,该方法在多个场景下AP@0.5提升达15.4%,特别适用于安防监控和遥感图像分析。

weixin_28715081的博客 224

Claude Code 分布式并行开发最佳实践:1中枢+10Worker跨多Git仓库全流程落地

本文介绍了一套基于Claude Code和Git Worktree的分布式并行开发方案,解决多仓库、微服务开发中的核心痛点。方案采用"1个决策中枢+10个并行Worker"架构,中枢负责任务拆解和调度,每个Worker绑定独立仓库实现完全隔离开发。关键优势包括:任务并行效率提升10倍、跨仓库依赖自动编排、版本统一管理、零第三方依赖。文章详细提供了环境准备、架构设计、中枢搭建和初始化脚本等全流程落地指南,特别适合多仓库协同的全栈开发场景。

AI天才研究院 243

Lombok常用注解:@Slf4j与@Log4j、 @AllArgsConstructor、@NoArgsConstructor、@Data等

目录 使用方法 @Slf4j与@Log4j @AllArgsConstructor、@NoArgsConstructor、@RequiredArgsConstructor @Data 使用方法 在pom文件中添加,具体version版本,可以参考maven版本库的中lombok信息。可以查看目前已有的版本,可以选择使用较多的新版本即可。注意:一定要指定版本,如果不指定会使用最新版本,有可能由于版本不稳定造成各种奇奇怪怪的问题。 <dependency> &lt

zhanggonglalala的博客 9027

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Lombok @Slf4j注解的用法

@Slf4j的使用 首先声明:如果不想每次都写private final Logger logger = LoggerFactory.getLogger(当前类名.class); 可以用注解@Slf4j; 首先得配置安装Lombok插件 添加pom中的lombok依赖: <dependency> <groupId>org.projectlombok</groupI...

XING_Gou的博客 3118

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

@Slf4j注解 - javaweb日志记录

Lombok是一个Java库,它通过注解的方式帮助开发者减少样板代码(boilerplate code)的编写。Lombok提供了一系列的注解,如@Getter@Setter@ToString等,用于自动生成常见的Java代码。@Slf4j注解也是Lombok提供的一个注解,用于简化日志记录的代码编写。

xycxycooo的博客 3029

注解@Slf4j

如果不想每次都写private  final Logger logger = LoggerFactory.getLogger(XXX.class); 可以用注解@Slf4j 一、在pom文件加入依赖    org.projectlombok    lombok 二、代码 package com.sell; import lombok.extern.slf4j.Slf4j;

好运哥的博客 3万+

使用lombok @Slf4j快速添加日志功能

lombok 传统使用日志,需要每次写 private final Logger logger = LoggerFactory.getLogger(XXX.class); slf4j可以用注解@Slf4j直接实现 一、pom.xml导入jar包 <dependency> <groupId>org.projectlombok</groupId> <ar...

weixin_42213903的博客 4504

深入理解日志记录:SLF4J 与 Lombok 的 @Slf4j 注解

SLF4J 是一个用于日志记录的简单门面模式(Facade Pattern),它为各种日志框架(如 Log4j、java.util.logging 和 Logback)提供了一个统一的接口。SLF4J 允许最终用户在部署时插入所需的日志框架,而无需修改代码。Lombok 是一个 Java 库,它通过注解的方式减少了样板代码(boilerplate code)的编写。Lombok 可以自动生成 getter、setter、toString、equals 和 hashCode 方法,以及其他一些常用的代码。

xycxycooo的博客 2895

LomBok常用注解及详细介绍

Lombok是一个作用于编辑器和构建工具的 Java 库,可以对编写的 Java 代码进行增强,比如说不用再写实体类的 getter 方法,equals 方法而是自动生成,自动生成日志输出变量等等,减少重复模板的代码。以上就是今天要讲的内容,本文仅仅简单介绍了LomBok注解的使用。

weixin_43982125的博客 1万+

spring boot Lombok @Slf4j 日志处理一篇足够

spring boot 日志处理

T_TO_O-的专栏 2932
上一篇: Log4j2 再爆雷,Log4j v2.17.0 横空出世
下一篇: Java18都在路上了,你还在用Java8吗?
superjava_
博客等级 码龄5年 254粉丝 81原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值