syslog-ng

syslog-ng作為syslog的替代工具,可以完全替代syslog的服務,並且通過定義規則,實現更好的過濾功能。

基礎

系統自帶版本:

引用

# rpm -qa|grep syslog-ng

syslog-ng-1.6.7-1

syslog官方網站:

點擊

最新版本是2.0.5。

為方便使用,暫以系統自帶的版本1.6.7說明,以後再提供更新的rpm包。

1、前提

使用syslog-ng前,建議先詳細了解syslog的概念。

例如,什麼是facility(設備),level(等級)。可以參考這裡:

點擊

否則,後面的說明可能會有點不知所云的。

2、使用

若不增加其他設定,可通過下面的簡單命令即可替換原syslog服務:

# service syslog stop

# service syslog-ng start

3、設計原則

syslog-ng替代syslog是基於以下的設計原則的:

引用

a、通過正規表達式協助,除支持原facility/level方式,還支持內容過濾等以建立更好的訊息過濾機制;

b、支持主機鏈,即使日誌訊息經過多重網路轉發,仍可找到原發出主機的信息和整個訊息鏈;

c、支持強大的自定義配置,並且清晰、明了。

配置說明

syslog-ng的主配置檔案存放在:/etc/syslog-ng/syslog-ng.conf

1、架構

syslog-ng的配置基於下面的架構:

引用

LOG STATEMENTS『SOURCES - FILTERS -DESTINATIONS』

訊息路徑 『訊息源 - 過濾器 - 目的站』

也就是說,通過定義多個訊息源,把匹配上若干個過濾器的訊息導向到指定的目的地,從而組成一個訊息路徑。

2、訊息源SOURCES

定義格式為:

引用

source { sourcedriver params; sourcedriver params; ... };

含義:

引用

:一個訊息源的標識

sourcedriver:訊息源驅動器,可以支持若干參數,並使用分號“;”隔離多個訊息源驅動器

訊息源驅動器有:

引用

file (filename) : 從指定的檔案讀取日誌信息

unix-dgram (filename) : 打開指定的SOCK_DGRAM模式的unix套接字,接收日誌訊息

unix-stream (filename) : 打開指定的SOCK_STREAM模式的unix套接字,接收日誌訊息

udp ( (ip),(port) ) : 在指定的UDP連線埠接收日誌訊息

tcp ( (ip),(port) ) : 在指定的TCP連線埠接收日誌訊息

sun-streams (filename) : 在solaris系統中,打開一個(多個)指定的STREAM設備,從其中讀取日誌訊息

internal() : syslog-ng內部產生的訊息

pipe(filename),fifo(filename) : 從指定的管道或者FIFO設備,讀取日誌信息

例如:

引用

source s_sys {

file ("/proc/kmsg" log_prefix("kernel: "));

unix-stream ("/dev/log");

internal();

# udp(ip(0.0.0.0) port(514)); #如果取消注釋,則可以從udp的514連線埠獲取訊息

};

※linux使用/dev/log作為SOCK_STREAMunix的套接字,BSD使用/var/run/log;

參數需要使用括弧括住。

3、過濾器FILTERS

定義格式為:

引用

filter { expression; };

含義:

引用

:一個過濾器標識

expression:表達式

表達式支持:

引用

邏輯操作符:and(和)、or(或)、not(非);

函式:可使用正規表達式描述內容

過濾函式有:

引用

facility(,): 根據facility(設備)選擇日誌訊息,使用逗號分割多個facility

level(,): 根據level(優先權)選擇日誌訊息,使用逗號分割多個level,或使用“..”表示一個範圍

program(regexp): 日誌訊息的程式名是否匹配一個正則表達式

host(regexp): 日誌訊息的主機名是否和一個正則表達式匹配

match(regexp): 對日誌訊息的內容進行正則匹配

filter(): 調用另一條過濾規則並判斷它的值

例如:

引用

filter f_filter2 { level(info..emerg) and

not facility(mail,authpriv,cron); };

