2011-08-09 114 views
4

有什么办法动态配置log4j记录器。我希望每个类的实例写入不同的文件(基于说一些实例之间唯一的属性)。我想配置除XML配置文件之外的所有内容,然后为每个实例设置文件。Log4J动态配置

有没有办法使用log4j来做到这一点?

+0

不知道我明白,但我想你想为每个班级创建一个Appender。您必须在每个类中使用类的名称实例化记录器。我希望你在你的项目中没有太多的课程,因为你最终会得到很多.log – Cygnusx1

+0

我只想为一个班级提供这个,它会有几个实例(可以说最多10个)。并且每个实例都有一个唯一的ID。我希望每个实例都写入,让我们说文件ID.log – user182945

回答

7

好的,从您的评论,这里我会尝试。

我想你会在你的应用程序开始时创建你的10个实例。无论如何。

在你的log4j.xml,定义10的appender与NAME = yourUniqueId(这唯一的ID将被排序的硬编码)

让这些附加目的地写yourUniqueid.log

<logger name="yourUniqueId" additivity="false"> 
    <level value="INFO" /> 
    <appender-ref ref="fileAppender" /> 
</logger> 

<appender name="fileAppender" class="org.apache.log4j.FileAppender"> 
<param name="File" value="/path/yourfile.log"/> 

    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%d{dd MM yyyy HH:mm:ss,SSS} %m%n"/> 
    </layout> 
</appender> 

然后在你的对象构造函数,使用对象唯一标识实例化正确的Logger。

类似的东西:

public MyClassContructor(){ 
    String uniqueId = getMyUniqueIdFromSomewhere(); 
    logger = Logger.getLogger(uniqueId); 
} 

我想你不想用的log4j.xml周围很乱,那么你将不得不使用log4j的API,并创建自己的appender根据您的独特ID

事情是这样的:

public class YourClass{ 
Logger logger = Logger.getLogger(YourClass.class); 
SimpleLayout layout = new SimpleLayout(); 
FileAppender appender = null; 

public YourClass() { 
    try { 
     appender = new FileAppender(layout, "/path/tolog/yourUniqueId.log", false); 
     logger.addAppender(appender); 

     logger.setLevel((Level) Level.DEBUG); 

    } 
    catch(IOException e) { 
     e.printStackTrace(); 
     logger.error("Printing ERROR Statements",e); 
    } 
} 

这样YourClass的每个实例将写入到不同的日志文件。你所要做的就是在调用构造函数时想办法让这个uniqueId成为可能。

希望它有帮助。