1.syslog-ng簡介
在UNIX系統的維護中,經常會忽略系統事件的處理。經常檢查系統日志對於保持系統的安全和正常運行是至關重要的。但是,系統日志中有太多的噪音,一些不是很重要的信息會掩蓋重要的信息。目前的工具很難甄別出系統管理者感興趣的信息。
用戶可以通過指定facility/priority,把消息發到不同的地方。系統預先定義了12+8個(mail、news、auth等)facility,八個不同的優先級(alert到debug)。
這其中存在一個問題,大量的程序使用同樣的facility(daemon),把日志都保存到一個文件中(messages),即使它們毫無關聯。這樣就造成用戶很難篩選出自己感興趣的東西。
第二個問題是,大多數的程序無法改變日志配置,只能修改軟件的源代碼。
因此,使用facility作為過濾不是一個好辦法。最好能夠有一些runtime選項,使用這些選項指定日志facility,建立新的facility。
syslog-ng的一個設計原則就是建立更好的消息過濾粒度。syslog-ng能夠進行基於內容和優先權/facility的過濾。另一個設計原則是更容易進行不同防火牆網段的信息轉發,它支持主機鏈,即使日志消息經過了許多計算機的轉發,也可以找出原發主機地址和整個轉發鏈。最後的一個設計原則就是盡量使配置文件強大和簡潔。
2.消息路徑
一個消息路徑是由一個或者多個日志消息源、一個或者多個過濾規則以及一個或者多個日志消息目的組成的。來自某個日志消息源的消息進入syslog-ng,如果消息命中某條規則,syslog-ng就把它發送到對應的日志消息目的。
消息源
一些日志消息源驅動器(source driver)組成一個消息源,這些驅動器使用給定的方法收集日志消息。譬如,有的syslog()系統調用使用的AF_UNIX、SOCK_STREAM風格的套接字源驅動器。
在配置文件中,你可以使用下面的語法聲明一個日志消息源:
source { source-driver(params); source-driver(params); ... };
identifier是給定消息源的唯一標志,但是這個標志符不能和保留字有沖突。
你可以控制使用哪個驅動器來收集日志消息,因而你需要知道你的系統和他的內部syslogd是如何通訊的。下面介紹一下某些平台中,syslogd是如何工作的。
Linux 一個叫作/dev/log的SOCK_STREAM unix套接字
BSD 一個叫作/var/run/log的SOCK_STREAM unix套接字
Solaris(2.5或以下) 一個叫做/dev/log的SVR4風格的STREAMS設備
solaris(2.6或以上) 除了2.6之前版本使用的STREAMS設備之外,使用了一種新的多線程IPC方法調用門。默認情況下,這個調用門是/etc/syslog_door,由syslogd使用。
在syslog-ng中,每個可能的通訊機制都有對應的日志消息源驅動器。例如:如果要打開一個SOCK_DGRAM風格的UNIX套接字進行通訊,你就會用到unix-dgram驅動器,同樣SOCK_STREAM式的通訊需要unix-stream驅動器。
例2-1.Linux中的一個源指令
source src { unix-stream("/dev/log"); internal(); udp(ip(0.0.0.0) port(514)); };
驅動器可以使用參數,參數有些是必需的,有些是可選的。必需的參數一般在前面。上面的指令中,/dev/log就是必需參數。
下面是可用的源驅動器:
internal syslog-ng內部產生的消息
unix-stream 打開指定的SOCK_STREAM模式的unix套接字,接收日志消息
unix-dgram 打開指定的SOCK_DGRAM模式的unix套接字,接收日志消息
file 打開指定的文件讀取日志信息
pipe,fifo 打開指定的管道或者FIFO設備,讀取日志信息
tcp 在指定的TCP端口接收日志消息
udp 在指定的UDP端口接收日志消息
sun-stream(s) 在solaris系統中,打開一個(多個)指定的STREAM設備,從其中讀取日志消息
在下一章中,我們將詳細介紹每個日志消息源驅動器。
過濾器
在syslog-ng中,過濾器執行日志路由。你可以使用syslog-ng的內部函數編寫布爾表達式,來決定日志信息是否通過。
過濾器也都有唯一的標志符,語法如下:
fileter { eXPression;};
表達式中可以包含邏輯操作符(and、or、not)和函數。
例2-2.一個搜索來自blurp主機,包含deny的日志消息的過濾指令
filter f_blurp_deny { host("blurp") and match("deny"); };
下面是syslog-ng的過濾函數:
facility() 根據設備選擇日志消息
level()或者priority() 根據優先級選擇日志消息
program() 日志消息的程序名是否匹配一個正則表達式
host() 日志消息的主機名是否和一個正則表達式匹配
match() 對日志消息的內容進行正則匹配
filter() 調用另一條過濾規則並判斷它的值
關於這些函數,後面的章節中將有更為詳細的介紹。
有一個特殊的過濾器標志符DEFAULT,用於捕獲所有沒有處理的日志消息。例如:
options { keep_hostname(yes); };
source src { unix-stream("proba2"); internal(); };
destination FTPd { file("ftplog"); };
destination named { file("namedlog"); };
destination daemon { file("daemonlog"); };
filter f_ftpd { match("ftp"); };
filter f_named { match("named"); };
filter f_daemon { facility(daemon); };
log { source(src); filter(f_ftpd); destination(ftpd); };
log { source(src); filter(f_named); destination(named); };
log { source(src); filter(f_daemon); filter(DEFAULT); destination(daemon); };
在這個例子中,default過濾器捕獲所有沒有被f_ftpd和f_named過濾器捕獲的facility是daemon的日志消息。
日志消息目的
destination指定匹配過濾規則的日志消息的去處。和日志消息源類似,日志消息目的可以包括一些目的驅動器,指定日志的派發方向。你需要使用如下語法來聲明日志消息目的:
destination { destination-driver(params); destination-driver(params); ... };
下面是syslog-ng支持的日志消息目的驅動器:
file 日志消息寫到指定的文件
fifo,pipe 把日志消息寫到指定的管道
unix-stream 把日志消息發送到給定的SOCK_STREAM類型的UNIX套接字(Linux)
unix-dgram 把日志消息發送到給定的SOCK_DGRAM類型的UNIX套接字(BSD)
udp 把日志消息發送到指定主機的UDP端口
TCP 把日志消息發送到指定主機的TCP端口
usertty 如果用戶登錄,把日志發送到指定的終端
program fork並啟動指定的程序,把日志消息發送到這個進程的標准輸出。
詳情請參考下面的章節。
日志路徑
前面的章節中,我們學習了如何定義消息源、過濾器和消息目的。現在我們要把這些結合起來形成一條完整的指令。凡是來源於指定的消息源,匹配所有指定的過濾器,並送到指定的地址。其語法如下:
log { source(s1); source(s2); ...
filter(f1); filter(f2); ...
destination(d1); destination(d2); ... };
日志路徑中的成員是順序執行的。
選項
你可以通過設置一些選項來改變syslog-ng的行為。設置選項的語法一般是:
options { option1(params); option2(params); ... };
每個選項也可以有自己的參數。
以下是syslog-ng支持的參數:
名字 參數類型 描述
time_reopen() 數字 一個斷開的連接重新連接之前需要等待的時間
time_reap() 數字 一個閒置的目標文件關閉之前需要等待的時間
sync_freq() 數字 在寫入文件之前,可以緩沖的日志消息行數
mark_freq() 數字 目前尚未實現
log_fifo_size() 數字 輸出隊列的行數
chain_hostnames() yes/no 打開/關閉主機名鏈(用於日志轉發)
use_time_recvd() yes/no 使用收到日志消息的時間,不用日志消息中指定的時間
use_dns() yes/no 打開/關閉DNS查詢功能。因為DNS查詢無法返回會造成syslog-ng處於阻塞狀態,從而造成拒絕服務攻擊。為了避免這種情況的出現,應該使用防火牆嚴格保護使用syslog-ng的網絡節點,並確認syslog-ng使用的所有主機都是可以解析的。
use_fqdn() yes/no 使用完整的域名
gc_idle_threshold() 數字 當syslog-ng空閒時,設置其進入垃圾信息收集狀態的閥值。一旦分配的對象數達到了這個數字,syslog-ng就啟動垃圾信息收集狀態。默認值是1000。
gc_busy_threshold() 數字 當syslog-ng忙時,設置其進入垃圾信息收集狀態的閥值。一旦分配的對象數達到這個數字,syslog-ng就啟動垃圾信息收集狀態。默認值是3000。
每個選項也可以有自己的參數。
以下是syslog-ng支持的參數:
名字 參數類型 描述
time_reopen() 數字 一個斷開的連接重新連接之前需要等待的時間
time_reap() 數字 一個閒置的目標文件關閉之前需要等待的時間
sync_freq() 數字 在寫入文件之前,可以緩沖的日志消息行數
mark_freq() 數字 目前尚未實現
log_fifo_size() 數字 輸出隊列的行數
chain_hostnames() yes/no 打開/關閉主機名鏈(用於日志轉發)
use_time_recvd() yes/no 使用收到日志消息的時間,不用日志消息中指定的時間
use_dns() yes/no 打開/關閉DNS查詢功能。因為DNS查詢無法返回會造成syslog-ng處於阻塞狀態,從而造成拒絕服務攻擊。為了避免這種情況的出現,應該使用防火牆嚴格保護使用syslog-ng的網絡節點,並確認syslog-ng使用的所有主機都是可以解析的。
use_fqdn() yes/no 使用完整的域名
gc_idle_threshold() 數字 當syslog-ng空閒時,設置其進入垃圾信息收集狀態的閥值。一旦分配的對象數達到了這個數字,syslog-ng就啟動垃圾信息收集狀態。默認值是1000。
gc_busy_threshold() 數字 當syslog-ng忙時,設置其進入垃圾信息收集狀態的閥值。一旦分配的對象數達到這個數字,syslog-ng就啟動垃圾信息收集狀態。默認值是3000。