linux syslog詳解 轉


分三部分

一、syslog協議介紹

 

二、syslog函數

三、linux syslog配置

 

一、syslog協議介紹

1、介紹

    在Unix類操作系統上,syslog廣泛應用於系統日志。syslog日志消息既可以記錄在本地文件中,也可以通過網絡發送到接收syslog的服務器。接收syslog的服務器可以對多個設備的syslog消息進行統一的存儲,或者解析其中的內容做相應的處理。常見的應用場景是網絡管理工具、安全管理系統、日志審計系統。

    完整的syslog日志中包含產生日志的程序模塊(Facility)、嚴重性(Severity或 Level)、時間、主機名或IP、進程名、進程ID和正文。在Unix類操作系統上,能夠按Facility和Severity的組合來決定什么樣的日志消息是否需要記錄,記錄到什么地方,是否需要發送到一個接收syslog的服務器等。由於syslog簡單而靈活的特性,syslog不再僅限於 Unix類主機的日志記錄,任何需要記錄和發送日志的場景,都可能會使用syslog。

    長期以來,沒有一個標准來規范syslog的格式,導致syslog的格式是非常隨意的。最壞的情況下,根本就沒有任何格式,導致程序不能對syslog 消息進行解析,只能將它看作是一個字符串。

在2001年定義的RFC3164中,描述了BSD syslog協議:
http://www.ietf.org/rfc/rfc3164.txt
    不過這個規范的很多內容都不是強制性的,常常是“建議”或者“約定”,也由於這個規范出的比較晚,很多設備並不遵守或不完全遵守這個規范。接下來就介紹一下這個規范。

    約定發送syslog的設備為Device,轉發syslog的設備為Relay,接收syslog的設備為Collector。Relay本身也可以發送自身的syslog給Collector,這個時候它表現為一個Device。Relay也可以只轉發部分接收到的syslog消息,這個時候它同時表現為Relay和Collector。

    syslog消息發送到Collector的UDP 514端口,不需要接收方應答,RFC3164建議 Device 也使用514作為源端口。規定syslog消息的UDP報文不能超過1024字節,並且全部由可打印的字符組成。完整的syslog消息由3部分組成,分別是PRI、HEADER和MSG。大部分syslog都包含PRI和MSG部分,而HEADER可能沒有。

2、syslog的格式

    下面是一個syslog消息:
<30>Oct 9 22:33:20 hlfedora auditd[1787]: The audit daemon is exiting.
    其中“<30>”是PRI部分,“Oct 9 22:33:20 hlfedora”是HEADER部分,“auditd[1787]: The audit daemon is exiting.”是MSG部分。

2.1、PRI部分 
    PRI部分由尖括號包含的一個數字構成,這個數字包含了程序模塊(Facility)、嚴重性(Severity),這個數字是由Facility乘以 8,然后加上Severity得來。不知道他們為什么發明了這么一種不直觀的表示方式。
也就是說這個數字如果換成2進制的話,低位的3個bit表示Severity,剩下的高位的部分右移3位,就是表示Facility的值。
十進制30 = 二進制0001 1110
0001 1... = Facility: DAEMON - system daemons (3)
.... .110 = Severity: INFO - informational (6)

Facility的定義如下,可以看出來syslog的Facility是早期為Unix操作系統定義的,不過它預留了User(1),Local0~7 (16~23)給其他程序使用:

      Numerical             Facility
         Code

          0             kernel messages
          1             user-level messages
          2             mail system
          3             system daemons
          4             security/authorization messages (note 1)
          5             messages generated internally by syslogd
          6             line printer subsystem
          7             network news subsystem
          8             UUCP subsystem
          9             clock daemon (note 2)
         10             security/authorization messages (note 1)
         11             FTP daemon
         12             NTP subsystem
         13             log audit (note 1)
         14             log alert (note 1)
         15             clock daemon (note 2)
         16             local use 0  (local0)
         17             local use 1  (local1)
         18             local use 2  (local2)
         19             local use 3  (local3)
         20             local use 4  (local4)
         21             local use 5  (local5)
         22             local use 6  (local6)
         23             local use 7  (local7)

       Note 1 - Various operating systems have been found to utilize
          Facilities 4, 10, 13 and 14 for security/authorization,
          audit, and alert messages which seem to be similar.
       Note 2 - Various operating systems have been found to utilize
          both Facilities 9 and 15 for clock (cron/at) messages.

Severity的定義如下:

       Numerical         Severity
        Code

         0       Emergency: system is unusable
         1       Alert: action must be taken immediately
         2       Critical: critical conditions
         3       Error: error conditions
         4       Warning: warning conditions
         5       Notice: normal but significant condition
         6       Informational: informational messages
         7       Debug: debug-level messages

    也就是說,尖括號中有1~3個數字字符,只有當數字是0的時候,數字才以0開頭,也就是說00和01這樣在前面補0是不允許的。

