java - log4j2 在运行时更改配置 - 已经支持或需要自定义类?

标签 java log4j2

我是日志记录新手,想在我的项目中使用 slf4j 和 log4j2。 配置使用的是 json 文件。

我知道您可以在运行时使用 ConfigurationFactory 创建一个配置,或者使用一个文件,该文件将在每次发出日志语句并且给定时间(或没有)过去时检查它是否已更改。

我的问题是关于 json 文件的。我是否必须编写自己的类来使用 json 解析器更改该文件,或者 slf4j/log4j2 是否会以某种方式为我更改文件?如果是怎么办?

我通读了文档并进行了谷歌搜索,但没有找到答案。

希望你能帮帮我。 :)

最佳答案

首先针对 slf4j API 编写代码。它主要是一堆接口(interface),如果您使用 slf4j 日志接口(interface),您不想用非 slf4j API“污染”您的代码。

然后您想使用 log4j-slf4j-impl-2.0.jar 打包/运行,它使 slf4j API 适应 log4j2 API。然后,您可以像从未使用过 slf4j 一样配置您的 log4j2 系统。

不要使用 log4j-to-slf4j-2.0.jar,因为它的目的是使编写日志到 log4j 记录器的代码将它们的日志记录放在 slf4j API 上,如果 slf4j 然后使用 slf4j 记录器实现它,您的日志记录事件将在 slf4j 和 log4j 之间无限循环传递。

---- 编辑帖子以解决问题,因为发表评论太多了----

slf4j 是一个包含三种主要组件的日志记录套件。

  1. 一组“输入适配器”,采用一个日志系统并将其通过管道传输到 slf4j API。
  2. 一个 slf4j API,不对日志记录的实现方式做出任何假设。
  3. 一组“输出适配器”,用于接收 slf4j API 调用并将它们塞入某个“其他”日志系统。

输入适配器的名称通常类似于“logsystem-to-slf4j-version.jar”,当您想迁移到 slf4j 但尚未重写代码以停止使用“旧”日志记录接口(interface)时,应该使用这些名称。

输出适配器的名称通常类似于“logsystem-slf4j-impl-version.jar”,并且在运行时只应向 slf4j 提供一个。

因为 slf4j 不知道它可能使用哪个日志适配器来实际处理日志消息,所以它不知道该日志系统的配置功能。<​​/p>

更糟糕的是,虽然日志记录通常有一个半相似的接口(interface)来提交日志消息,但它们有截然不同的接口(interface)来配置此类消息的处理。

简而言之,如果 slf4j 只适应日志消息的处理,而不是配置的处理(这在 System.out.println(...) 和 log4j 之间有很大的不同)

这意味着您最多可以在 slf4j API 层过滤您的日志消息;但是,不能保证它们会被呈现;因为底层的日志记录实现可能被配置为过滤更多的消息,或者可能被替换为“完全没有日志记录”的实现。

关于java - log4j2 在运行时更改配置 - 已经支持或需要自定义类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32338909/

相关文章:

java - 如何从 private int 返回 void?

java - Jsp默认日期格式

java - OOP 新手,管理类中的变量

java - log4j2 不将日志写入文件

java - 如何让 log4j2 使用 Spring Boot 和 Maven 创建不同的日志文件

java - log4j2 错误 StatusLogger 未找到 log4j2 配置文件且 ResourceBundle 错误

java - 为什么我的cmd程序总是自动暂停?

java - 我应该在单例中使用哪个android上下文?

java - Log4j2 - 找到配置,但无法正常工作

java - log4J2 存储和使用变量/查找值