我正在开发一个以多线程方式处理多个文件的应用程序。 分析是通过为每个应该分析的文件启动一个线程,然后完成一系列步骤(在不同的类中),这些步骤都产生某种形式的日志输出。
我想为我分析的每个文件都有专用的日志文件,它只包含该文件的消息。我现在使用的代码是在程序仍然是单线程时编写的:
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);
}
}
这基本上创建了一个额外的appender,可以写入正在分析的文件的专用日志文件。虽然当应用程序是单线程时它可以正常工作,但它会搞砸了。
如何更改我的设置,以便我可以让每个参与分析某个文件的类汇集其登录到该文件的特定日志文件。
答案 0 :(得分:1)
我不会这样做,只需设置每个线程的名称(或前缀+名称)
然后使用log4j PatternLayout
格式化每个日志行,以便输出线程名称
%t
是线程名称的格式符号
PatternLayout docu中的更多信息:
让转换模式为“%-5p [%t]:%m%n”并假设为 log4j环境设置为使用PatternLayout。
我的经验是,如果有必要,使用考虑线程名称的脚本将线程日志分隔成单独的文件会更有用。
答案 1 :(得分: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);
}
}