Log4J动态配置

use*_*945 4 java logging log4j dynamic

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

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

Cyg*_*sx1 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>
Run Code Online (Sandbox Code Playgroud)

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

像这样的东西:

public MyClassContructor(){
     String uniqueId = getMyUniqueIdFromSomewhere();
     logger = Logger.getLogger(uniqueId);
} 
Run Code Online (Sandbox Code Playgroud)

我想你不想乱用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,YourClass的每个实例都会写入不同的日志文件.所有你需要做的就是想一下在调用构造函数时获取这个uniqueId的方法.

希望它有所帮助.