syslog syslog-ng rsyslog flume scribe 各種嘗試


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默認接受的日志來源有三部分

  1. 內核日志;
  2. 本機的用戶進程寫入的日志;
  3. 其他主機通過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性能的分析


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM