java扩展log4j记录器

8yoxcaq7  于 2021-07-09  发布在  Java
关注(0)|答案(3)|浏览(305)

我有一个应用程序,大量使用log4j的开箱即用。这使用了大量的第三方api。其中一些第三方api完全侵入了我们的记录器,清除了我们的附加程序,有时完全用不同的配置初始化,我们完全失去了日志功能!!
你知道为什么log4j这么容易被入侵吗?如果我们需要解决这个问题,我们必须重新编写log4j实现?

n3ipq98p

n3ipq98p1#

您可以尝试将记录器放入其他类装入器中吗?

yeotifhr

yeotifhr2#

log4j很容易被“黑客”攻击,因为它无法区分需要配置log4j的应用程序配置和一些不了解log4j的基础知识并在库中进行配置的库开发人员。
我想你有几个选择:
找出您的库何时损坏log4j配置,并确保随后覆盖该配置。
提交一个错误的行为库,在开放源码的情况下,你甚至可以自己提交一个补丁,附加选项使用该补丁,无论它是否包含在官方发行版。
让应用程序中加载log4j类的所有内容都使用一个特殊的类加载器,例如,通过使用osgi或构建您自己的loggerfactory,用一个特殊的类加载器加载log4j loggerfactory。库显然不会这样做,因此会得到自己的一组log4j类,而且它们对配置所做的任何操作都不会影响您。

rhfm7lfc

rhfm7lfc3#

我会选择在启动时配置log4j的解决方案,参考正确的位置。这应该是可行的:
使用@mark这里提到的方法:如何强制log4j从非src文件夹加载xml配置?
或者@jon7这里的一个:如何强制log4j从非src文件夹加载xml配置?
或者通过上提到的方法:配置log4j属性路径的最佳实践
我会给他们一个一个的尝试,看看这些是否能解决问题。
唯一的问题是,如果您有多个这样的配置文件,如果1.st方法是您的方式,您可能需要调用 resetConfiguration() 优先于 configure() ,正如javadoc所说:“既没有清除也没有重置现有的配置。”
你可能需要打电话给prio:

LogManager.resetConfiguration()

所以要么:

LogManager.resetConfiguration();
DOMConfigurator.configure("/path/to/log4j.xml");

或:

LogManager.resetConfiguration();
PropertyConfigurator.configure("/path/to/log4j.properties");

相关问题