Шаблон ELK Grok - переменное количество параметров для журнала ошибок nginx

Я пытаюсь настроить шаблон GROK для записи журналов ошибок nginx, но содержимое меняется. Например, если реферера нет, он просто оставляет это значение в конце строки:

2018/08/30 09:30:32 [error] 84843#0: *24414687217 open() "/www/sites/js/draw.js" failed (2: No such file or directory), client: 172.68.211.134, server: www.example.com, request: "GET /bundles/app/js/draw.js HTTP/1.1", host: "www.example.com"

Но если он есть, он добавляет:

, referrer: "https://www.example.com/de/member/foo"

Мой текущий шаблон GROK работает для строк с реферером, но как я могу заставить его обрабатывать оба примера?

%{DATA:nginx_error.time} \[%{DATA:nginx_error.level}\] %{NUMBER:nginx_error.pid}#%{NUMBER:nginx_error.tid}: (\*%{NUMBER:nginx_error.connection_id} )?%{GREEDYDATA:nginx_error.message}, client: %{IP:nginx_error.client}, server: %{HOSTNAME:nginx_error.server}, request: \"%{DATA:nginx_error.request}\", host: \"%{HOSTNAME:nginx_error.host}\", referrer: \"%{URI:nginx_error.referrer}\"

person Jeremy Wilson    schedule 31.08.2018    source источник


Ответы (1)


Вы можете сделать реферер необязательным, используя ?, что-то вроде (, referrer: )?(\"%{URI:referrer}\")?

Обратите внимание, что данные, заключенные в круглые скобки (...), называются capturing group.

Тогда ваш образец станет,

%{DATA:nginx_error.time} \[%{DATA:nginx_error.level}\] %{NUMBER:nginx_error.pid}#%{NUMBER:nginx_error.tid}: (\*%{NUMBER:nginx_error.connection_id} )?%{GREEDYDATA:nginx_error.message}, client: %{IP:nginx_error.client}, server: %{HOSTNAME:nginx_error.server}, request: \"%{DATA:nginx_error.request}\", host: \"%{HOSTNAME:nginx_error.host}\"(, referrer: )?(\"%{URI:referrer}\")?
person Sufiyan Ghori    schedule 01.09.2018