我想将自定义格式 (GELF) 的 Apache 日志发送到 UDP 接收服务器(运行 Graylog2)。我确信一切正常,但过了一会儿,我收到一条警报,我的服务器没有响应。我在 Apache 错误日志中看到一大堆:
piped log program 'nc -w 1 -u logserver 12201' failed unexpectedly
有趣的是,在流量非常小的服务器上,即使网站没有流量,我也会在日志中不断看到此错误。而当有流量时,netcat 会将日志发送到 graylog - 因此无论如何它都会正常工作。
如果我停止 Apache 并重新启动它,错误在重新启动后仍会继续显示在错误日志中。我确保在停止它之后没有剩余失控进程。
配置如下:
LogFormat "{ \"version\": \"1.1\", \"host\": \"%V\", \"short_message\": \"%r\", \"full_message\": \"%r, status: %>s, %O bytes, User Agent: %{User-Agent}i\", \"timestamp\": %{%s}t, \"level\": 6, \"_user_agent\": \"%{User-Agent}i\", \"_source_ip\": \"%a\", \"_duration_usec\": %D, \"_duration_sec\": %T, \"_request_size_byte\": %O, \"_http_status\": %s, \"_http_request_path\": \"%U\", \"_http_request\": \"%U%q\", \"_http_method\": \"%m\", \"_http_referer\": \"%{Referer}i\" }" graylog2_access
以及 CustomLog:
CustomLog "|nc -w 1 -u logserver 12201" graylog2_access
我不确定如何获取有关失败的更多调试信息。
- 有人能帮助我获得有关失败的更多详细信息吗?
- 如果有人知道为什么会失败,那么这也将是一个很好的答案!
- 另一种持续(实时)发送日志的方法也是可以接受的解决方案。不过,我知道 logstash,但在这种情况下,我不需要解析,我已经可以以 GELF 格式输出了。我以前也试过 logstash,但它总是最终耗尽内存并自行停止。
答案1
Apache 文档:http://httpd.apache.org/docs/2.2/logs.html#piped
Apache 将在服务器启动时启动管道日志进程,如果服务器在运行时崩溃,Apache 将重新启动该进程。(最后一个特性就是我们可以将此技术称为“可靠管道日志”的原因。)
NC文档:man nc
-w timeout Connections which cannot be established or are idle timeout after timeout seconds. The -w flag has no effect on the -l option, i.e. nc will listen forever for a connection, with or without the -w flag. The default is no timeout.
您看到的是 Apache 启动 netcat,超时时间为 1 秒。无论是否有任何日志数据,netcat 都会在一秒后超时(由于 -w 1 选项)并退出。然后 Apache 重新启动 netcat。反复操作。
在这种情况下,我建议-w 1
从 netcat 命令中删除。
退一步来说,我建议使用 syslog 来实现这个功能(不确定你为什么不一开始就使用它)。