2013-02-27 1 views
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); 
     } 
    } 

В основном это создает дополнительный Appender, который записывает на выделенный лог-файл для файла при анализе. Пока он работает, тогда, когда приложение было однопоточным, оно перепуталось.

Как я могу изменить свою настройку, чтобы каждый класс участвовал в анализе определенной последовательности файлов, регистрируя ее в конкретном файле журнала для этого файла.

+0

Вы пытались использовать какую-то переменную, генерируемую из файла, который вы читаете, чтобы инициировать использование потока FileWriter (при условии, что вы его используете)? –

+0

Не уверен, что понимаю, что вы имеете в виду. Будете ли вы работать с log4j и просто использовать простой старый java FileWriter? – er4z0r

ответ

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

}

+0

Возможно, я могу просто сделать Logger.getLogger («имя-файл-быть-проанализирован») в каждом классе, который участвует в анализе файла. Или это мешает мне увидеть, откуда пришли сообщения журнала? – er4z0r

1

Я бы не сделать это, просто установить имя каждого потока (или префикс + имя).
Затем используйте log4j PatternLayout для форматирования каждой строки журнала так, чтобы выводилось имя потока.
%t является символом формата имени потока.
Дополнительная информация в PatternLayout доку:

Пусть модель преобразования будет «% -5p [% т]:% м% п» и предположим, что среда log4j был настроен на использование PatternLayout.

Мой опыт в том, что более полезно разделить журнал потоков на отдельные файлы впоследствии, используя скрипт, который считает имя потока, если необходимо вообще.