※這裡的level定義info,相當於syslog的.=info,並不包括更低的等級;

若需要包括更低的等級,請使用“..”表示一個等級範圍;

另外,filter(DEFAULT),用於捕獲所有沒有匹配上的日誌訊息。filter(*)是無效的。

4、目的地DESTINATIONS

定義格式為:

引用

destination { destdriver params; destdriver params; ... ;};

含義:

引用

:一個目的地的標識

destdriver :目的地驅動器

目的地驅動器有:

引用

file (filename) :把日誌訊息寫入指定的檔案

unix-dgram (filename) :把日誌訊息寫入指定的SOCK_DGRAM模式的unix套接字

unix-stream (filename) :把日誌訊息寫入指定的SOCK_STREAM模式的unix套接字

udp (ip),(port) :把日誌訊息傳送到指定的UDP連線埠

tcp (ip),(port) :把日誌訊息傳送到指定的TCP連線埠

usertty(username) :把日誌訊息傳送到已經登入的指定用戶終端視窗

pipe(filename),fifo(filename) :把日誌訊息傳送到指定的管道或者FIFO設備

program(parm) :啟動指定的程式,並把日誌訊息傳送到該進程的標準輸入

舉例:

引用

destination d_mesg { file("/var/log/messages"); };

destination d_syslog { udp ("192.168.228.225" port(514)); };

※配合使用udp或tcp即可實現集中的日誌伺服器。注意,udp函式的寫法上和訊息源驅動器中的定義不同。

5、訊息路徑LOG STATEMENTS

定義格式為:

引用

log { source S1; source S2; ... filter F1; filter F2; ... destination

D1; destination D2; ... };

把訊息源、過濾器、訊息目的組合起來就形成一條完整的指令。日誌路徑中的成員是順序執行的。凡是來源於指定的訊息源,匹配所有指定的過濾器,並送到指定的地址。

※同樣的,每條日誌訊息都會經過所有的訊息路徑,並不是匹配後就不再往下執行的,請留意。

選項參數

除了上述的訊息路徑定義外,syslog-ng還可以設定一些選項參數以最佳化其操作。全局的選項參數,定義在配置檔案的開頭位置:

引用

options { opt1; opt2; ... };

選項有:

引用

chain_hostnames(yes|no) :是否打開主機名鏈功能,打開後可在多網路段轉發日誌時有效

long_hostnames(yes|no) :是chain_hostnames的別名,已不建議使用

keep_hostname(yes|no) :是否保留日誌訊息中保存的主機名稱,否時,總是使用來源主機來作重寫日誌的主機名

use_dns(yes|no) :是否打開DNS查詢功能,應使用防火牆保護使用syslog-ng的節點安全,並確認所有主機都是可以通過dns解釋的,否則請關閉該選項。

use_fqdn(yes|no) :是否使用完整的域名

check_hostname(yes|no) :是否檢查主機名有沒有包含不合法的字元

bad_hostname(regexp) :可通過正規表達式指定某主機的信息不被接受

dns_cache(yes|no) :是否打開DNS快取功能

dns_cache_expire(n) :DNS快取功能打開時,一個成功快取的過期時間

dns_cache_expire_failed(n) :DNS快取功能打開時,一個失敗快取的過期時間

dns_cache_size(n) :DNS快取保留的主機名數量

create_dirs(yes|no) :當指定的目標目錄不存在時,是否創建該目錄

dir_owner(uid) :目錄的UID

dir_group(gid) :目錄的GID

dir_perm(perm) :目錄的許可權,使用八進制方式標註,例如0644

owner(uid) :檔案的UID

group(gid) :檔案的GID

perm(perm) :檔案的許可權,同樣,使用八進制方式標註

gc_busy_threshold(n) :當syslog-ng忙時,其進入垃圾信息收集狀態的時間。一旦分派的對象達到這個數字,syslog-ng就啟動垃圾信息收集狀態。默認值是:3000。

