Мы написали систему для анализа сообщений журнала из большой сети.Система берет сообщения журнала из множества различных сетевых элементов и анализирует их с помощью выражений регулярных выражений.Например, пользователь мог написать два правила:
^cron/script\.sh.*
.*script\.sh [0-9]+$
В этом случае будут выбраны только журналы, которые соответствуют заданным шаблонам.Причина фильтрации заключается в том, что в журнале может быть очень много сообщений, до 1 ГБ в день.
Теперь основная часть моего вопроса.Поскольку существует множество сетевых элементов, и их несколько типов, и каждый из них имеет разные параметры пути ... Есть ли способ автоматически генерировать набор регулярных выражений, которые каким-то образом группируют журналы?Система может учиться на исторических данных, например, за последнюю неделю.Сгенерированное регулярное выражение не должно быть очень точным, для пользователя предполагается, что это будет подсказка для добавления такого нового правила в систему.
Я думал о неконтролируемом машинном обучении, чтобы разделить входные данные на группы, а затем в каждой группе найти подходящеерегулярное выражение.Есть ли другой способ, может быть, быстрее или лучше?И, наконец, что не менее важно, как найти регулярное выражение, соответствующее всем строкам в полученной группе?(Нетривиально, поэтому .*
не является ответом.)
Редактировать Подумав немного, я попытаюсь упростить проблему.Предположим, я уже сгруппировал логи.Я хотел бы найти (самое большее) три самые большие подстроки (хотя бы одну), общие для всех строк в наборе.Например:
Set of strings:
cron/script1.sh -abc 1243 all
cron/script2.sh 1
bin/script1.sh -asdf 15
Obtained groups:
/script
.sh
Теперь я могу создать простое регулярное выражение, связав эти группы с .*?
.В этом примере это будет .*?(/script).*?(\.sh ).*?
.Вроде бы более простое решение.