我想以自定义格式 (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 "|nc -w 1 -u logserver 12201" graylog2_access
我不确定如何获得更多关于失败的调试信息。
- 有人可以帮助我获得有关失败的更详细信息吗?
- 如果有人知道为什么会失败,那么这也是一个很好的答案!
- 另一种持续(实时)发送日志的方法也是一种可接受的解决方案。但是,我知道logstash,但在这种情况下,我不需要解析,我已经可以以 GELF 格式输出。我过去也尝试过logstash,但它总是最终耗尽内存并自行停止。
阿帕奇文档:http ://httpd.apache.org/docs/2.2/logs.html#piped
数控文档:
man nc
您看到的是 Apache 以 1 秒的超时时间启动 netcat。不管是否有任何日志数据,netcat 都会在一秒后超时(由于 -w 1 选项)并退出。Apache 然后重新启动 netcat。起泡,冲洗,重复。
在这种情况下,我建议
-w 1
从 netcat 命令中删除。退后一步,我建议使用 syslog 来实现这个功能(不知道你为什么不首先使用它)。