gc_idle_threshold(n) :當syslog-ng空閒時,其進入垃圾信息收集狀態的時間。一旦被分派的對象到達這個數字,syslog-ng就會啟動垃圾信息收集狀態,默認值是:100

log_fifo_size(n) :輸出佇列的行數

log_msg_size(n) :訊息日誌的最大值(bytes)

mark(n) :多少時間(秒)寫入兩行MARK信息供參考,目前沒有實現

stats(n) :多少時間(秒)寫入兩行STATUS信息供,默認值是:600

sync(n) :快取多少行的信息再寫入檔案中,0為不快取,局部參數可以覆蓋該值。

time_reap(n) :在沒有訊息前,到達多少秒,即關閉該檔案的連線

time_reopen(n) :對於死連線,到達多少秒,會重新連線

use_time_recvd(yes|no) :宏產生的時間是使用接受到的時間,還是日誌中記錄的時間;建議使用R_的宏代替接收時間,S_的宏代替日誌記錄的時間,而不要依靠該值定義。

例如:

引用

options { sync (0); time_reopen (10); log_fifo_size (1000); long_hostnames (off); use_dns (no); use_fqdn (no); create_dirs (no); keep_hostname (yes);};

部分函式參數

除了有全局選項參數外,不同的函式還可以定義其參數,其中包括:

1、擴展file的宏

引用

HOST 日誌訊息的源發主機名。如果日誌訊息穿過幾個主機,並且chain_hostname()功能已經打開,就使用第一個主機名。 FACILITY :日誌訊息來自的日誌設備 PRIOPRITY/LEVEL :日誌訊息的優先權 PROGRAM :傳送日誌訊息的程式 YEAR :傳送日誌訊息的年份,這個宏既可以指定日誌訊息送出的時間,也可以指定日誌訊息收到的時間。這由use_time_recvd()選項控制 MONTH :傳送日誌訊息的月份 DAY :傳送日誌訊息的日子 HOUR :小時 MIN : 分鐘SEC :秒

2、file的參數

例如:log_file_size()、sync()、owner()、perm()等,請參考上面的全局設定

3、tcp和upd的參數

引用

ip(xxx.xxx.xxx.xxx): 定義綁定的IP位址

port(n):定義綁定的連線埠

max-connections(n) : 定義最大連線數

※TCP基於連線方式傳輸,不會造成日誌丟失,而UDP則不同。但因為傳統的syslog基於UDP的514連線埠,所以,UDP方式也經常會使用到。

另外,514也是rshell的默認連線埠,請注意衝突。

舉例:

引用

destination d_mail { file("/var/log/maillog" sync(10)); };

這裡定義的sync(10)會覆蓋全局配置,表示若寫入的日誌數量達到10,才寫入maillog檔案。

垃圾收集狀態

當滿足一定的條件,syslog-ng即會進入垃圾收集狀態,而暫時不再接受日誌信息。這時,會造成非連線的傳輸協定的日誌丟失(例如UDP)。通過設定下面兩個選項可以控制:

引用

gc_idle_threshold(n) :

意思是,一旦被分派的對象到達這個數字,並且當syslog-ng空閒時(100微秒內沒有日誌訊息到達)。此時,syslog-ng就會啟動垃圾信息收集狀態。

已分配的對象可通過-v命令行參數指定其的最小值。而syslog-ng這個值應該比較小,但比已分配的對象要大即可。

例如,空閒狀態,syslog-ng會顯示:

引用

Nov 13 16:35:35 syslogng syslog-ng[4510]: STATS: dropped 0

Nov 13 16:45:35 syslogng syslog-ng[4510]: STATS: dropped 0

當忙時:

引用

gc_busy_threshold(n) :當syslog-ng忙時,一旦分派的對象達到這個數字,syslog-ng就進入垃圾信息收集狀態的時間。該值應該比較高,以保證正常情況下不會打斷日誌訊息的收取。

局限性

沒有本地快取,當網路故障的時候會丟失日誌。

相關詞條

熱門詞條

聯絡我們