Как я могу отправить журналы из образа jwilder / nginx-proxy docker в logstash?

#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 .

Обратите внимание, что это работает, несмотря на замечание Яна о том, что системный журнал не работает внутри контейнера. Не знаю почему, это просто работает ™