Формат Fluentd Openstack Log Regex

Я пытаюсь проанализировать журналы всех служб OpenStack и отправить их на S3 в формате JSON.

Я могу анализировать журналы в этом многострочном формате.

<source>
  @type tail
  path /var/log/nova/nova-api.log
  tag nova
  format multiline
  format_firstline /\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}(\.\d{3,6})? [^ ]* [^ ]* [^ ]*/
  format1 /(?<DateTime>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})(\.\d{3,6})? (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) (\[(?<context>[^\]]*)\])? (?<message>.*)/
  time_format %F %T.%L
</source>

который анализирует журналы этого типа

2018-09-05 12:34:01.451 3212169 INFO nova.osapi_compute.wsgi.server [req-0f15c395-5962-4a14-ba7a-730f86d6eb7e f1ab53782de846798920050941f3bcff f5d0c8e495cd4793814f8b979693ac17 - default default] 192.168.1.1 "GET /v2.1/os-services HTTP/1.1" status: 200 len: 1435 time: 0.0372221

и этот тип

2018-09-05 12:34:33.631 2813186 INFO nova.api.openstack.placement.requestlog [req-d4573763-4521-419f-a4ba-c489a7e17ea9 fba548d81cd6480b90940a89e00f4133 6ba1bbedb40c411e9482128150886ba6 - default default] 192.168.1.1 "DELETE /allocations/196db945-0089-40ae-8108-a950fb453296" status: 204 len: 0 microversion: 1.0
AH01626: authorization result of Require all granted: granted
AH01626: authorization result of <RequireAny>: granted
AH01626: authorization result of Require all granted: granted
AH01626: authorization result of <RequireAny>: granted
2018-09-05 12:34:37.737 2813187 INFO nova.api.openstack.placement.requestlog [req-08b8b3e4-6981-4cd4-b90b-c922b7002b28 fba548d81cd6480b90940a89e00f4133 6ba1bbedb40c411e9482128150886ba6 - default default] 192.168.1.1 "GET /allocation_candidates?limit=1000&resources=CUSTOM_Z270_A%3A1" status: 200 len: 473 microversion: 1.17

в это

Свободная демонстрация

Я пытаюсь получить ip, путь request_type и статус, используя это

(?<DateTime>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})(\.\d{3,6})? (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) (\[(?<context>[^\]]*)\]) (?<ip>[[\d+\.]*) \"(?<http_request_type>[^ \"]+) (?<http_request_path>[^\"]+)\" status\: (?<http_status_code>[^ ]+) (?<message>.*)

см. демо здесь.

Regex101 Демо

который отлично работает в regex101, но td-agent не работает с этой ошибкой

[error]: config error file = "/etc/td-agent/td-agent.conf" error_class=Fluent::ConfigError error = "Invalid regexp in format1: premature end of char-class: /(?<DateTime>\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})(\\.\\d{3,6})? (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) (\\[(?<context>[^\\]]*)\\]) (?<ip>[[\\d+\\.]*) \\\"(?<http_request_type>[^ \\\"]+) (?<http_request_path>[^\\\"]+)\\\" status\\: (?<http_status_code>[^ ]+) (?<message>.*)/m

это похоже на выход из проблемы, вы можете показать реальный код?

Roman Pushkin 05.09.2018 22:55

Это шаблон, который не работает <source> @type tail path /var/log/nova/nova-api.log tag nova format multiline format_firstline / \ d {4} - \ d {2} - \ d {2} \ d {2}: \ d {2}: \ d {2} (\. \ d {3,6})? [^] * [^] * [^] * / format1 / (? <DateTime> \ d {4} - \ d {2} - \ d {2} \ d {2}: \ d {2}: \ d {2}) (\. \ d {3,6})? (? <pid> [^] *) (? <loglevel> [^] *) (? <class> [^] *) ([(? <context> [^]] *)]) (? <ip> [[\ d + \.] *) \ "(? <http_request_type> [^ \"] +) (? <http_request_path> [^ \ "] +) \" status \: (? <http_status_code> [^] +) (? <сообщение>. *) / time_format% F% T.% L </source>

Arman 05.09.2018 23:00
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
1
2
479
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте выйти из своего xml в Интернете, например, здесь: https://www.freeformatter.com/xml-escape.html или замените @ на &amp;

У меня нет XML-данных для анализа, это просто данные журнала, например, 2018-09-05 12:34: 01.451 3212169 INFO nova.osapi_compute.wsgi.server [req-0f15c395-5962-4a14-ba7a-730f86d6eb7e f1ab53782de846798920050941f3bcff f5d0c8e495cd4793814f8b979693ac17 - по умолчанию по умолчанию] 192.168.1.1 "GET /v2.1/os-services HTTP / 1.1" статус: 200 длина: 1435 время: 0,0372221

Arman 05.09.2018 23:10
Ответ принят как подходящий

Проблема заключалась в лишней квадратной скобке в ip группы совпадений. Правильный шаблон.

(?<DateTime>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})(\.\d{3,6})? (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) (\[(?<context>[^\]]*)\])? (?<ip>[\d+\.]*) \"(?<http_request_type>[^ \"]+) (?<http_request_path>[^\"]+)\" status\: (?<http_status_code>[^ ]+) (?<message>.*)

Другие вопросы по теме