【问题标题】:Separate Logfiles in Multithreaded Application在多线程应用程序中分离日志文件
【发布时间】:2013-02-13 02:43:59
【问题描述】:

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

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

    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);
        }
    }

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

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

【问题讨论】:

  • 您是否尝试过使用从您正在阅读的文件中生成的某种变量来启动 FileWriter(假设您正在使用它)流目标?
  • 不确定我明白你的意思。你会解决 log4j 并只使用普通的旧 java FileWriter 吗?

标签: java multithreading log4j


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    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);
    }
    

    }

    【讨论】:

    • 也许我可以在涉及文件分析的每个类中执行 Logger.getLogger("name-of-file-to-be-analyzed") 。或者这会阻止我查看日志消息的来源?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多