1. syslog概念
syslog本身是一種協議, 一個用來描述系統日志格式的協議, 當前的協議包括三部分:
如下面是一個syslog消息:
<30>Oct 9 22:33:20 hlfedora auditd[1787]: The audit daemon is exiting.
其中“<30>”是PRI部分,“Oct 9 22:33:20 hlfedora”是HEADER部分,“auditd[1787]: The audit daemon is exiting.”是MSG部分。
PRI部分由尖括號包含的一個數字構成,這個數字包含了程序模塊(Facility)、嚴重性(Severity),這個數字是由Facility乘以 8,然后加上Severity得來。這個字段僅在日志傳送過程中添加,日志文件中不會看到該字段。
HEADER部分包括兩個字段,時間和主機名(或IP).
MSG部分又分為兩個部分,TAG和Content。其中TAG部分是可選的。“auditd[1787]”是TAG部分,包含了進程名稱和進程PID。
2. syslogd
我們通常說的linux中的syslog是指的linux運行的一個服務器軟件,該軟件叫syslogd, 內核的日志和很多軟件比如ssh, postfix 默認都是使用syslogd來記錄日志, 當然c語言和PHP都有對應的函數和擴展,用起來也十分方便。
syslogd默認接受的日志來源有三部分
- 內核日志;
- 本機的用戶進程寫入的日志;
- 其他主機通過udp(514)發過來的日志;
如下圖所示
需要注意的是syslogd只支持udp協議,所以如果使用syslog收集日志的話, 當日志長時間大量發送的時候,會有部分日志丟失, 但如果你僅僅是為了收集日志到本地,那么syslog是一個很好的選擇。
syslog在使用udp 514端口遠程發送時,也會在本地/var/log/messages文件中也同時寫入相關內容, 所以, 如果你想查看那些日志丟失, 可以從這個本機的messages日志文件中找到。
3. syslog-ng
從名字意思上可以看出來syslog-ng是指的下一代的syslog, 主要增加的功能是增加了更多的過濾器,比如正則、and、or條件之類, 可以配置使用tcp方式進行日志收集, 也可以與syslog搭配,客戶端使用syslog,服務器使用syslog-ng的方式, 但是實驗證明這種方式也會有日志丟失。曾經嘗試調整了syslog-ng的幾個參數,用來防止日志的丟失但是都沒有解決, 一下是嘗試調整的部分參數。
1) 調整 gc_busy_threshold(n), 官方解釋是:當syslog-ng忙時,其進入垃圾信息收集狀態的時間一旦分派的對象達到這個數字,syslog-ng就啟動垃圾信息收集狀態。默認值是:3000, 當垃圾信息收集時就會停止接受日志,導致部分日志丟失。 嘗試提高到10000,沒有太大作用。 可能因為syslog-ng的這個特性,導致它丟日志成為一種必然。
2) 調整log_fifo_size (2048), 輸出隊列調整到4096, 沒有任何作用。
3) sync(10), 緩存10行寫入,改為0,即不論緩存空間有幾行,都直接寫入日志。
4) php代碼調整, 使用正規的流程 openlog syslog closelog三步, 而不是直接使用syslog讓擴展自身去open和close, 實驗有一定效果, 10w的日志,之前丟失2-8個, 改了之后不丟失了, 但是線上日志量較大,還是會丟失,測試100w時,也會丟失。
4. rsyslog
這個比syslog-ng好的一點就是直接兼容syslog的配置, 並且是開源的, tcp的性能也特別好,很快,快的原因是因為多線程的結構, 而且經過測試不會丟失日志。
以上幾個syslog服務器程序收集1000w日志的幾個測試數據
客戶端 | 服務器端 | 日志條數 |
syslog | syslog | 735841 |
syslog | syslog-ng(udp) | 9999997 |
syslog | rsyslog(udp) | 734696 |
syslog-ng(tcp) | syslog-ng(tcp) | 10000000 |
syslog-ng(udp) | syslog-ng(udp) | 4751978 |
rsyslog(tcp) | rsyslog(tcp) | 10000000 |
注意: syslog-ng使用tcp時,只有使用正規流程 openlog syslog closelog三步的情況才會不丟日志, php直接使用syslog函數(使用擴展本身進行 openlog closelog)寫日志會導致日志丟失。
5. flume
這個東西比起以上幾個來講, 要大型一些, 更為專業的日志收集的裝置, syslog的工具對於flume來說往往只是承擔flume的agent端的其中一個來源(source)的角色,而flume的數據來源很多,tail, file各種工具,支持集群。並且flume的store,支持hdfs。
6 scribe
scribe與flume不同的是, scribe使用thrift框架, 可以直接使用程序(PHP java等當然都米問題了)發送日志到中央服務器, 類似於Hbase,這一類軟件的用法, 其他沒做過太多實驗就不亂說了。
-----------------------------------------------------------------------------------------------------
歡迎使用 xhprof 進行PHP性能的分析