首頁 > 軟體

Linux下的syslog紀錄檔守護行程深入理解

2020-06-16 17:17:38

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下有提供了很多完整的紀錄檔庫工具,比如log4cpluszlog等。

本文永久更新連結地址http://www.linuxidc.com/Linux/2017-04/142842.htm


IT145.com E-mail:sddin#qq.com