Разбор макетов 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".
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 содержит множество дополнительных новых функций - если вы хотите попробовать его, вы можете получить его здесь:
Я занимаюсь разработкой открытого просмотра журналов 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.