Log4J动态配置

时间:2011-08-09 15:02:07

标签: java logging dynamic log4j

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

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

1 个答案:

答案 0 :(得分:7)

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

我想你会在你的应用程序开始时创建你的10个实例。反正。

在你的log4j.xml中,使用name = yourUniqueId定义10 appender(这个唯一的id将是硬编码的)

让这些appender写入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>

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

类似的东西:

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

我认为你不想乱用log4j.xml,那么你必须使用log4j API并根据你的唯一id创建你自己的appender

这样的事情:

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的方法。

希望有所帮助。