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

时间:2015-09-01 18:51:27

标签: java log4j2

我不熟悉日志,并希望在我的项目中使用slf4j和log4j2。 配置使用的是json文件。

我知道您可以在运行时使用ConfigurationFactory创建配置,或者使用一个文件,如果每次创建日志语句并且已经过了给定时间(或者没有),它都会被更改。

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

我正在阅读文档并用Google搜索,但没有找到答案。

我希望你能帮助我。 :)

2 个答案:

答案 0 :(得分:3)

首先针对slf4j API编写代码。它主要是一堆接口,如果您使用的是slf4j日志记录界面,则不希望使用非-slf4j API“污染”您的代码。

然后你想用log4j-slf4j-impl-2.0.jar打包/运行,它将slf4j API改编为log4j2 API。然后你可以配置log4j2系统,就像你从未使用过slf4j一样。

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

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

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

  1. 一组“输入适配器”,它将一个日志系统带入slf4j API。
  2. 一个slf4j API,它不会对如何实现日志记录做出任何假设。
  3. 一组“输出适配器”,它们接受slf4j API调用并将它们塞进一些“其他”日志系统。
  4. 输入适配器通常具有“logsystem-to-slf4j-version.jar”之类的名称,并且当您要迁移到slf4j但未重写代码以停止使用“旧”日志记录界面时,应使用它们。

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

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

    更糟糕的是,虽然日志记录通常具有用于提交日志消息的半类似接口,但它们具有完全不同的接口,用于配置此类消息的处理。

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

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

答案 1 :(得分:0)

在某些范围内,log4j2可能会对运行时值做出反应:使用属性(可以从System config或ThreadContext中获取条目),它足够简单,可以注入一些动力。