LOG4J加载多个LOG4J文件

LOG4J加载多个LOG4J文件,log4j,Log4j,对于每个事件,我的应用程序中有五个不同的log4j属性文件。我不希望应用程序使用DOM或PropertyConfiguration加载文件。但我想将所有这些属性加载到一个映射中,以事件名称作为键,以属性或记录器作为值。因此,当我使用事件名称调用getLogger方法时,将返回基于事件名称的相应记录器对象 这篇文章的实施在一定程度上帮助了我。 他们根据作业动态创建记录器对象。但是我想为每个事件使用静态log4j文件,然后加载并返回它 我还检查了这篇帖子中的回复。 但是由于每个事件的事件名称和附加器

对于每个事件,我的应用程序中有五个不同的log4j属性文件。我不希望应用程序使用DOM或PropertyConfiguration加载文件。但我想将所有这些属性加载到一个映射中,以事件名称作为键,以属性或记录器作为值。因此,当我使用事件名称调用getLogger方法时,将返回基于事件名称的相应记录器对象

这篇文章的实施在一定程度上帮助了我。 他们根据作业动态创建记录器对象。但是我想为每个事件使用静态log4j文件,然后加载并返回它

我还检查了这篇帖子中的回复。 但是由于每个事件的事件名称和附加器列表在我的应用程序中都是一个巨大的数字,为了更好的可维护性,我为每个事件选择一个log4j文件

期待你的帮助。 谢谢
Radhika

我为定义的每个事件都有log4j文件。 传递事件名称并使用property configurator在上下文中加载特定于事件的log4j属性文件。然后getLogger方法将拥有该记录器

private static synchronized Logger getEventLogger(String eventName) {
Logger logger = null;
    try {

        logger = m_loggers.get(eventName);
        if (logger == null) {
            PropertyConfigurator.configure(eventName + ".properties");
            logger = Logger.getLogger(eventName);
            m_loggers.put(eventName, logger);

        }
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return logger;
}

我怀疑这是否可行。Log4J是在类加载器级别初始化的,连续调用PropertyConfigurator.configure可能无法完全摆脱以前在同一线程上完成的配置。Log4J实际上不是为多个配置文件设计的。我建议您使用带有多个记录器的单个配置文件,每个事件一个记录器。这将最大限度地减少长期维护,因为您不必维护log4j的自定义版本,也不必使用不属于公共API的类和方法。