2010年7月18日 星期日

syslog的愛、勇氣與希望...

話說plqadmin第二版已經邁入說好的rev 60但是有些部分還沒修改完畢,像是php寫的syslog接收器
於是今天去加班了,星期五已經把log的解析完成了,也是用動態建立物件的方式來延伸支援的log格式
主流程在接收UDP 514的訊號,原本想說應該可以很快完成的,沒想到遇到syslog無法轉拋到本機的問題
也許你會問為什麼要拋到本機,因為我想接收log來記錄某些事件作為報表

就目前理解的syslog架構為 App -> /dev/log -> syslog demon -> logfile or remote syslog
log轉拋之前實做的經驗是在/etc/syslog.conf加入下列的設定就能轉拋到遠端

*.* @ip

但是今天發現,這個IP如果是本機,就收不到任何的東西,也沒任何錯誤出現
使用debug模式啟動syslog的時發現下面的訊息

Called fprintlog, logging to FORW(UNKNOWN) 127.0.0.1
Forwarding suspension not over, time left: 180


仔細看了一下訊息又發現
syslog只要有要往外拋的設定,他就會使用UDP 514來發送
沒錯就是用來收log的PORT,推論因此無法同時收與發送

forwarding host: 127.0.0.1
Opened UNIX socket `/dev/log'.
Opened syslog UDP port.


不過如果修改/etc/services 內的syslog服務的port為5140
依然無法拋到本機,出現同樣的訊息,原因不明...|||

最後還有一招將log拋到pipe去,在syslog.conf的說明裡面有寫

*.* |/tmp/my.pipe

可以將log丟到具名的管道中,這不為是個好辦法
but管道的證資料,並不會完整的出現,有一些會留在pipe中直到下一次flush才會出現
我想這就跟沖馬桶一樣,總有些東西會卡在裡面

所以接收程式要能判斷log是不是完整的,至於怎麼判斷....
提示:跟\n有關