天天看點

(轉載)把syslog接收的遠端日志從/var/log/messages中分開

今天突然要配置Linux的syslog伺服器,摸了一早上才弄好。記錄遠端機器發來的syslog消息倒是容易(網上到處都是),不過按照預設的設定,syslog會将所有資訊都給寫入 /var/log/messages 中,和本機的消息都混到一塊去了。

實在可恨,搜了一上午都找不到解決辦法。本來看到個FreeBSD中用腳本處理的方法,興沖沖的跑去實驗,結果一點反應都沒有。

後來看到介紹中有一句:“※注意,不能通過“|/var/xxx.sh”方式導向日志到其他腳本中處理!!”,差點氣得吐血...

網上有人說syslog不能分離遠端日志,于是試圖從syslog-ng下手。結果syslog-ng編譯起來N麻煩不說,跑起來還有問題,于是回頭繼續摸索syslog。試了N次終于找到個差強人意的解決辦法,算是解決分離的問題。

--------------------------------------------------------------------------------

首先确定遠端發來的消息是哪一級的,比如Panabit發過來的都是emerg級消息,某些路由器用的是notice級。實在不行就先用info然後過濾(具體辦法見後文)。

(紅色字是要添加的内容)

vi /etc/sysconfig/syslog

SYSLOGD_OPTIONS="-r -x -m 0"

-r: 打開接受外來日志消息的功能,其監控514 UDP端口;

-x: 關閉自動解析對方日志伺服器的FQDN資訊,這能避免DNS不完整所帶來的麻煩;

vi /etc/syslog.conf

# 把emerg等級的消息從messages中除開,免得重複記錄:

*.info;*.!emerg;mail.none;authpriv.none;cron.none /var/log/messages # *.!emerg 表示不記錄emerg級的消息

#*.emerg * # 注釋掉原來的emerg,不将emerg級消息顯示到控制台

# 輸出到/var/log/mylog

*.emerg /var/log/mylog

然後重新開機syslog:service syslog restart

這樣就把遠端日志寫入/var/log/syslog并且不影響本機syslog工作了。

關于/etc/syslog.conf寫法,這裡有個詳細說明:

/etc/syslog.conf 根據如下的格式定義規則

/etc/syslog.conf 根據如下的格式定義規則:

facility.level action

裝置.優先級 動作

1、facility 定義日志消息的範圍,其可使用的key有:

auth -由 pam_pwdb 報告的認證活動。

authpriv -包括特權資訊如使用者名在内的認證活動 

cron -與 cron 和 at 有關的計劃任務資訊。 

daemon -與 inetd 守護程序有關的背景程序資訊。 

kern -核心資訊,首先通過 klogd 傳遞。 

lpr -與列印服務有關的資訊。 

mail -與電子郵件有關的資訊 

mark - syslog内部功能用于生成時間戳 

news -來自新聞伺服器的資訊 

syslog -由 syslog 生成的資訊 

user -由使用者程式生成的資訊 

uucp -由 uucp 生成的資訊 

local0-local7 -與自定義程式使用

* 通配符代表除了 mark 以外的所有功能

除mark為内部使用外,還有security為一個舊的key定義,等同于auth,已經不再建議使用。

2、level級别定義消息的緊急程度。按嚴重程度由高到低順序排列為:

emerg -該系統不可用,等同panic

alert -需要立即被修改的條件 

crit -阻止某些工具或子系統功能實作的錯誤條件 

err -阻止工具或某些子系統部分功能實作的錯誤條件,等同error

warning -預警資訊,等同warn 

notice -具有重要性的普通條件 

info -提供資訊的消息 

debug -不包含函數條件或問題的其他資訊 

none -沒有重要級,通常用于排錯 

* 所有級别,除了none

其中,panic、error、warn均為舊的辨別符,不再建議使用。

在定義level級别的時候,需要注意兩點:

1)優先級是由應用程式在程式設計的時候已經決定的,除非修改源碼再編譯,否則不能改變消息的優先級;

2)低的優先級包含高優先級,例如,為某個應用程式定義info的日志導向,則涵蓋notice、warning、err、crit、alert、emerg等消息。(除非使用=号定義)

3、selector選擇條件

通過小數點符号“.”把facility和level連接配接在一起則成為selector(選擇條件)。

可以使用分号“;”同時定義多個選擇條件。也支援三個修飾符:

* - 所有日志資訊

= - 等于,即僅包含本優先級的日志資訊

! - 不等于,本優先級日志資訊除外

4、action動作 由前面選擇條件定義的日志資訊,可執行下面的動作:

file-指定日志檔案的絕對路徑 

terminal 或 print -發送到串行或并行裝置标志符,例如/dev/ttyS2

@host -遠端的日志伺服器

username -發送資訊本機的指定使用者資訊視窗中,但該使用者必須已經登陸到系統中 

named pipe -發送到預先使用 mkfifo 指令來建立的 FIFO 檔案的絕對路徑

※注意,不能通過“|/var/xxx.sh”方式導向日志到其他腳本中處理!!

另外:如果确定不了遠端發來的消息屬于哪一級,可以這樣做:

# 先分别記錄各種消息

*.info;mail.none;authpriv.none;cron.none /var/log/messages

*.emerg /var/log/testlog1

*.warning /var/log/testlog2

*.notice /var/log/testlog3

然後分别cat并與messages中比較一下看看哪個裡面有需要的日志。比如發現emerg和notice裡有需要的内容,再改成這樣:

*.info;*.!emerg;*.!notice;mail.none;authpriv.none;cron.none /var/log/messages

*.emerg;*.notice /var/log/mylog

這樣寫就是将emerg和notice的内容獨立出來,存入/var/log/mylog,以免都混到/var/log/messages中不好分析。

轉載于:http://www.cnblogs.com/bits/archive/2009/03/09/Linux-syslog_remote_cap2sf.html

本文轉自 liang3391 51CTO部落格,原文連結:http://blog.51cto.com/liang3391/456539

繼續閱讀