2.2、HEADER部分 
    HEADER部分包括兩個字段,時間和主機名(或IP)。
    時間緊跟在PRI后面,中間沒有空格,格式必須是“Mmm dd hh:mm:ss”,不包括年份。“日”的數字如果是1~9,前面會補一個空格(也就是月份后面有兩個空格),而“小時”、“分”、“秒”則在前面補“0”。月份取值包括:
Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec

    時間后邊跟一個空格,然后是主機名或者IP地址,主機名不得包括域名部分。

    因為有些系統需要將日志長期歸檔,而時間字段又不包括年份,所以一些不標准的syslog格式中包含了年份,例如:
<165>Aug 24 05:34:00 CST 1987 mymachine myproc[10]: %% It's
time to make the do-nuts. %% Ingredients: Mix=OK, Jelly=OK #
Devices: Mixer=OK, Jelly_Injector=OK, Frier=OK # Transport:
Conveyer1=OK, Conveyer2=OK # %%
    這樣會導致解析程序將“CST”當作主機名,而“1987”開始的部分作為MSG部分。解析程序面對這種問題,可能要做很多容錯處理,或者定制能解析多種syslog格式,而不僅僅是只能解析標准格式。

HEADER部分后面跟一個空格,然后是MSG部分。
    有些syslog中沒有HEADER部分。這個時候MSG部分緊跟在PRI后面,中間沒有空格。

2.3、MSG部分 
    MSG部分又分為兩個部分,TAG和Content。其中TAG部分是可選的。
    在前面的例子中(“<30>Oct 9 22:33:20 hlfedora auditd[1787]: The audit daemon is exiting.”),“auditd[1787]”是TAG部分,包含了進程名稱和進程PID。PID可以沒有,這個時候中括號也是沒有的。
    進程PID有時甚至不是一個數字,例如“root-1787”,解析程序要做好容錯准備。

    TAG后面用一個冒號隔開Content部分,這部分的內容是應用程序自定義的。


3、RFC3195 
    BSD syslog協議使用UDP協議在網絡中傳遞,然而UDP是一個不可靠的協議,並且syslog也沒有要求接收方有所反饋。為了解決這個問題,RFC又定義了一個新的規范來可靠的傳遞syslog消息,它使用TCP協議:
http://www.ietf.org/rfc/rfc3195.txt
    不過大多數情況下,使用UDP發送不需要確認的syslog消息,已經能夠滿足要求了,並且這樣做非常簡單。因此到目前為止,RFC3195的應用還是很少見的。

 

 

二、syslog函數

 

Linux C中提供一套系統日記寫入接口,包括三個函數:openlog,syslog和closelog。

調用openlog是可選擇的。如果不調用openlog,則在第一次調用syslog時,自動調用openlog。調用closelog也是可選擇的,它只是關閉被用於與syslog守護進程通信的描述符。

 

#include //頭文件

void openlog (char*ident, int option, int facility); 

void closelog(); 

void syslog(int priority, char*format,……);

 

priority參數的格式(severity level|facility code)

示例:

LOG_ERR|LOG_USER

 

severity level:

Priority Level               Description

LOG_EMERG                    An emergency situation

LOG_ALERT                    High-priority problem, such as database corruption

LOG_CRIT                     Critical error, such as hardware failure

LOG_ERR                      Errors

LOG_WARNING                  Warning

LOG_NOTICE                   Special conditions requiring attention

LOG_INFO                     Informational messages

LOG_DEBUG                    Debug messages 

 

facility value(轉自syslog.h頭文件):

 

#define LOG_KERN        (0<<3)  

#define LOG_USER        (1<<3)  

#define LOG_MAIL        (2<<3)  

#define LOG_DAEMON      (3<<3)  

#define LOG_AUTH        (4<<3)  

#define LOG_SYSLOG      (5<<3)  

#define LOG_LPR         (6<<3)  

#define LOG_NEWS        (7<<3)  

#define LOG_UUCP        (8<<3)  

#define LOG_CRON        (9<<3)  

#define LOG_AUTHPRIV    (10<<3)

#define LOG_FTP         (11<<3)

三、linux syslog配置

1)、syslog日志服務:

1、守護進程:syslog

2、端口:514

3、配置文件:/etc/syslog.conf

4、常見日志文件:

/var/log/dmesg      內核引導信息日志

/var/log/message    標准系統錯誤信息日志

/var/log/maillog    郵件系統信息日志

/var/log/cron       計划任務日志

/var/log/secure     安全信息日志

2)、 配置文件:

syslog配置文件如下

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

[root@server ~]# vim /etc/syslog.conf

# Log all kernel messages to the console.

# Logging much else clutters up the screen.

#kern.*                                                 /dev/console

# Log anything (except mail) of level info or higher.

# Don't log private authentication messages!

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

# The authpriv file has restricted access.

authpriv.*                                              /var/log/secure

# Log all the mail messages in one place.

mail.*                                                  -/var/log/maillog

# Log cron stuff

cron.*                                                  /var/log/cron

# Everybody gets emergency messages

*.emerg                                                 *

