Как изменить уровень серьезности (INFO, ERROR, WARNING и т.д.) Сообщения журнала в Fluentd на основе некоторого ключевого слова в полезной нагрузке журнала?

100
7

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

У меня есть контейнер, работающий в кубернетах в GKE. В /var/log/containers/my_container.log у меня есть что-то вроде этого (среди некоторых других журналов с разными форматами):

{"log":"17-Oct-2017;04:36:29.744 : [main] [server:] [id:] [yt:] ERROR no.myproject.service.Server - call failed for some reason\n","stream":"stdout","time":"2017-10-17T04:36:29.750702216Z"}

Этот журнал появляется на Stackdriver (выход Fluentd в GKE) в качестве журнала INFO и как:

23:02:32.000 17-Oct-2017;04:36:29.744 : [main] [server:] [id:] [yt:] ERROR no.myproject.service.Server - call failed for some reason

Так

23:02:32.000 

(что является обычным поведением Stackdriver). Я буду ссылаться на этот формат в формате 2.

Поскольку это сообщение журнала фактически является сообщением журнала ERROR (на основе его содержимого полезной нагрузки), я хочу, чтобы оно отображалось как ОШИБКА в Stackdriver (Fluentd).

Я стараюсь:

<filter reform.**>
type parser
format /^(?<time>\d{2} [^\s]*) : (?<message2>[^ \]]*)\] (?<message3>[^ \]]*)\] (?<message4>[^ \]]*)\] (?<message5>[^ \]]*)\] (?<severity>\w)\s+(?<log2222>.*)/
reserve_data true
suppress_parse_error_log false
key_name log
</filter>

в надежде получить серьезность сообщения с ошибкой в ERROR, а также получить содержимое полей [..] в журнале как некоторый новый ключ/значения (в данном случае message2: main и т.д.).

Но после добавления этого фильтра в мой файл конфигурации журналы вывода все еще по-прежнему, и я не вижу никаких изменений.

Что мне не хватает? Когда я пишу свой шаблон Regex, я не уверен, действительно ли я должен рассмотреть поле журнала в файле журнала в кубернетах или тот, который я назвал форматом 2 (со временем, добавленным к нему - на Stackdriver),

Я был бы очень признателен за любые советы, это было бы большой помощью.

спросил(а) 2021-01-26T15:28:38+03:00 5 месяцев, 4 недели назад
1
Решение
118

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

На самом деле \d{2} будет соответствовать только двум цифрам.

Чтобы сопоставить все префикс времени, вы можете вместо этого использовать (?:\d{2}:){2}\d{2}\.\d{3}.

Еще один момент в отношении серьезности: вы написали (?<severity>\w) который фиксирует только один символ слова. Вы можете использовать (?<severity>\w+) для соответствия нескольким символам.

Тогда ваше регулярное выражение станет:

^(?<time>(?:\d{2}:){2}\d{2}\.\d{3} [^\s]*) : (?<message2>[^ \]]*)\] (?<message3>[^ \]]*)\] (?<message4>[^ \]]*)\] (?<message5>[^ \]]*)\] (?<severity>\w+)\s+(?<log2222>.*)

Эта демонстрация обувает матч.

ответил(а) 2021-01-26T15:28:38+03:00 5 месяцев, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема