如何将日志从 jwilder/nginx-proxy docker 图像发送到 logstash?
How can I send the logs from the jwilder/nginx-proxy docker image to logstash?
我尝试将以下内容添加到 my_proxy.conf
文件中,该文件按照 https://github.com/jwilder/nginx-proxy#custom-nginx-configuration 中的描述安装到容器中的 /etc/nginx/conf.d/
中,但日志没有进入 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。从这里我不知道如何排除故障。
Syslog 不会 运行 在您的容器中,因此使用它进行日志记录没有意义。您的选择:
1.) 在 Docker 守护程序级别配置 gelf
日志记录驱动程序:
Writes log messages to a Graylog Extended Log Format (GELF) endpoint such as Graylog or Logstash.
文档:https://docs.docker.com/config/containers/logging/configure/
2.) Start/configure 专用日志容器,它将选定容器的数据发送到 logstash。请参阅 Logspout
或其他类似工具。
我所做的是修改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,bash进入nginx-proxy容器,查看生成的/etc/nginx/conf.d/default.conf
。
就是这个主意。能够在某处指定系统日志 URL 而不必手动将粘贴复制到 nginx.tmpl
.
会很好
请注意,尽管 Jan 关于 syslog 不能在容器内工作的观点,但这确实有效。不知道为什么,It Just Works™
我尝试将以下内容添加到 my_proxy.conf
文件中,该文件按照 https://github.com/jwilder/nginx-proxy#custom-nginx-configuration 中的描述安装到容器中的 /etc/nginx/conf.d/
中,但日志没有进入 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。从这里我不知道如何排除故障。
Syslog 不会 运行 在您的容器中,因此使用它进行日志记录没有意义。您的选择:
1.) 在 Docker 守护程序级别配置 gelf
日志记录驱动程序:
Writes log messages to a Graylog Extended Log Format (GELF) endpoint such as Graylog or Logstash.
文档:https://docs.docker.com/config/containers/logging/configure/
2.) Start/configure 专用日志容器,它将选定容器的数据发送到 logstash。请参阅 Logspout
或其他类似工具。
我所做的是修改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,bash进入nginx-proxy容器,查看生成的/etc/nginx/conf.d/default.conf
。
就是这个主意。能够在某处指定系统日志 URL 而不必手动将粘贴复制到 nginx.tmpl
.
请注意,尽管 Jan 关于 syslog 不能在容器内工作的观点,但这确实有效。不知道为什么,It Just Works™