我不熟悉日志,并希望在我的项目中使用slf4j和log4j2。 配置使用的是json文件。
我知道您可以在运行时使用ConfigurationFactory创建配置,或者使用一个文件,如果每次创建日志语句并且已经过了给定时间(或者没有),它都会被更改。
我的问题是关于json文件。我是否必须编写自己的类来使用json解析器更改该文件,或者slf4j / log4j2会以某种方式为我更改文件?如果是这样的话?
我正在阅读文档并用Google搜索,但没有找到答案。
我希望你能帮助我。 :)
答案 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是一个包含三种主要组件的日志记录套件。
输入适配器通常具有“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中获取条目),它足够简单,可以注入一些动力。