Инструмент или язык для подсчета случаев возникновения ошибок в файле журнала - PullRequest
0 голосов
/ 23 января 2009

Я пытаюсь определить наилучший способ анализа файла журнала и подсчета всех ошибок в нем по типу. В настоящее время я открываю журнал в текстовом редакторе, удаляю дату и идентификатор потока, затем сортирую файл. Это объединяет все ошибки по типу, который я затем могу посчитать (используя функцию подсчета в редакторе, а не вручную). Я ищу способ сделать это автоматически и, возможно, использовать это как возможность выучить новый язык (я знаю минимальные Perl и Ruby, которые, кажется, могут работать для этой задачи). Файл журнала выглядит следующим образом (элементы в угловых скобках являются переменными для каждой строки, а каналы - это действительные символы в журнале):

<Datetime stamp> | <Thread ID> | ERROR | Foo.Bar: Backend error
<Datetime stamp> | <Thread ID> | ERROR | Foo.Bar: InvalidUserException
<Datetime stamp> | <Thread ID> | ERROR | Foo.Com: Timeout error
<Datetime stamp> | <Thread ID> | ALWAYS | Foo.Bar: Login Transaction [584] executed in [400] milliseconds
<Datetime stamp> | <Thread ID> | ALWAYS | Foo.Bar: Login Transaction [585] executed in [500] milliseconds
<Datetime stamp> | <Thread ID> | ALWAYS | Foo.Bar: Login Transaction [586] executed in [500] milliseconds
<Datetime stamp> | <Thread ID> | ALWAYS | Biz.Dee: Logout Transaction [958] executed in [630] milliseconds
<Datetime stamp> | <Thread ID> | ERROR | Foo.Bar: Backend error

Я не хочу использовать серию команд grep, потому что мне нужно будет знать, что искать - если в журнале появится новая ошибка, без добавления новой команды она не будет засчитана.

Вывод, который я ищу, выглядит примерно так:

Foo.Bar: Backend error: 2 occurrences
Foo.Com: Timeout error: 1 occurrence

В идеале было бы неплохо также рассчитать среднее время транзакции:

Foo.Bar: Login Transaction: 3 occurrences with an average of 466 milliseconds
Biz.Dee: Logout Transaction: 1 occurrence with an average of 630 milliseconds

Я видел некоторые инструменты, упомянутые в других потоках SO ( Анализатор журнала SMTP , Анализатор журнала Microsoft , Zabbix и Splunk ), но я также хотел бы узнать что-то новое без ненужного дублирования существующего инструмента. Будет ли Perl или Ruby хорошим выбором для этой задачи? Я не ищу рабочий сценарий, но несколько указателей в правильном направлении или хороший инструмент для использования.

Ответы [ 9 ]

3 голосов
/ 23 января 2009

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

Вероятно, вы могли бы сделать то же самое с C # и их RegEx, если вы более знакомы с этим, но Perl был создан для таких вещей.

2 голосов
/ 23 января 2009

Вот возможная отправная точка для Perl:

#! /usr/bin/perl
use strict;
use warnings;

my %unique_messages;
while (<>)
{
  my ($timestamp, $thread, $type, $message) = $_ =~
    /^
      ([^|]+) \|
      ([^|]+) \|
      ([^|]+) \|
      (.+)
     $/x;

  $unique_messages{$message}++ if $type =~ /ERROR/;
}

print $unique_messages{$_}, ' -> ', $_, "\n" for keys %unique_messages;
exit 0;

Производит:

% ec.pl < err.log
1 ->  Foo.Com: Timeout error
1 ->  Foo.Bar: InvalidUserException
2 ->  Foo.Bar: Backend error
1 голос
/ 23 января 2009

Вот способ командной строки unix (или Cygwin ) сделать это с:

  • Команда AWK (для анализа 4-го поля, где ваши поля разделены трубками "|")
  • A SED команда для замены указанной выше транзакции # ([584]) для упрощения группировки (с [tid])
  • сортировка и uniq для поиска и подсчета повторяющихся строк:

Вот командная строка:

awk "FS=\"^|\";{print $4}" logfile.txt | sed -e "s/\[[0-9]*\]/[tid]/g" \
| sort | uniq -c | sort

Вот вывод:

   1  Biz.Dee: Logout Transaction [id] executed in [id] milliseconds
   1  Foo.Bar: Backend error
   1  Foo.Bar: InvalidUserException
   1  Foo.Com: Timeout error
   3  Foo.Bar: Login Transaction [id] executed in [id] milliseconds
1 голос
/ 23 января 2009

Если вы знаете / любите .NET, идеальным кандидатом для этого будет среда Push LINQ , которую мы с Марком Гравеллом разработали. По сути, вы заранее настраиваете все необходимое агрегирование (группирование, суммирование и т. Д.) И «проталкиваете» через него файл журнала, а затем запрашиваете результаты в конце. Это позволило бы вам делать все с почти постоянным потреблением памяти и одним проходом по данным.

Дайте мне знать, если вы хотите получить более подробную информацию.

1 голос
/ 23 января 2009

Я бы использовал RegEx и посчитал количество вхождений. Вы можете сделать это на множестве языков, даже простой сценарий оболочки сделает это, например,

grep -E ".*ERROR.*\n" logfile | wc -l
0 голосов
/ 15 февраля 2009

В vim вы можете сделать :%s/pattern//n, где pattern - строка поиска.

0 голосов
/ 15 февраля 2009

синтаксический анализатор журнала Microsoft, если вы в порядке с SQL. И с помощью Windows. Бесплатно и довольно удобно. Легко заключить в HTA, затем вы можете использовать VBS или (?) JS для интерактивного построения строк запроса. Поверьте, это сделает промежуточные итоги для вас. Конечно, сортировки и группы.

0 голосов
/ 23 января 2009

Вы можете использовать такую ​​программу, как monarch, чтобы придать структуру плоским данным. Я использовал его для извлечения текстовых файлов и создания из них таблиц, которые я могу использовать в базе данных.

0 голосов
/ 23 января 2009

Еще одна возможность использования awk:

grep ERROR filename.log | awk -F'|' '{ print $4 }' | awk -FS=':' '{count[$1]++}END{for(j in count) print j,": "count[j]" occurence(s)"}'
...