linux日志守護進程 syslog


幾乎所有的網絡設備都可以通過syslog協議,將日志信息以UDP的形式傳送給遠端服務器,遠端接收日志服務器必須通過syslogd監聽UDP端口514,並根據 syslog.conf 配置文件張的配置處理。配置文件 /etc/rsyslog.conf 中規定了syslogd如何根據設備和信息的重要級別來報告信息。

CentOS6.5之前,配置文件為/etc/syslog.conf,從CentOS6.5之后,配置文件名變更為/etc/rsyslog.conf 。

syslog支持日志分類輸出到特定文件中,但是有幾個限制:

     1、syslog日志輸出支持分類,但不支持每個進程單獨輸出到某個文件(因為syslog並不是作為一套完整的日志庫而產生的);

     2、syslog輸出的日志文件位置並不是任意的,默認僅僅限於【/var/log/】目錄下,如果指定到其他位置,視為無效;

配置文件的格式:

【服務.優先級 <tab> action字段】。

其中,【服務.優先級】一起統稱為選擇條件。條件選擇是對服務進行了分類,便於syslog對日志的輸出管理。同時一行的配置中,允許出現多個選擇條件,多個選擇條件使用 ; 隔開。

 

服務(facility),用來指定syslog的功能,主要包括:

 1 kern        內核信息,首先通過 klogd 傳遞;
 2 user        用戶進程;
 3 mail        郵件;
 4 daemon      后台進程;
 5 authpriv    授權信息;
 6 syslog      系統日志;
 7 lpr         打印信息;
 8 news        新聞組信息;
 9 uucp        由uucp生成的信息
10 cron        計划和任務信息。
11 mark        syslog 內部功能用於生成時間戳
12 local0---local7  與自定義程序使用,例如使用 local5 做為 ssh 功能
13 *           通配符代表除了 mark 以外的所有功能 

優先級(level),指定了syslog的優先級,從高到底依次為:

 1 emerg 或 panic  該系統不可用(最緊急消息) 
 2 alert           需要立即被修改的條件(緊急消息)
 3 crit            阻止某些工具或子系統功能實現的錯誤條件(重要消息)
 4 err             阻止工具或某些子系統部分功能實現的錯誤條件(出錯消息)
 5 warning         預警信息(警告消息)
 6 notice          具有重要性的普通條件(普通但重要的消息)
 7 info            提供信息的消息(通知性消息)
 8 debug           不包含函數條件或問題的其他信息(調試級-信息量最多)
 9 none            沒有重要級,通常用於排錯(不記錄任何日志消息)
10 *               所有級別,除了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 等.
/var/log/xferlog 的各個字段解析
Thu Dec 1 17:40:46 2016 8 10.11.40.147 32035942 /home/chb/1 .txt b _ o r dxpanalysis ftp 0 * c
字段 含義
Thu Dec 1 17:40:46 2016 日期和時間
8 下載文件所花費的秒數
10.11.40.147 遠程系統
320359 文件大小
/home/chb/1.txt 本地路徑名
b 傳輸類型(a:ASCII,b:二進制)
_ 與壓縮相關的標志或tar,或”_”(如果沒有壓縮的話)
o 傳輸方向(相對於服務器而言:i代表進,o代表出)
r 訪問模式(a:匿名,g:輸入口令,r:真實用戶)
dxpanalysis 用戶名
ftp 服務名(通常是ftp)
0 認證方法(l:RFC931,或 0)
* 認證用戶的ID或”“, 為未獲取到
c 傳輸狀態; c表示傳輸完成

調用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 ...

    簡單的例子看到這里就夠了,我看到網上很多人都在討論如何使用syslog針對特定的某一進程輸出日志文件,但都沒有很好的解決方案。盡管在配置文件中提供了local0~local7自定義服務,但也並不是萬能的,很多情況下並不能真正實現我們的目的。

    這里我想說的是,Linux下的syslog,它出現的目的並不是為了提供用戶每個進程的日志輸出,syslog只是用來作為對於服務管理的整套機制,它針對的是一類服務,用來做日志服務器,實現對整個系統網絡中日志的維護(對日志的維護,實際上就是對整個計算機群的維護)。同時,真正的工程中,並不會使用syslog作為全套的日志管理工具,在Linux下有提供了很多完整的日志庫工具,比如log4cplus、zlog等。


免責聲明!

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



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