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

log4j2 changing configuration during runtime - already supported or custom class needed?

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

我知道您可以在运行时使用 ConfigurationFactory 创建一个配置,或者使用一个文件来检查它是否在每次创建日志语句并且给定时间(或 none)通过。

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

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

希望你能帮帮我。 :)

首先针对 slf4j API 编写代码。它主要是一堆接口,如果您使用的是 slf4j 日志接口,您不想 "pollute" 使用非 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 之间无限循环传递。

---- 编辑 post 来解决问题,因为发表评论太多了 ----

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

  1. 一组 "input adapters",采用一个日志系统并将其通过管道传输到 slf4j API。
  2. 一个 slf4j API 不对日志记录的实现方式做出任何假设。
  3. 一组 "output adapters" 接受 slf4j API 调用并将它们塞进一些 "other" 日志系统。

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

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

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

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

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

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

在一定范围内,可以让 log4j2 对运行时值做出反应:使用属性(可以从系统配置或 ThreadContext 获取条目),注入一些活力就足够简单了。