Итак, я предполагаю, что graylog у Вас уже есть. Если нет, здесь на Хабре есть годное описание. Только внимательно следите за версиями компонентов Graylog, ElasticSearch, MongoDB и нужной версией Java.
Способ 1. Graylog Sidecar и Filebeat. Описание установки на Хабре. Только учтите, nginx новых версий может выдавать логи в json сам. В статье много полезного и красивого, рекомендую. Плюсом sidecar является то, что он может управлять разными агентами, а не только Filebeats. Конечно, Filebeats может сам проводить предварительную обработку. Но тут уж зависит от стратегии. Или обработать, потом слать на Graylog, или все слать, потом обрабатывать.
Способ 2. В отличие от предыдущего, он не требует агента. Это content pack Graylog https://marketplace.graylog.org/addons/572ff823-62cc-468e-af17-300bcfd9932d, этот помечен как "deprecated", рекомендован https://github.com/ronlut/graylog-content-pack-nginx-docker. Собственно, это *.json файлы, которые грузятся через меню веб-интерфейса System/Content Pack. Подробнее. Суть в том, что вы задаете формат лога, а затем место назначения: Пример nginx.conf (или в другом *conf)
Спойлер
log_format graylog2_json escape=json '{ "timestamp": "$msec", ' '"remote_addr": "$remote_addr", ' '"body_bytes_sent": $body_bytes_sent, ' '"request_time": $request_time, ''"response_status": $status, ''"request": "$request",'
'"request_method": "$request_method",'
'"host": "$host",''"upstream_cache_status": "$upstream_cache_status",'
'"upstream_addr": "$upstream_addr",' '"http_x_forwarded_for": "$http_x_forwarded_for",' '"http_referrer": "$http_referer", ' '"http_user_agent": "$http_user_agent", ' '"http_version": "$server_protocol", ' '"nginx_access": true }';
access_log /var/log/nginx/access.log graylog2_json;
error_log /var/log/nginx/error.log warn;
Способ 3. Тоже безагентский. Перенаправление в syslog. Собственно, вообще ничего добавлять не надо. В nginx.cong
error_log syslog:server=unix:/dev/log,facility=local7,tag=vhost1_err,severity=error;
access_log syslog:server=unix:/dev/log,facility=local7,tag=vhost1,nohostname,severity=info combined;
Обратите внимание передача идет в local7, tag=vhost1. "Tag" в Graylog будет отражаться в "application name".
rsyslog.conf
#replace glsrv with actual central log server
local7.* @@glsrv:10514;RSYSLOG_SyslogProtocol23Format
$ sudo systemctl restart rsyslog
Почему @@ - TCP, а не @ - UDP - немного позже. Порт 10514, хотя для TCP обычно 5044. Это все равно. Да, /var/log/syslog (/var/log/messages) будет разукрашен сообщениями веб-сервера. Подключаем как обычный SystogTCP.
Если установлен TCP, то можно включить TLS. И rsyslog и Graylog его понимают. Чтобы не дублировать инструкцию здесь, вот ссылка на GitHub. Там есть русская инструкция(README.RUS.md). Набор скриптов позволит автоматизировать генерацию сертификатов и конфигов для ускорения установки TLS.
Буду благодарен за другие варианты. Как проверю, буду добавлять с указанием комментатора.
tuxi
4й способ для access логов: ngx_http_mirror_module, и там куда отправите, уже делайте что нужно.