Как написать общий анализатор логов - PullRequest
2 голосов
/ 28 ноября 2011

Нам необходимо проанализировать несколько файлов журнала и запустить некоторую статистику по найденным записям журналов (таким как количество появлений определенных сообщений, пики появления и т. Д.). Проблема заключается в написании синтаксического анализатора журналов, который будет обрабатывать несколько форматов журналов и позволит мне добавить новый формат журналов без особых усилий.

Чтобы упростить ситуацию, я смотрю только журналы, которые в основном будут выглядеть примерно так:

[11/17/11 14:07:14:030 EST] MyXmlParser     E   Premature end of file

, поэтому каждая запись в журнале будет содержать timestamp, originator (из сообщения журнала), level и log message. Одна важная деталь заключается в том, что сообщение может иметь более одной строки (например, трассировка стека). Другой экземпляр записи журнала может быть:

17-11-2011 14:07:14 ERROR    MyXmlParser   - Premature end of file

Я ищу хороший способ указать формат журнала, а также наиболее подходящую технологию для реализации парсера для него. Я думаю о регулярных выражениях, но думаю, что будет сложно справиться с такими ситуациями, как многострочное сообщение (например, stacktrace).

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

В идеале я бы мог указать что-то вроде этого в формате журнала:

[%TIMESTAMP] %ORIGIN %LEVEL %MESSAGE

или

%TIMESTAMP %LEVEL %ORIGIN - %MESSAGE

Очевидно, мне нужно было бы назначить правильный преобразователь для каждого поля, чтобы оно обрабатывало его правильно (например, отметку времени).

Кто-нибудь может дать мне несколько хороших идей о том, как реализовать это надежным и модульным способом (я использую Java)?

Ответы [ 7 ]

3 голосов
/ 28 ноября 2011

AWStats - это отличный анализатор логов с открытым исходным кодом, и вы можете делать все, что захотите, с созданной в результате базой данных.

2 голосов
/ 09 декабря 2011

Например, вы можете использовать сканер и некоторые регулярные выражения.Вот фрагмент того, что я сделал для разбора некоторых сложных журналов:

private static final Pattern LINE_PATTERN = Pattern.compile(
  "(\\S+:)?(\\S+? \\S+?) \\S+? DEBUG \\S+? - DEMANDE_ID=(\\d+?) - listener (\\S+?) : (\\S+?)");

public static EventLog parse(String line) throws ParseException {
    String demandId;
    String listenerClass;
    long startTime;
    long endTime;

    SimpleDateFormat sdf = new SimpleDateFormat(DATE_PATTERN);
    Matcher matcher = LINE_PATTERN.matcher(line);
    if (matcher.matches()) {
        int offset = matcher.groupCount()-4; // 4 interesting groups, the first is optional
        demandeId = matcher.group(2+offset);
        listenerClass = matcher.group(3+offset);
        long time = sdf.parse(matcher.group(1+offset)).getTime();
        if ("starting".equals(matcher.group(4+offset))) {
            startTime = time;
            endTime = -1;
        } else {
            startTime = -1;
            endTime = time;
        }
        return new EventLog(demandeId, listenerClass, startTime, endTime);
    }
    return null;
}

Итак, с регулярными выражениями и группами это работает довольно хорошо.

1 голос
/ 11 октября 2013

Я закончил тем, что не написал свой и использовал logstash .

1 голос
/ 24 декабря 2011

LogFilePatternReceiver Log4j делает именно это ...

Эта запись в журнале: 17-11-2011 14:07:14 ОШИБКА MyXmlParser - преждевременный конец файла

Может быть проанализирован с использованием следующегоlogformat (при условии, что источник совпадает с 'logger'), с отметкой времени, использующей Java SimpleDateFormat dd-MM-гггг кк: мм: сс

TIMESTAMP LEVEL LOGGER - MESSAGE

Часовой пояс иуровень в другой форме немного сложнее ... есть возможность переназначить строки на уровни (от E до ERROR), но я не знаю, что часовой пояс будет вполне работать.

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

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

1 голос
/ 13 декабря 2011

Если у вас есть такая возможность (и у вас должна быть хорошая платформа для ведения журналов), я бы порекомендовал вам дублировать журналы в формате для анализа.Например, с log4j используйте XMLLayout или что-то вроде этого.Разобрать будет намного проще, потому что тогда вы будете знать точный формат журналов.

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

Также, если XMLLayout может удовлетворить ваши потребности, взгляните на бензопила Apache

0 голосов
/ 12 декабря 2011

Может быть, вы могли бы написать Log4j CustomAppender? Например, как описано здесь: http://mytechattempts.wordpress.com/2011/05/10/log4j-custom-memory-appender/

Ваш пользовательский аппендир может использовать базу данных или простые объекты Java, запрошенные JMX, для получения вашей статистики. Все зависит только от того, сколько данных необходимо сохранить.

0 голосов
/ 09 декабря 2011

На работе мы развернули наш собственный анализатор журналов (на Java), чтобы мы могли отфильтровать известные трассировки стека из производственных журналов, чтобы выявить новые потенциальные производственные проблемы. Он использует регулярные выражения и тесно связан с нашим форматом log4j.

У нас также есть скрипт на python, который запускает журналы и отчеты о производственных транзакциях в реальном времени (для SiteScope - нашего инструмента мониторинга инфраструктуры), когда число конкретных ошибок слишком велико.

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

...