Apache-2.2

Apache 管道日誌到 netcat 失敗

  • March 17, 2014

我想以自定義格式 (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

我不確定如何獲得更多關於失敗的調試資訊。

  1. 有人可以幫助我獲得有關失敗的更詳細資訊嗎?
  2. 如果有人知道為什麼會失敗,那麼這也是一個很好的答案!
  3. 另一種持續(實時)發送日誌的方法也是一種可接受的解決方案。但是,我知道logstash,但在這種情況下,我不需要解析,我已經可以以 GELF 格式輸出。我過去也嘗試過logstash,但它總是最終耗盡記憶體並自行停止。

阿帕奇文件:http ://httpd.apache.org/docs/2.2/logs.html#piped

Apache 將在伺服器啟動時啟動管道日誌程序,如果在伺服器執行時崩潰,它將重新啟動它。(最後一個特性就是為什麼我們可以將這種技術稱為“可靠的管道日誌記錄”。)

數控文件: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 以 1 秒的超時時間啟動 netcat。不管是否有任何日誌數據,netcat 都會在一秒後超時(由於 -w 1 選項)並退出。Apache 然後重新啟動 netcat。起泡,沖洗,重複。

在這種情況下,我建議-w 1從 netcat 命令中刪除。

退後一步,我建議使用 syslog 來實現這個功能(不知道你為什麼不首先使用它)。

引用自:https://serverfault.com/questions/582510