Мне сложно отладить проблему, и я думаю, что это может быть двоякое - проблемы в двух отдельных программах.
Основная проблема заключается в том, что я регистрирую nginx в системном журнале Ubuntu 14.04 следующим образом:
access_log syslog:server=unix:/dev/log,tag=nginx,facility=local7,severity=info combined
Я хотел иметь возможность фильтровать сообщения с тегами nginx, но безуспешно.
filter nginx { facility(local7) and tags("nginx") }
Замена и на или работает, или просто удаление части тегов, поскольку фильтр средств работает нормально. Однако фильтр тегов этого не делает.
Итак, я хотел протестировать с помощью регистратора и настроить базовый тест как таковой:
template nginx { template("timestamp=${ISODATE} host=${HOST} tags=${TAGS} msgheader=${MSGHDR} ${MSG}\n"); template-escape(no); };
filter nginx { tags("nginx"); };
destination nginx { file("/tmp/nginx.log" template(nginx)); };
log { source(s_net); filter(nginx); destination(nginx); };
-
$ logger -n localhost -P 10001 -t nginx -p local7.info -u /tmp/ignored testing 123
У меня есть источник s_net, который прослушивает UDP на порте 10001 для этого теста. Используя регистратор, я вхожу на этот порт через UDP, помечая "nginx" с возможностью local7 и серьезностью информации, и, опять же, фильтрация не работает. Удаление ограничения фильтра позволяет сообщению проходить до места назначения, так же, как это было напрямую с nginx. Тег просто не работает.
Кроме того, тег отображается не в макросе $ TAGS, а в макросе $ MSGHDR.
Примечание: / tmp / ignored - это обходной путь в logger <2.0.2, при котором, если вы не предоставляете сокет, он вообще не будет записывать в порты TCP / UDP, поэтому предоставление фиктивного флага позволяет ему работать
Кажется, что даже при использовании регистратора я не могу фильтровать входящий тег.
Я относительно новичок в syslog (и, в частности, syslog-ng), так что, возможно, что-то мне не хватает? Документация кажется скудной, но это выглядит как довольно простой вариант использования. Кто-нибудь видит что-то особенно неправильное, или я, возможно, неправильно понимаю назначение тегов?
Существует разница между полем TAG, определенным в RFC3164, на которое ссылается параметр конфигурации nginx, и фильтром тегов, используемым внутри Syslog-ng.
Поле TAG, которое вы можете определить в Nginx, интерпретируется как программа или процесс, который регистрирует текущее сообщение. Он находится в части MSG пакета системного журнала и заканчивается первым не буквенно-цифровым символом. Все, что будет после этого, будет использоваться как фактическое сообщение (RFC3164 # section-4.1.3).
Вы можете видеть это, когда вы нюхаете трафик системного журнала, например с tcpdump:
tcpdump -A -vvv -s0 -n -i venet0 port 514
Это пример из NGINX с конфигурацией, указанной ниже:
15:25:16.477717 IP (tos 0x0, ttl 63, id 22206, offset 0, flags [DF], proto UDP (17), length 454) loadbalancer.example.com.45470 > log.example.com.514: [udp sum ok] SYSLOG, length: 426
Facility local6 (22), Severity notice (5)
Msg: Mar 10 15:25:16 loadbalancer.example.com nginx_access: "[10/Mar/2017:15:25:16 +0100]" "NO-CACHE" "app.example.com:80" "0.032" "302" "331" "10.235.121.191" "sub.example.com" "GET /location/?parameter=value1 HTTP/1.1" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Win64; x64; Trident/7.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; Tablet PC 2.0)"
Я иногда использую поле TAG в nginx, чтобы различать разные файлы журналов:
access_log /var/log/nginx/www.example.com.ssl_access_log proxy;
error_log /var/log/nginx/www.example.com.ssl_error_log warn;
access_log syslog:server=10.0.80.110,facility=local6,tag=nginx_access,severity=notice proxy;
error_log syslog:server=10.0.80.110,facility=local6,tag=nginx_error,severity=error warn;
А на принимающем сервере syslog-ng я могу отсортировать входящие сообщения или просто выгрузить их в один большой файл:
source s_net { udp(); };
filter f_prg_nginx_access{ program(nginx_access); };
filter f_prg_nginx_error{ program(nginx_error); };
destination d_lb_access { file("/var/log/lb_access.log" perm(0640));};
destination d_lb_error { file("/var/log/lb_error.log" perm(0640)); };
log { source(s_net); filter(f_prg_nginx_access); destination(d_lb_access); };
log { source(s_net); filter(f_prg_nginx_error); destination(d_lb_error); };
Как уже упоминал Роберт Фекете, фильтрация тегов в Syslog-ng - это еще один способ внутренней маркировки сообщений, которые поступают на определенный порт или соответствуют шаблону. Кроме того [2] говорит, что тегирование - это самый быстрый способ сортировки сообщений в syslog-ng, но теги доступны только локально и не отправляются по сети.
[1] https://www.nginx.com/resources/admin-guide/logging-and-monitoring/ [2] https://www.balabit.com/sites/default/files/documents/syslog-ng-ose-3.6-guides/en/syslog-ng-ose-v3.6-guide-admin/html/tagging-messages. html
Теги в syslog-ng - это внутренние теги, которые вы можете явно добавить к сообщению (например, в источнике) или проанализировать из сообщения.
Я не знаю, как тег nginx в регистраторе или конфигурация access_log влияет на само сообщение, но я думаю, что syslog-ng его не анализирует.
Не видя образца сообщения, я могу предложить следующие возможные пути решения проблемы:
HTH
С Уважением,
Роберт