轉載一篇syslog-ng的文章的,原本是想打算本身寫一篇的,看到這篇文章寫的很詳細,就轉載過來吧。後面我再補充一下
先說說本身對syslog-ng的理解:用於集中日誌管理,能夠對日誌進行篩選過濾。
原文地址:[url]http://www.linuxfly.org/read.php?171[/url]
前面詳細介紹了sysklog套件的配置和使用。但畢竟該套件已經比較老了,不少功能都不夠完善,而系統日誌又是系統維護中相當重要的參考信息。咱們可使用
syslog-ng(下一代系統日誌工具)來替代原來的sysklog服務。syslog-ng能夠經過對日誌信息執行正規表達式過濾,而且支持主機鏈方式等工做,都能更好的協助咱們管理主機。
1、基礎
syslog-ng做爲syslog的替代工具,能夠徹底替代syslog的服務,而且經過定義規則,實現更好的過濾功能。
系統自帶版本:
引用
# rpm -qa|grep syslog-ng
syslog-ng-1.6.7-1
syslog官方網站:
點擊
最新版本是2.0.5。
爲方便使用,暫以系統自帶的版本1.6.7說明,之後再提供更新的rpm包。
一、前提
使用syslog-ng前,建議先詳細瞭解syslog的概念。
例如,什麼是facitily(設備),level(等級)。能夠參考這裏:
點擊
不然,後面的說明可能會有點不知所云的。
二、使用
若不增長其餘設定,可經過下面的簡單命令便可替換原syslog服務:
# service syslog stop
# service syslog-ng start
三、設計原則
syslog-ng替代syslog是基於如下的設計原則的:
引用
a、經過正規表達式協助,除支持原facitily/level方式,還支持內容過濾等以創建更好的消息過濾機制;
b、支持主機鏈,即便日誌消息通過多重網絡轉發,仍可找到原發出主機的信息和整個消息鏈;
c、支持強大的自定義配置,而且清晰、明瞭。
2、配置說明
syslog-ng的主配置文件存放在:
/etc/syslog-ng/syslog-ng.conf
一、架構
syslog-ng的配置基於下面的架構:
引用
LOG STATEMENTS『SOURCES - FILTERS -DESTINATIONS』
消息路徑 『消息源 - 過濾器 - 目的站』
也就是說,
經過定義多個消息源,把匹配上若干個過濾器的消息導向到指定的目的地,從而組成一個消息路徑。
二、消息源SOURCES
定義格式爲:
引用
source <sourcename> { sourcedriver params; sourcedriver params; ... };
含義:
引用
<sourcename>:一個消息源的標識
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_STREAM unix的套接字,BSD使用/var/run/log;
參數須要使用括號括住。
三、過濾器FILTERS
定義格式爲:
引用
filter <filtername> { expression; };
含義:
引用
<filtername>:一個過濾器標識
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(*)是無效的。
四、目的地DESTINATIONS
定義格式爲:
引用
destination <destname> { destdriver params; destdriver params; ... ;};
含義:
引用
<destname>:一個目的地的標識
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函數的寫法上和消息源驅動器中的定義不一樣。
五、消息路徑LOG STATEMENTS
定義格式爲:
引用
log { source S1; source S2; ... filter F1; filter F2; ... destination
D1; destination D2; ... };
把消息源、過濾器、消息目的組合起來就造成一條完整的指令。日誌路徑中的成員是順序執行的。凡是來源於指定的消息源,匹配全部指定的過濾器,並送到指定的地址。
※一樣的,每條日誌消息都會通過全部的消息路徑,並非匹配後就再也不往下執行的,請留意。
3、選項參數
除了上述的消息路徑定義外,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);
};
4、部分函數的參數
syslog-ng除了有全局選項參數外,不一樣的函數還能夠定義其參數,其中包括:
一、擴展file的宏
引用
HOST 日誌消息的源發主機名。若是日誌消息穿過幾個主機,而且chain_hostname()功能已經打開,就使用第一個主機名。
FACILITY :日誌消息來自的日誌設備
PRIOPRITY/LEVEL :日誌消息的優先級
PROGRAM :發送日誌消息的程序
YEAR :發送日誌消息的年份,這個宏既能夠指定日誌消息送出的時間,也能夠指定日誌消息收到的時間。這由use_time_recvd()選項控制
MONTH :發送日誌消息的月份
DAY :發送日誌消息的日子
HOUR :小時
MIN : 分鐘
SEC :秒
二、file的參數
例如:log_file_size()、sync()、owner()、perm()等,請參考上面的全局設定
三、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文件。
5、關於垃圾收集狀態
當知足必定的條件,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就進入垃圾信息收集狀態的時間。該值應該比較高,以保證正常狀況下不會打斷日誌消息的收取。
6、參考資料
man syslog-ng.confman 8 syslog-ng