# Save news errors of level crit and higher in a special file.

uucp,news.crit                                          /var/log/spooler

# Save boot messages also to boot.log

local7.*     

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

配置文件中每行表示一個項目,格式為:facility.level    action

由兩個部分組成:

第一部分:選擇條件(可以有一個或者多個條件),分為兩個字段。

第二部分:操作動作;

    1、選擇條件

    選擇條件本身分為兩個字段,之間用一個小數點(.)分隔。前一字段是一項服務,后一字段是一個優先級。選擇條件是對消息類型的一種分類,這種分類便於人們把不同類型的消息發送到不同的地方。在同一個syslog配置行上允許出現一個以上的選擇條件,但必須用分號(;)隔開。

    常見facility:

kern                內核信息;

user                用戶進程信息;

mail                電子郵件相關信息;

daemon          后台進程相關信息;

authpriv            包括特權信息如用戶名在內的認證活動;

cron                計划任務信息;

syslog          系統日志信息

lpr             打印服務相關信息。

news            新聞組服務器信息

uucp                uucp 生成的信息

local0----local7        本地用戶信息

    2、重要級:

重要級是選擇條件的第二個字段,它代表消息的緊急程度。

按嚴重程度由低到高排序:

debug       不包含函數條件或問題的其他信息

info            提供信息的消息

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

notice      具有重要性的普通條件

warning     預警信息

err         阻止工具或某些子系統部分功能實現的錯誤條件

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

alert           需要立即被修改的條件

emerg       該系統不可用

    不同的服務類型有不同的優先級,數值較大的優先級涵蓋數值較小的優先級。如果某個選擇條件只給出了一個優先級而沒有使用任何優先級限定符,對應於這個優先級的消息以及所有更緊急的消息類型都將包括在內。比如說,如果某個選擇條件里的優先級是“warning”,它實際上將把“warning”、 “err”、“crit”、“alert”和“emerg”都包括在內。

    3、操作動作

日志信息可以分別記錄到多個文件里,還可以發送到命名管道、其他程序甚至另一台機器。

syslog 主要支持以下活動:

file                    指定文件的絕對路徑

terminal 或 prin        完全的串行或並行設備標志符

@host(@IP地址)    遠程的日志服務器

 

3)、 搭建Linux日志服務器:

1、編輯/etc/sysconfig/syslog文件,讓服務器能夠接受客戶端傳來的數據:

在“SYSLOGD_OPTIONS”行上加“-r”選項以允許接受外來日志消息。

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

[root@client ~]# vim /etc/sysconfig/syslog

# Options to syslogd

# -m 0 disables 'MARK' messages.

# -r enables logging from remote machines

# -x disables DNS lookups on messages recieved with -r

# See syslogd(8) for more details

SYSLOGD_OPTIONS="-r -m 0"

# Options to klogd

# -2 prints all kernel oops messages twice; once for klogd to decode, and

#    once for processing with 'ksymoops'

# -x disables all klogd processing of oops messages entirely

# See klogd(8) for more details

KLOGD_OPTIONS="-x"

#

SYSLOG_UMASK=077

# set this to a umask value to use for all log files as in umask(1).

# By default, all permissions are removed for "group" and "other".

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

 2、重新啟動syslog守護進程。 

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

[root@client ~]# service syslog restart

關閉內核日志記錄器:                                       [確定]

關閉系統日志記錄器:                                       [確定]

啟動系統日志記錄器:                                       [確定]

啟動內核日志記錄器:                                       [確定]

[root@client ~]#

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

 3、關閉iptables,也可以開啟514端口。本例中我們關閉iptables。

          四、配置各客戶端:

         1、配置/etc/syslog.conf

         修改客戶機/etc/syslog.conf文件,在有關配置行的操作動作部分用一個“@”字符指向日志服務器

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

[root@client ~]# vim /etc/syslog.conf

# Log all kernel messages to the console.

# Logging much else clutters up the screen.

#kern.*                                                 /dev/console

*.*                                                     @10.64.165.210

# The authpriv file has restricted access.

authpriv.*                                              /var/log/secure

……下面省略

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

 另外如果配置了DNS域名的話可以使用域名。

          2、重啟客戶端syslog使設置生效。

檢測成果:

        下圖是我們在客戶端重啟iptables服務后在服務端看到的日志情況:

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

[root@client ~]# cat /var/log/messages |tail

Nov 30 16:44:29 10.64.165.200 kernel: klogd 1.4.1, log source = /proc/kmsg started.

Nov 30 16:44:33 10.64.165.200 kernel: Removing netfilter NETLINK layer.

Nov 30 16:44:33 10.64.165.200 kernel: ip_tables: (C) 2000-2006 Netfilter Core Team

Nov 30 16:44:33 10.64.165.200 kernel: Netfilter messages via NETLINK v0.30.

Nov 30 16:44:33 10.64.165.200 kernel: ip_conntrack version 2.4 (4096 buckets, 32768 max) - 228 bytes per conntrack

 

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


免責聲明!

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



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