syslog是Linux下默認的日誌守護進程。任何希望生成日誌信息的程序都可以通過syslog 接口實現該目的。
同時,幾乎所有的網絡設備都可以通過syslog協議,將日誌信息以UDP的形式傳送給遠端服務器,遠端接收日誌服務器必須通過syslogd監聽UDP端口514,並根據 syslog.conf 配置文件張的配置處理。配置文件 /etc/rsyslog.conf 中規定了syslogd如何根據設備和信息的重要級別來報告信息。
這裏只需要有個大致瞭解即可,下面都會提到這些東西。
關於配置文件:
CentOS之前的版本下,配置文件爲/【etc/syslog.conf 】,具體從哪一版開始不清楚,但是從CentOS6.5之後,配置文件名變更爲【/etc/rsyslog.conf 】。
syslog是支持日誌分類輸出到某個特定文件中的,但是有幾個限制:
1、syslog日誌輸出支持分類,但不支持每個進程單獨輸出到某個文件(因爲syslog並不是作爲一套完整的日誌庫而產生的);
2、syslog輸出的日誌文件位置並不是任意的,默認僅僅限於【/var/log/】目錄下,如果指定到其他位置,視爲無效;
在該文件中,拋過大部分的註釋信息,主要內容基本都下圖格式:
從前向後,依次爲:
【服務.優先級 <tab> action字段】。
其中,【服務.優先級】一起統稱爲選擇條件,如下圖所示。條件選擇是對服務進行了分類,便於syslog對日誌的輸出管理。同時一行的配置中,允許出現多個選擇條件,多個選擇條件使用 ; 隔開。
服務(facility),用來指定syslog的功能,主要包括:
kern 內核信息,首先通過 klogd 傳遞;
user 用戶進程;
mail 郵件;
daemon 後臺進程;
authpriv 授權信息;
syslog 系統日誌;
lpr 打印信息;
news 新聞組信息;
uucp 由uucp生成的信息
cron 計劃和任務信息。
mark syslog 內部功能用於生成時間戳
local0----local7 與自定義程序使用,例如使用 local5 做爲 ssh 功能
* 通配符代表除了 mark 以外的所有功能
優先級(level),指定了syslog的優先級,從高到底依次爲:
emerg 或 panic 該系統不可用(最緊急消息)
alert 需要立即被修改的條件(緊急消息)
crit 阻止某些工具或子系統功能實現的錯誤條件(重要消息)
err 阻止工具或某些子系統部分功能實現的錯誤條件(出錯消息)
warning 預警信息(警告消息)
notice 具有重要性的普通條件(普通但重要的消息)
info 提供信息的消息(通知性消息)
debug 不包含函數條件或問題的其他信息(調試級-信息量最多)
none 沒有重要級,通常用於排錯(不記錄任何日誌消息)
* 所有級別,除了none
action:
1. /var/log/lastlog : 記錄每個使用者最近簽入系統的時間, 因此當使用者簽入時, 就會顯示其上次簽入的時間, 您應該注意一下這個時間, 若不是您上次簽入的時間, 表示您的帳號可能被人盜用了. 此檔可用 /usr/bin/lastlog 指令讀取.
2. /var/run/utmp : 記錄每個使用者簽入系統的時間, who, users, finger 等指令會查這個檔案.
3. /var/log/wtmp : 記錄每個使用者簽入及簽出的時間, last 這個指令會查這個檔案. 這個檔案也記錄 shutdown 及 reboot 的動作.
4. /var/log/secure : 登錄系統的信息
5. /var/log/maillog : 記錄 sendmail 及 pop 等相關訊息.
6. /var/log/cron : 記錄 crontab 的相關訊息 ,定時器的信息
7. /var/log/dmesg : /bin/dmesg 會將這個檔案顯示出來, 它是開機時的畫面訊息.
8. /var/log/xferlog : 記錄那些位址來 ftp 拿取那些檔案.
9. /var/log/messages : 系統大部份的訊息皆記錄在此, 包括 login, check password , failed login, ftp, su 等.
調用syslog的守護進程:
syslog也是一個守護進程,準確的說應該是rsyslog,位於/etc/rc.d/init.d/rsyslog,這是syslog的啓動腳本。當我們修改了啓動交而不能文件中的內容之後,需要使用【service rsyslog restart】命令重啓該服務。
syslog不僅僅用來記錄本機文件的日誌信息,更多的是作爲一個日誌服務器,用來接收遠程系統的信息。對該服務的啓動,有兩個常用選項:
-r:將當前主機作爲日誌服務器,監聽514端口上進來的UDP包,接收遠程系統的信息。沒有該選項,將不會接收來自遠程系統的信息。
-h:使得當前日誌服務器能夠傳送日誌信息,
如何配置一箇中央日誌服務器:
1、編輯/etc/sysconfig/rsyslog(CentOS6.5之前的版本該文件叫做syslog),該文件中可以聲明,啓動該服務的時的啓動選項。
-r:上面提到過,表示允許接收外來日誌消息;
-m **:將默認的時間戳標記信息出現頻率變爲自己指定的值【eg: -m240,表示每240分鐘在日誌文件中增加一行時間戳消息】;
-x:表示不希望讓中央日誌服務器解析其他機器的FQDN(完全合格域名,指的是主機名+全路徑);
SYSLOGD_OPTIONS="-r -x -m 240 -c 5"
2、重啓rsyslog服務
service rsyslog restart
3、關閉防火牆(iptables),允許514號端口上的連接通過;
4、對客戶機進行配置syslog
方法一:在客戶機上syslog的配置文件中,對有關配置行的操作動作部分用“@”字符指向中央日誌服務器,而不用指向本機的 /var/log/.....
# Log all the mail messages in one place.
mail.* @192.168.3.24
方法二:在DNS中定義一個機器,命名隨意,這裏以“loghost”爲例,然後將客戶機的配置文件改爲如下形式。這樣就可以避免以後如果發生日誌服務器更換的情況,不用再一個一個修改客戶機的syslog配置文件。
# Log all the mail messages in one place.
mail.* @loghost
對客戶機配置完畢之後,以及需要進行重啓。
syslog的函數接口:
#include <syslog.h> void openlog(const char *ident, int option, int facil- ity); # ident:對哪個進程進行日誌記錄,爲進程名 # option常用選項: LOG_CONS: LOG_PID:打印的每一條日誌信息包含當前進程的PID # facil-ity常用選項: LOG_USER:打印的每一條日誌信息包含當前用戶的等級信息 void syslog(int priority, const char *format, ...); # format:輸出日誌信息的參數列表,用法類同printf void closelog(void);
測試用例:
#include <stdio.h> #include <syslog.h> int main(int argc,char* argv[]) { openlog(argv[0],LOG_CONS | LOG_PID, LOG_USER); int count = 0; while(count < 5) { syslog(LOG_INFO, "%d, log info test ...", count); count++; } closelog(); return 0; }
爲了同時測試配置文件,在syslog的配置文件中添加一行內容如下:
user.* /var/log/0.1 # 該文件默認只能在/var/log下,放在其它目錄下無效
重啓rsyslog服務;
執行原程序,就可以在/var/log/看到0.log文件,打開文件,內容如下:
[root@www ~]# cat /var/log/0.log
Apr 7 23:13:12 www ./test_log[4063]: 0, log info test ...
Apr 7 23:13:12 www ./test_log[4063]: 1, log info test ...
Apr 7 23:13:12 www ./test_log[4063]: 2, log info test ...
Apr 7 23:13:12 www ./test_log[4063]: 3, log info test ...
Apr 7 23:13:12 www ./test_log[4063]: 4, log info test ...
簡單的例子看到這裏就夠了,我看到網上很多人都在討論如何使用syslog針對特定的某一進程輸出日誌文件,但都沒有很好的解決方案。儘管在配置文件中提供了local0~local7自定義服務,但也並不是萬能的,很多情況下並不能真正實現我們的目的。
這裏我想說的是,Linux下的syslog,它出現的目的並不是爲了提供用戶每個進程的日誌輸出,syslog只是用來作爲對於服務管理的整套機制,它針對的是一類服務,用來做日誌服務器,實現對整個系統網絡中日誌的維護(對日誌的維護,實際上就是對整個計算機羣的維護)。同時,真正的工程中,並不會使用syslog作爲全套的日誌管理工具,在Linux下有提供了很多完整的日誌庫工具,比如log4cplus、zlog等。
------muhuizz整理