扒一扒这个注解,我发现还有点意思。 (中)

简介: 扒一扒这个注解,我发现还有点意思。 (中)

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

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


image.png

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

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

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

image.png

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

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


image.png


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

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

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

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

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

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

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

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

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

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

image.png

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

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

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

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

NO,NO,NO:

image.png

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

image.png


补充说明


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

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

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

https://projectlombok.org/features/log


image.png


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

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

image.png

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

image.png

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

logging.level.root=error

同时关闭 banner 输出:

spring.main.banner-mode=off

banner 就是这个玩意:

image.png

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

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

image.png

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

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

image.png

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

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

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

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

因为我依赖了呀:

image.png

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

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

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

image.png

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

之前的文章中也写过:

image.png


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
4月前
|
Java 编译器
你说啥什么?注解你还不会?
你说啥什么?注解你还不会?
34 0
|
1天前
|
Java 数据库连接 数据库
什么时候用@MapperScan 注解?
什么时候用@MapperScan 注解?
|
4月前
|
安全 前端开发 Java
注解的使用
注解的使用
38 0
|
10月前
|
Java 编译器 数据库连接
注解
注解是JAVA5引入JAVA的一个特性,理解起来会有点抽象,这里笔者先给出自己对注解的一个理解——注解就是一张便签! 其次要有一个概念就是注解的应用是基于反射的。 本文举出的三个实例中例1和例3是引用其它的优秀文献 出处为how2J以及 https://blog.csdn.net/briblue/article/details/73824058一文
44 0
|
Java 测试技术 Spring
关于@RunWith注解的一点问题
IDEA写springboot测试关于@Runwith的小问题
142 0
关于@RunWith注解的一点问题
|
Java 编译器
关于@FunctionalInterface注解
FunctionalInterface
323 0
关于@FunctionalInterface注解
|
存储 JSON Java
一文学会注解的正确使用姿势
一文学会注解的正确使用姿势
一文学会注解的正确使用姿势
|
XML Dubbo Java
duboo注解使用详解
当越来越的的接口与实现类的增加后,duboo的xml配置会越来越多,为了防止几百几千行的代码,减少开发人员配置xml的工作量,使用duboo的注解模式,减少配置多出问题多的可能性!
132 0
duboo注解使用详解
扒一扒@Retryable注解,很优雅,有点意思! (4)
扒一扒@Retryable注解,很优雅,有点意思! (4)
188 0
扒一扒@Retryable注解,很优雅,有点意思! (4)
扒一扒@Retryable注解,很优雅,有点意思! (3)
扒一扒@Retryable注解,很优雅,有点意思! (3)
427 0
扒一扒@Retryable注解,很优雅,有点意思! (3)