1

我正在开发一个以多线程方式处理多个文件的应用程序。分析是通过每个应该分析的文件启动一个线程来完成的,然后执行一系列步骤(在不同的类中),这些步骤都会产生某种形式的日志输出。

我想为我分析的每个文件都有专用的日志文件,这些文件只包含该文件的消息。我现在使用的代码是在程序仍然是单线程时编写的:

    PatternLayout layout = new PatternLayout("%d{dd MMM yyyy HH:mm:ss,SSS} [%t] %-5p %C{1} %x - %m%n");
    if(Config.CREATE_SEPERATE_LOG)
    {

        FileAppender appender;
        try {
            String path = (Config.LOGFILE_PATH!=null)?Config.LOGFILE_PATH:filename;
            appender = new FileAppender(layout,path);
            appender.setErrorHandler(new FallbackErrorHandler());
            appender.setName("Dedicated Appender");
            org.apache.log4j.Logger.getRootLogger().addAppender(appender);
        } catch (IOException e) {
            org.apache.log4j.Logger.getLogger(Config.class).warn("Failed to create a dedicated log "+filename, e);
        }
    }

这基本上会创建一个额外的附加程序,该附加程序会写入正在分析的文件的专用日志文件。虽然它可以在应用程序是单线程的时候工作,但它会变得一团糟。

如何更改我的设置,以便我可以让每个类参与某个文件的分析,并将其记录到该文件的特定日志文件中。

4

2 回答 2

1

我不会那样做,只需设置每个线程的名称(或前缀+名称)。
然后使用 log4jPatternLayout格式化每个日志行,以便输出线程名称。
%t是线程名称的格式符号。PatternLayout
文档 中的更多信息:

让转换模式为“%-5p [%t]: %m%n”,并假设 log4j 环境设置为使用 PatternLayout。

我的经验是,如果有必要的话,之后使用考虑线程名称的脚本将线程日志分离到单独的文件中会更有用。

于 2013-02-27T12:04:21.613 回答
0

不确定我是否正确理解了您的问题,我认为您需要为每个线程设置自定义记录器。每个线程都应该指向自己的日志文件。如果是这种情况,您将在线程类级别实现/初始化您的记录器实例。

public class MyThread  implements Runnable{
    private Logger logger =null;
public MyThread(){
    FileAppender appender =null;
    //custom initialisation code for specific appender/file
    logger =  // initialise 
}

@Override
public void run() {
    // TODO Auto-generated method stub

}

private void warn(String message){
    logger.warn(message);
}
private void info(String message){
    logger.info(message);
}

}

于 2013-02-27T11:51:23.667 回答