отфильтровывая похожие строки из журнала - PullRequest
0 голосов
/ 12 декабря 2018

Я ищу очень упрощенный алгоритм для фильтрации часто повторяющихся строк из очень большого файла журнала.Структура записей в журнале в основном неизвестна.(Сначала я хотел бы обработать вывод journalctl systemd, но позже я бы хотел использовать его и для других журналов ...) Я вырезал первую часть записей (содержащую метку времени и имя хоста), а затем обработалостальная часть линии.Он может содержать много переменных полей, с идентификатором процесса, другой отметкой времени, порядковым номером и т. Д., С постоянными строками.Например, у меня есть много строк, подобных этим:

anacron[29090]: Updated timestamp for job `cron.daily' to 2018-11-28
anacron[3330]: Updated timestamp for job `cron.daily' to 2018-11-29
anacron[6502]: Updated timestamp for job `cron.daily' to 2018-11-30
anacron[24515]: Updated timestamp for job `cron.daily' to 2018-12-01
anacron[12797]: Updated timestamp for job `cron.daily' to 2018-12-02

или эти:

whoopsie[1827]: [12:29:38] Cannot reach: https://daisy.ubuntu.com
whoopsie[1827]: [12:59:22] Cannot reach: https://daisy.ubuntu.com
whoopsie[1827]: [12:59:23] Cannot reach: https://daisy.ubuntu.com
whoopsie[1827]: [21:22:53] Cannot reach: https://daisy.ubuntu.com
whoopsie[2147]: [17:48:49] Cannot reach: https://daisy.ubuntu.com
whoopsie[2147]: [17:48:49] Cannot reach: https://daisy.ubuntu.com
whoopsie[2147]: [17:48:49] Cannot reach: https://daisy.ubuntu.com

(«много» больше, чем значение, которое будет определено позже, исходя из размерафайл журнала)

Это две группы «похожих» строк.Они фильтруются, если я знаю, где находятся переменные части строк (идентификатор процесса и поле даты в первом примере, pid и время во втором примере), но я не знаю всех возможных вариантов.Источник для меня - черный ящик.Единственная надежная вещь состоит в том, что количество «фиксированных» полей больше, чем переменных.

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

1 Ответ

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

Утверждение неоднозначное: насколько похоже подобное?Каков вход и ожидаемый результат?Если вы не можете ответить на эти вопросы (в идеале, отредактировав вопрос), любой ответ будет содержать много догадок.

Давайте рассмотрим низко висящий фрукт:

  1. N (>1) последовательных строк , которые отличаются только небольшим количеством времени, можно безопасно сжать в 1 строку с x N множителем в конце.
  2. Источникииз линий, вероятно, очень ограничен (вероятно, менее 100).Количество различных сообщений на источник также ограничено: демон обычно сообщает, скажем, о запуске, завершении операций и нескольких очень редких различных сообщениях.Вы хотите идентифицировать главные источники сообщений и верхние сообщений на источник до , чтобы переключать их по требованию.
  3. Фильтрация большого количества сообщений журнала несколько похожа на фильтрацию дампа трафика в сети.Как сетевые парни понимают это? Делайте то, что делает Wireshark & ​​co : чтобы понять большие объемы разнородных данных, разрешить интерактивные запросы и фильтрацию.Одношаговый инструмент командной строки потеряет общую картину.

Теперь перейдем к актуальным алгоритмам:

  1. Может быть реализовано за один проход:

     start with an empty line
     read a line
     if different from previous line,
       output previous line; and if found multiple times, its multiplicity
       store it, with multiplicity 1
     otherwise
       increase multiplicity of saved line
    
  2. требует чего-то более сложного, но может быть аппроксимировано в O (N log N), например, с помощью:

     sort all lines together (ignoring the time fields)
     calculate distance between consecutive lines
     find a threshold that gives you 90% of all lines grouped into, say, 10 groups
        (you will want to fiddle with the % and group-count to find settings that
         work for your application).
     allow filtering out chosen categories
    
  3. требует полноценного приложения для анализа журналов, из которых существует множество.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...