Разбор макетов Log4j из файлов журнала

Существует ли какой-либо инструмент с открытым исходным кодом, который может считывать все реализации Lay out Apache Log4j 1.2.x в нечто осмысленное (например, собственные объекты LogEvent Log4j)? До сих пор я не нашел приложение (включая бензопилу), которое может это сделать.

Я ищу что-то простое, которое преобразуется из текстового файла (обычный или XML) в объект Java, учитывая имя файла и параметры шаблона (например, шаблон формата в PatternLayout). Если у него есть понятный API, который облегчает интеграцию в приложение, даже лучше, но это не обязательно.

3 ответа

Решение

Вот код, который Chainsaw использует для преобразования шаблонов в нечто полезное, используя только API log4j. В случае с последним снимком разработчика Chainsaw, он используется для создания конфигурации Chainsaw непосредственно из log4j xml или записей файла appender файла свойств.

Используйте конвертеры и поля, заполненные PatternParser#parse, чтобы делать то, что вы хотите. Класс PatternParser включен в компаньон log4j "extras".

От http://svn.apache.org/repos/asf/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogFilePatternLayoutBuilder.java

public static String getLogFormatFromPatternLayout(String patternLayout) {
    String input = OptionConverter.convertSpecialChars(patternLayout);
    List converters = new ArrayList();
    List fields = new ArrayList();
    Map converterRegistry = null;

    PatternParser.parse(input, converters, fields, converterRegistry, PatternParser.getPatternLayoutRules());
    return getFormatFromConverters(converters);
}

Если вы действительно хотите что-то, что будет читать файл журнала, соответствующий определенному PatternLayout, и генерировать log4j LoggingEvents, см. LogFilePatternReceiver. Цепная пила использует метод getLogFormatFromPatternLayout для преобразования patternLayout в LogFormat, требуемый получателем.

Кстати, снимок разработчика Chainsaw содержит множество дополнительных новых функций - если вы хотите попробовать его, вы можете получить его здесь:

http://people.apache.org/~sdeboy

Я занимаюсь разработкой открытого просмотра журналов OtrosLogViewer. Вы можете использовать его в качестве библиотеки в вашем приложении. Посмотрите на этот пример.

//Define log4j properties
Properties p = new Properties();
p.put("type", "log4j");
p.put("pattern", "TIMESTAMP LEVEL [THREAD]  MESSAGE");
p.put("dateFormat", "yyyy-MM-dd HH:mm:ss,SSS");
Log4jPatternMultilineLogParser logParser = new Log4jPatternMultilineLogParser();    
LogImporterUsingParser importerUsingParser = new LogImporterUsingParser(logParser);
importerUsingParser.init(p);

//
ParsingContext context = new ParsingContext();

//Create log collector, it capture all parsed log events
ProxyLogDataCollector dataCollector = new ProxyLogDataCollector();

//Create input stream from file
InputStream in = new FileInputStream("log4j/log4j.txt");

//parse log file
importerUsingParser.importLogs(in, dataCollector, context);

Я натолкнулся на ваш проект, и это хорошая работа, однако в идеале я хотел бы что-то, что использует собственный шаблон преобразования Log4j (например, %-5p [%t]: %m%n) и файл, отформатированный с использованием этого шаблона, и считывает соответствующую информацию.

По сути, я ищу обратную сторону Layout.format(LoggingEvent) метод базового класса Layout Log4j. Этот метод создает строку, которая хранится в файле журнала, поэтому обратная операция сможет проанализировать этот файл и создать объекты LoggingEvent или что-то подобное (что-то вроде процедуры десериализации).

Спасибо!

РЕДАКТИРОВАТЬ: преобразование просто, просто делая

LogFilePatternLayoutBuilder.getLogFormatFromPatternLayout(conversionPattern);

через класс цепной пилы org.apache.log4j.chainsaw.LogFilePatternLayoutBuilder.

Другие вопросы по тегам