log4j 2.16.0 中 log4j 1.2.17 中 LogManager.setRepositorySelector() 的替代方案

Posted

技术标签:

【中文标题】log4j 2.16.0 中 log4j 1.2.17 中 LogManager.setRepositorySelector() 的替代方案【英文标题】:Alternative for LogManager.setRepositorySelector() from log4j 1.2.17 in log4j 2.16.0 【发布时间】:2022-01-19 23:45:10 【问题描述】:

我正在将应用程序从 log4j 1.2.17 转换为 2.16.0,看起来在 log4j2 中 LogManager 中不再有 setRepositorySelector() 方法。我无法按原样使用 log 1.x 桥接器,因为该项目不符合迁移文档中列出的要求。

以下功能是否有任何 log4j2 解决方法?原代码不是我写的,我只是更新一下。

        //The "guard" is a simple object that protects against re-setting of the
        //LoggerFactory by anyone but the one who set it first with a particular
        //"guard".  Basically, this would allow a container to set the LoggerFactory,
        //but disallow applications running in the container from changing it.  If
        //the container holds a handle on the "guard" object, then it alone can
        //change the LoggerFactory.  If no one holds a handle on the "guard" object,
        //then no one can change the LoggerFactory once it is set the first time.       
        Object guard = new Object();
        try 
            LogManager.setRepositorySelector(new ContextJNDISelector(), guard);
        catch(Exception e)
            System.out.println("Exception, " + CLASS_NAME + ".contextInitialized(): " + e.getMessage());
            //e.printStackTrace();
        

【问题讨论】:

【参考方案1】:

由于 Log4j 2.x API 可以有多个实现,RepositorySelector 已重命名为 ContextSelector 并移至 Log4jContextFactory。因此你需要使用:

LogManager.setFactory(new Log4jContextFactory(new JndiContextSelector()));

备注:上述代码必须在任何(直接或间接)调用LogManager.getLogger 或类似方法之前调用。

【讨论】:

以上是关于log4j 2.16.0 中 log4j 1.2.17 中 LogManager.setRepositorySelector() 的替代方案的主要内容,如果未能解决你的问题,请参考以下文章

Log4j发布2.17.0,解决2.16.0存在的DOS攻击风险

玩大了!Log4j 2.x 再爆雷。。。

我们如何将更高版本的 Log4j 设置为 grails 应用程序

Apache Log4j2团队宣布Log4j 2.16.0发布,强烈建议升级

玩大了,Log4j 2.x 再爆雷。。。

玩大了,Log4j 2.x 再爆雷。。。