如何将nginx访问日志导出到套接字而不是文件?



我想将nginx生成的日志推送到influxdb。 为了解决这个问题,我有一个代理,它可以格式化它,提取一些地理数据,生成地理哈希等。

问题是nginx和代理在单独的docker容器中运行,nginx是一个生产者,它只能写入文件系统,但agent只能从网络读取(例如一些 tcp 流、websocket 或 http,因为它通常在 webdev 中完成(

我不想在容器之间共享访问.log卷、浪费空间和长时间解析数公里的日志。

如何让nginx将日志直接写入某些tcp套接字?

nginx直接写入日志到某些TCP套接字是不安全的,
因为套接字写入可能会减慢甚至阻止nginx

NGINX 可以配置为记录到系统日志,如果agent能够读取系统日志

access_log syslog:server=syslog_server_ip:sys_log_server_port,facility=local7,tag=nginx,severity=info;

如果您决定进行自定义转发,这是另一种简单但有缺陷的方法
将nginx写入到命名管道,使用NCAT将其发送出去

mkfifo /var/log/nginx/access.log  
ncat  agent_ip agent_port 0</var/log/nginx/access.log

这是有问题的,因为当断开连接时
必须手动重新启动 NCAT,主管可以帮助重新启动
,但是当它们被NCAT保留但不通过网络发送时,可能会丢失一些日志行

Flume是进行此类日志转发的更好工具

最新更新