Myc*_*ina 5 spring log4j slf4j log4j2
嗯,我认为标题描述了这个问题。我知道spring-boot-starter-log4j2如果我想在 spring 中使用 log4j2 作为我的日志框架,我应该使用它。但我的问题是,它与普通的 org.apache.logging.log4j:log4j-api 有什么不同?
查看 的编译时依赖性spring-boot-starter-log4j2,它具有log4j-slf4j2-impl. 这是否意味着它在 log4j2 实现之上使用 SLF4J 接口?我仍然可以使用 SLF4J 中不可用的 log4j2 特定功能吗?
如果上一个问题的答案是否定的,有什么方法可以配置我的依赖项,以便我可以使用所有 log4j2 功能?因为在我阅读了这个问题的答案:Is it值得使用 slf4j 与 log4j2 后,我得出的结论是最好直接编码到 log4j2 API。
谢谢。
TL;DR:spring-boot-starter-log4j2让我们选择 Log4j 2.x Core 作为日志记录后端,log4j-api让我们选择 Log4j 2.x API 作为日志记录 API。API 和后端的选择是独立的(参见API 分离)。
所有 Spring Boot 启动器都是 BOM(物料清单),允许您通过将库分组在一起来简化依赖项列表。
Spring Boot 的核心功能之一是统一日志记录(参见文档):主要的日志记录 API(Java Util Logging、SLF4J、Log4j 2.x API)都配置为使用相同的后端。因此,在 Spring Boot 日志中,您将找到所有库生成的日志,无论它们使用什么 API。
日志记录启动器包含一个日志记录后端以及从外部 API 到后端本机 API 的桥梁:
spring-boot-starter-logging包含logback-classic(其本机 API 是 SLF4J)、jul-to-slf4j(JUL 到 SLF4J 桥)和log4j-to-slf4j(Log4j 2.x API 到 SLF4J 桥)。spring-boot-starter-log4j2包含log4j-core(其本机 API 是 Log4j 2.x API)、log4j-jul(JUL 到 Log4j 2.x API 桥)和log4j-slf4j2-impl(SLF4J 到 Log4j 2.x API 桥)。这些是运行时依赖项,可让您选择日志记录后端。正如您所评论的,它们不(明确)包含任何日志记录 API。
日志API的选择是完全独立的,你可以选择(并且应该声明为编译依赖):
slf4j-api,原始 API 之一,也是第一个提供"{}"插值的 API。如果您想使用 Logback 作为后端,这是最好的选择,您将无法使用 Log4j 2.x Core 的所有功能(例如无垃圾日志记录或自定义消息)。log4j-api,一个较年轻的 API,包含 SLF4J 中的大部分方法等等。如果您想使用 Log4j 2.x Core 作为后端,这是最佳选择。如果您使用 Logback,您仍然可以使用它的大部分功能。一些最新的Logback 功能(例如,一组与MDC 中不同的键值对)无法直接从Log4j 2.x API 访问。