2016-09-23 5 views
0

У меня есть код в grok, который захватывает сообщения, и если они соответствуют заданным критериям, они получают тег.Regexp in Grok иногда иногда получает значение

Моя проблема в том, что иногда этот фильтр работает во время тестирования, а иногда нет. Регулярное выражение в вопросе заключается в следующем:

^(?!(?:\d\d\d\d-\d\d-\d\d.\d\d:\d\d:\d\d)).*$ 

Эта строка проверяет, является ли данное сообщение не начинается с заданного формата метки времени. Другими словами: если данное сообщение не начинается с этого штампа времени, тогда он получает тег.

Вы можете проверить это самостоятельно с этим интерактивным приложением: http://grokconstructor.appspot.com/do/match#result

Для этих значений испытаний, regepx фиксирует все сообщения, которые соответствуют критериям, таким образом, две строки с «тестом», выделены зеленым цветом:

test 
2016-09-23 18:26:49,714 
2016-09-23 18:26:40,244 
test 

Однако он захватывает первую дату, когда вход что-то вроде этого:

2016-09-23 18:26:49,714 
2016-09-23 18:26:40,244 
test 

Я хотел бы понять WHA t является причиной этого поведения и как я могу его предотвратить?

+0

'.' похоже, что это единственное пространство @ WiktorStribiżew – revo

+0

[Это не воспроизводится] (http://i.stack.imgur.com/lpVlJ.png) – revo

+0

@revo OP говорит, что это работает иногда. Для второго набора данных я получаю: http://i.stack.imgur.com/AphzA.png – Laurel

ответ

1

Это, кажется, что в начале некоторых сообщений там был (метка порядка байтов) BOM, который я мог бы захватить со следующим регулярным выражением в Grok:

^(?:\xEF\xBB\xBF).*& 

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

2

Почему бы не просто подобрать метку времени разумным способом? Вы можете указать несколько форматов даты, как это:

date { 
    match => [ "log_timestamp", "dd/MMM/YYYY HH:mm:ss", "dd/MMM/YYYY HH:mm:ss.SSS" ] 
    timezone => "Etc/UTC" 
    locale => "en-US" 
} 

Это соответствует 23/Сентябрь/2016 15:15:00 или 23/Сентябрь/2016 15: 15: 00,123 (мы сделали изменения, когда мы были версионности)

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

1

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

Чтобы воспроизвести, вставьте строки, в которых говорится: «Некоторые строки журнала вы хотите, чтобы соответствовать ":

2016-09-23 18:26:49,714 
2016-09-23 18:26:40,244 
test 

в том месте, где он говорит:„модель, которая должна соответствовать всем строкам в логах“, поставить регулярное выражение:

^(?!(?:\d\d\d\d-\d\d-\d\d.\d\d:\d\d:\d\d)).*$ 

не связывайтесь с флажками (I «Не знаю, что они делают, но все они должны быть проверены).

Hit Go! и вы получите этот результат, как и Revo упоминается в комментариях:

works

Чтобы получить другой результат, установить на вещи точно так же, как (если вы только что передали регулярное выражение должно еще быть установлен), но добавьте это же регулярное выражение в область, в которой говорится: «Если вы хотите использовать многострочный фильтр logstash, пожалуйста, укажите использованный шаблон».

Hit Go!и вы получите этот результат:

fails

Простой способ избежать этого не использовать Logstash's multiline filter. (По крайней мере, это то, что я бы предположить.)

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