2011-10-11 79 views
0

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

本文中的实现在一定程度上对我有所帮助。 log4j log file names? 它们根据作业动态创建记录器对象。但我想为每个事件使用静态log4j文件并加载它并将其还原。

我也检查了这篇文章的回复。 multiple log4j instance configuration 但是,由于每个事件的事件名称和appender列表在我的应用程序中将是一个巨大的数字,为了更好的可维护性目的,我为每个事件选择一个log4j文件。

期待您的帮助。 谢谢, 拉迪卡

+0

log4j确实不是为多个配置文件设计的。我建议你使用一个配置文件和多个记录器,每个事件一个。这将最大限度地减少您的长期维护,因为您不必维护定制版本的log4j或使用不属于公共API的类和方法。 –

回答

0

我有每个事件定义的log4j文件。 传递事件名称并使用属性配置器在上下文中加载特定于事件的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; 
} 
+0

我怀疑这是否可以工作。 Log4J在类加载器级初始化,并且'PropertyConfigurator.configure'的连续调用可能不会完全摆脱先前在同一线程上完成的配置。 – Isaac