2012-04-13 3 views
2

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

Я ищу способ установить «процентную разницу» и игнорировать любые строки, которые говорят, что на 90% уже сообщенное сообщение об ошибке. Другая мысль заключается в том, что всегда игнорировать различия в отметках времени.

Процедура:

  1. пользователя вводит поисковый термин (ы) (либо регулярное выражение или простой текст) допуск
  2. входов Пользовательских различий
    [Старт]
  3. Grep находит строку, соответствующий поисковый запрос и посылает в новый текстовый файл
  4. Grep продолжает поиск журналов и находит то же сообщение об ошибке. Разница может быть отметкой времени, датой и, возможно, именем пользователя. Поскольку строка не менее 90% похожа на то, что уже находится в новом файле, grep не копирует ее и продолжает поиск
  5. Grep находит новую строку, которая соответствует поисковому запросу. Линия меньше 90%, поэтому она копируется в новый файл и становится другой линией, с которой grep сопоставляет будущие результаты.

* Редактировать: Извините, если я не был ясен в первый раз. Я с удовольствием объясню больше, если потребуется.

Спасибо.

  • лог.1 - ДД: ММ: ГГГГ ЧЧ: ММ: СС: MS Ошибка - USER не удалось войти в IPaddress
  • лог.1 - ДД: ММ: YYYY HH: ММ: СС: МС Оборудование сбой при загрузке
  • Log.2 - ДД: ММ: ГГГГ ЧЧ: ММ: СС: MS ресурсы протянуты тонкие, предупреждение - проверить RAM
+1

Итак, в чем вопрос? – zigdon

+0

Функция Perl или комбинация функций позволят мне определить процентное различие между строками текста. Grep находит сообщение об ошибке и копирует его в новый файл. Grep находит такое же сообщение об ошибке, но отличается от метки времени. Поскольку сообщение об ошибке не менее чем на 90% аналогично, игнорирует его и перемещается. Повторите, повторите, повторите. –

+0

@ r.misc: вы должны отредактировать свой вопрос, чтобы добавить дополнительную информацию и объяснить, что именно вы хотите. – Borodin

ответ

3

Я не знаю ни полный не посещающих в то время как Text::Levenshtein и аналогичные алгоритмы могут помочь вам придумать, как аналогичная одна общая строка относится к другой.

+0

Это выглядит очень похоже на то, что я ищу, я только боюсь, что он недостаточно устойчив. И было бы неплохо, если бы мне не пришлось скачивать дополнительные моды. Как я могу реализовать что-то подобное с пакетами по умолчанию? –

+0

Вы можете написать алгоритм levenshtein самостоятельно. Это не очень сложно. См. Статью по википедии: http://en.wikipedia.org/wiki/Levenshtein_distance – bot403

+0

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

2

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

my %msg_cache =(); 
sub log_filter { 
    my $msg = shift; 
    if (defined($msg_cache{$msg}) && $msg_cache{$msg} < time-60) { 
     # we've logged this message in the last minute - skip 
     return; 
    } 
    $msg_cache{$msg} = time; 
    return 1; 
} 
+0

Это тоже сообразительная идея. Что-то еще, что я рассматривал, было бы захватить 3-5 строк до и после каждого уникального сообщения об ошибке. Таким образом, мы могли видеть, что могло привести к сообщению. –

Смежные вопросы