#docker #nginx #logstash #jwilder-nginx-proxy
#docker #nginx #logstash #jwilder-nginx-proxy
Вопрос:
Я попытался добавить следующее в my_proxy.conf
файл, который монтируется в /etc/nginx/conf.d/
контейнер, как описано вhttps://github.com/jwilder/nginx-proxy#custom-nginx-configuration но журналы не преобразуются в logstash.
Изначально я добавил это в файл conf:
http {
# Custom log format that also includes the host that processed the request
log_format logstash '$remote_addr - $remote_user [$time_local] "$host" '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
# Send logs to Logstash
access_log syslog:server=logstash:5140,tag=nginx_access logstash;
error_log syslog:server=logstash:5140,tag=nginx_error notice;
}
но когда я запускаю контейнер, он сообщает мне "http" directive is not allowed here in /etc/nginx/conf.d/my_proxy.conf:11
Итак, теперь у меня просто есть
# Custom log format that also includes the host that processed the request
log_format logstash '$remote_addr - $remote_user [$time_local] "$host" '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
# Send logs to Logstash
access_log syslog:server=logstash:5140,tag=nginx_access logstash;
error_log syslog:server=logstash:5140,tag=nginx_error notice;
который не получает никаких жалоб при запуске nginx, но также ничего не помещает в logstash. Отсюда я не знаю, как устранить неполадки.
Комментарии:
1. Пожалуйста, также поделитесь своей конфигурацией logstash.
Ответ №1:
Системный журнал не запускается в вашем контейнере, поэтому нет смысла использовать его для ведения журнала. Ваши варианты:
1.) Настройте gelf
драйвер ведения журнала на уровне демона Docker:
Записывает сообщения журнала в конечную точку расширенного формата журнала Graylog (GELF), такую как Graylog или Logstash.
Документ:https://docs.docker.com/config/containers/logging/configure /
2.) Запустите / настройте выделенный контейнер ведения журнала, который будет отправлять данные для выбранных контейнеров в logstash. Смотрите Logspout
или другие подобные инструменты.
Инструмент:https://github.com/gliderlabs/logspout
Ответ №2:
Что я сделал, так это изменил nginx.tmpl
файл, который является шаблоном, используемым для генерации /etc/nginx/conf.d/default.conf
.
Я добавил строку, чтобы везде access_log
появлялась. Например:
access_log /var/log/nginx/access.log vhost;
access_log syslog:server=111.222.111.222:1025 custom;
Я определил custom
формат рядом с другим форматом. Например.
log_format vhost '$host $remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
log_format custom '$remote_addr - $remote_user [$time_local]'
'"$request" $status $body_bytes_sent'
'"$http_referer" "$http_user_agent"'
'"$request_time" "$upstream_connect_time"';
А затем смонтировать nginx.tmpl
в контейнер. например.
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- ./config/nginx.conf:/etc/nginx/nginx.conf
- ./nginx.tmpl:/app/nginx.tmpl
- ./logs:/var/log/nginx
Для проверки перезапустите nginx-proxy, запустите контейнер nginx-proxy и посмотрите на сгенерированный /etc/nginx/conf.d/default.conf
.
Это идея. Было бы неплохо иметь возможность указывать URL-адрес системного журнала где-нибудь вместо того, чтобы вручную копировать вставлять в nginx.tmpl
.
Обратите внимание, что это работает, несмотря на замечание Яна о том, что системный журнал не работает внутри контейнера. Не знаю почему, это просто работает ™