您的位置:首页 > 其它

SUSE syslog-ng 设置

2013-11-19 11:11 183 查看
http://www.suse.url.tw/sles10/lesson9.htm



  作者:陳柏菁E-mail:pachingko@ms96.url.com.tw
[align=left][/align][align=center][b]第九章 系統紀錄檔[/b][/align][align=center][/align]
索引:

9.1 設定 syslogd
9.1.1所需套件及套件內容
9.1.2設定 syslog.conf
9.1.3架設 log server
9.2 設定 syslog-ng
9.2.1syslog-ng 簡介
9.2.2全域選項 ( Options )
9.2.3訊息來源 ( Sources )
9.2.4過濾器 ( Filters )
9.2.5訊息目的 (Destinations)
9.2.6日誌路徑 (Log paths)
9.2.7syslog-ng.cong 設定檔說明
9.3 紀錄檔輪替 (logrotate)
9.3.1紀錄檔輪替的概念
9.3.2設定 logrotate.conf
9.3.3syslog 與 logrotate 的練習範例
9.4 登入的監控 --- /var/log/lastlog/var/run/utmp/var/log/wtmp
 系統的紀錄檔,主要是記載系統的相關重要訊息,藉由分析紀錄檔的內容,管理者可以了解目前系統到底發生過什麼事,甚至可以依據紀錄檔的內容來解決一些錯誤問題的發生,所以一個好的系統管理者應該要有經常檢視紀錄檔的習慣。而系統紀錄檔到底放在哪呢 ? 又每個紀錄檔是如何定義的呢 ? 這就是今天要學習的重點了。

 紀錄檔既然那麼重要,那對於紀錄(寫入)系統或網路服務資訊至紀錄檔的 daemon 就要有所了解。在 sles10 裡預設是使用 syslog-ng 這個 daemon 來進行紀錄的工作,不過也有很多的 distribution 是使用 syslogd,當然您要在 sles10 中使用 syslogd 也是可以的。 以下第一節會先針對 syslogd 做說明,再來第二節才是講解 syslog-ng,最後則是談到有關紀錄檔輪替的概念及登入的監控。9.1 設定 syslogd
9.1.1 所需套件及套件內容

 如您要使用 syslogd 來作為紀錄訊息工具的話,那請先確定 syslogd 這個套件有安裝。再來稍微對 syslogd 的套件內容做個認識:
suse:~ #rpm -ql syslogd
/etc/syslog.confsyslogd 的主要設定檔。當您修改過後需讓 syslogd 重新載入。
/sbin/syslogd   將系統或網路相關服務資訊寫入紀錄檔的主程式 (daemon)。

 syslogd 主要參考的一個檔案就是 /etc/syslog.conf﹔在這個檔案裡,可以設定 "哪一種服務類別出現在哪一種訊息等級的時候,要採取怎樣的動作",至於詳細的設定格式請參考下一小節的說明。9.1.2 設定 syslog.conf

 在 syslog.conf 中的每一筆設定佔用一行,至於設定格式如下:
facility.level     action
 先針對這幾個欄位做個解說:
欄 位說 明
facility代表所要紀錄該服務的訊息類別為何,也就是紀錄的訊息來源是屬於哪方面的訊息。常見的有:
 ˙kern:有關核心所產生的訊息。
˙auth:有關安全事件方面的訊息。
˙authpriv:有關存取控制方面的訊息。
˙cron:有關cron排程服務方面的訊息。
˙mail:有關郵件服務方面的訊息。
˙lpr:有關列印服務方面的訊息。
˙daemon:有些服務系統未分配其專屬的facility時,即可歸類為daemon。
˙syslog:由syslogd所產生的內部訊息。
˙news:有關news服務方面的訊息。
另外 facility 如為「*」,則表示所有的 facility。
level代表的是訊息出現的優先等級 (priority),從最緊急到最輕微的等級依序為:
emerg → alert → crit → err → warning → notice → info → debuglevel 如為「*」,則表示所有的 level ﹔level 如果為「none」,則表示要將此 facility 排除在外。
action表示依照前面設定所產生的訊息,要採取怎樣的紀錄動作。
action 一般最常見的是一個包含完整路徑的檔案,此外也可以是另一台主機名稱 (@hostname)、使用者名稱 (多使用者時可以用「,」做區隔 ) 、終端機或 FIFO file (名稱前面要加上「|」)。
action 如為「*」,則表示 all user。
 對於每一個 facility,您需要分配一個 level 給它,且在 facility 與 level 之間需用 "." 隔開 ﹔如果有兩組 facility (不同的 level) 是使用相同的 action,那麼這兩組 facility 之間需用 ";" 隔開 ﹔ 那萬一有兩個 facility 是使用同一個 level,並採用相同的 action,則這兩個 facility 間需先用 "," 隔開,然後再與 level 間以 "." 做區隔。參考以下的設定格式就知道剛剛在說些什麼:

facility.level             action
facility1.level1;facility2.level2    action
facility1,facility2.level        action
 接著就來看看 syslog.conf 的內容:
suse:~ # vi /etc/syslog.conf
kern.warning;*.err;authpriv.none/dev/tty10
#有關核心的訊息,其訊息等級在 warning 以上 (含 warning),以及所有的訊息其 level
#在 err 以上 (含 err) 時,會將這些訊息顯示在第十個終端機,但存取控制方面的訊息除外。
#您可以按下 Ctrl-Alt-F10 去看看就知了。

*.emerg                *
#所有訊息,只要其 level 是 emerg 的話,馬上通知線上的每一個人。

mail.*                -/var/log/mail
# 有關郵件服務方面的所有訊息,紀錄在 /var/log/mail 檔案內。至於在紀錄檔前面加上
# 個 "-" 符號,其主要作用是為了加快執行效率 (非同步寫入)。

mail.info               -/var/log/mail.info
mail.warning             -/var/log/mail.warn
mail.err                /var/log/mail.err
# 關於 mail 的訊息,其 level 在 info 以上 (含 info) 時紀錄於 /var/log/mail.info 內 ;
# 在 warning以上 (含 warning) 時紀錄於 /var/log/mail.warn 內 ;
# 在 err 以上 (含 err ) 時紀錄於 /var/log/mail.err 內。

news.crit               -/var/log/news/news.crit
news.err               -/var/log/news/news.err
news.notice              -/var/log/news/news.notice
# 有關 news 服務的訊息,其 level 在 crit 以上 (含 crit) 時記載於 /var/log/news/news.crit ;
# 在 err 以上 (含 err ) 時記載於 /var/log/news/news.err ;
# 在 notice 以上 (含 notice ) 時記載於 /var/log/news/news.notice。

*.=warning;*.=err           -/var/log/warn
# 所有的 facility 其 level 剛好是 warning 及 err 時,紀錄於 /var/log/warn 檔案內。

*.crit                 /var/log/warn
# 所有的 facility 其 level 為 crit 以上 (含 crit) 時,紀錄於 /var/log/warn 檔案內。

*.*;mail.none;news.none        -/var/log/messages
# 除了 mail 及 news 服務以外的所有訊息,紀錄在 /var/log/messages。

kern.info;kern.!err          /var/log/kernel
# err 前面加上個 "!" (not),表示不包括 err 以上(含 err)的訊息等級。
# 所以這一行的設定是說有關 kernel 的訊息其 level 在 info 以上(含 info )但不包括
# err 以上(含 err) 時 (即info~warning),紀錄在 /var/log/kernel 檔案內。

mail.*;mail.!=info               /var/log/maillog
# 有關 mail 服務的訊息,除了 level 為 info 外,都紀錄在 /var/log/maillog 檔案內。

local7.*                /var/log/boot.log
# 將開機過程的訊息紀錄在 /var/log/boot.log 檔案內。

cron.*                 /var/log/cron
# 排程方面的訊息也是很重要的,把它設定上去吧 !
 由於 SLES10 預設是啟用 syslog-ng,因此在執行 syslog script 之前,先做兩個動作:

  1. 停止預設的 syslog-ng 服務

suse:~ #rcsyslog stop
  2. 修改 /etc/sysconfig/syslog

suse:~ # vi /etc/sysconfig/syslog
SYSLOG_DAEMON="syslogd"# 這是指定提供 syslog 服務的 daemon 為 syslogd,而非原本的 syslog-ng 。
 完成以上兩個步驟後,就可使用以下兩種方式啟用 syslogd:

suse:~ #rcsyslog start
suse:~ #/etc/init.d/syslog start
 要是將來修改了 syslog.conf 後,請記得採用以下任何一種方式來讓 syslogd 重新載入 syslog.conf:

suse:~ #/etc/init.d/syslog restart
suse:~ #/etc/init.d/syslog reload
suse:~ #rcsyslog restart
suse:~ #rcsyslog reload
9.1.3 架設 log (syslogd) server

 由於紀錄檔非常的重要,所以有些企業會專門設定一台 log(syslogd) server 來集中管理所有主機的相關紀錄,尤其當手邊的 Unix-Like 主機為數眾多的時候,更會想要將這些紀錄集中管理及分析。至於詳細的做法不難,請看以下的步驟:在 server 部分,請先將 syslog.conf 檔案搞定,可參考剛剛的設定內容。

修改 /etc/sysconfig/syslog,找到 "SYSLOGD_PARAMS" 參數,並於其後補上 -r 參數:

suse:~ # vi /etc/sysconfig/syslog
SYSLOGD_PARAMS="-r"
重新啟動 syslogd:

suse:~ # rcsyslog restart
做個確認:

suse:~ # netstat -anp | grep :514
udp 0 0  :::514  :::*
看到那個 514 port 就對了,至於 netstat 指令在網路部分再詳談。

server 端搞定後,換 client 端的設定,您只要將 client 端的 syslog.conf 裡,所有的 action 都指向這台 log server 就行了,比如:

cron.*    @server.test.com.tw
修改完畢後,也請記得重新啟動 syslogd 噢。

9.2 設定syslog-ng

9.2.1 syslog-ng 簡介 目前絕大部分的人,還是習慣使用傳統的 syslogd,不過 syslogd 在使用上可能或多或少會給您帶來一些些的不方便,比方說,一個紀錄檔內可能會包含著大量的各種訊息紀錄,因此要查詢某些特定訊息時,往往就要找上個老半天,且過多訊息的存在,容易造成一些不是很重要的訊息會掩蓋掉重要的訊息,所以說傳統的 syslogd 很難讓系統管理者去選擇他所感興趣的訊息紀錄。此時想到的一個比較好的替代方案,就是以 syslog-ng ( syslog new generation ) 來取代 syslogd。 syslog-ng 的一個設計原則之一,就是建立更好的訊息過濾細膩度 ﹔syslog-ng 除了具有傳統的 syslogd 之基本功能外,還能針對訊息內容來自訂過濾條件,並且可以把所過濾出來的訊息送到指定的目的。而設計原則之二,則是更容易進行訊息的轉送,它支援主機鏈 (chain_hostnames),即使紀錄訊息經過了許多主機的轉送,也可以找出轉送訊息的原始主機和所有處理過這個訊息的主機名稱。 另外在學習 syslog-ng 時,最好能先建立對訊息路徑 (Message paths) 的觀念,因此這裡就先概略說一下。Message paths 是由一個或者多個日誌消息來源、一個或者多個過濾規則以及一個或者多個日誌消息目的所組成的,當某個訊息來源之訊息進入了 syslog-ng 後,如果這些訊息符合過濾規則,syslog-ng 就把這些訊息送到相對應之目的。

 接著來看看 syslog-ng 的套件內容:
suse:~ # rpm -ql syslog-ng
/etc/logrotate.d/syslog-ng設定紀錄檔輪替的檔案。
/etc/syslog-ng/syslog-ng.confsyslog-ng 主要參考的檔案。
/sbin/syslog-ng將系統或網路相關服務資訊寫入紀錄檔的daemon。
 syslog-ng.conf 設定檔內容是由五個部分所組成,即 options {}、source {}、filter {}、destination {}、log {} 這五大區段。options {} 裡所設定的是全域 (global) 選項,其中有部分選項可以套用在其它設定區段中,但若兩個地方的設定起衝突時,則是會以其它設定區段裡頭的設定為主。以下各小節就分別針對這幾個區段來做說明。9.2.2 全域選項 ( Options ) 透過 options 敘述中所指定的全域選項,可改變 syslog-ng 的預設行為。至於其基本設定語法如下:
options { option1(params); option2(params); ... };
 options1、options2 即所謂的全域選項,至於 ( ) 內則是該選項可接受之參數值。另外每個全域選項之後需以分號做結束。

syslog-ng 所支援的全域選項一覽表
[align=center]選項名稱[/align][align=center]可接受之值[/align][align=center]簡 單 描 述[/align]
[align=center]chain_hostnames( )[/align][align=center]yes 或 no[/align]是否要將訊息傳送過程所經過的所有主機都給它紀錄下來。預設為 yes。
[align=center]long_hostnames( )[/align][align=center]yes 或 no[/align]為 chain_hostnames 的別名,所以用哪個做設定都行。
[align=center]keep_hostname( )[/align][align=center]yes 或 no[/align]是否要改寫主機名稱。當設定成 yes 時,表示會保留原始紀錄檔內的主機名稱。預設 為 no。
[align=center]use_dns( )[/align][align=center]yes 或 no[/align]是否要透過 DNS 來反解出來源 IP 所對應的主機名稱。請留意 use_dns 只會針對訊息最前頭的那台主機,以指出此訊息是哪台主機所送出的。預設為 yes。
[align=center]use_fqdn( )[/align][align=center]yes 或 no[/align]是否要紀錄完整的主機名稱。預設為 no。
[align=center]use_time_recvd( )[/align][align=center]yes 或 no[/align]是否要將訊息中的時間戳記在傳送過程中保留住。當設定成 yes 時,syslog-ng 會把訊息中的時間戳記改成本地端收到訊息的時間。預設為 no。
[align=center]sync( )[/align][align=center]number[/align]設定在訊息紀錄寫入檔案之前,有多少訊息數要先被放在緩衝區內作快取。預設為 0。
[align=center]log_fifo_size( )[/align][align=center]number[/align]當 syslog-ng 過於忙碌時,會先將訊息暫存在佇列中來等待處理,而此選項就是用來設定可以存放在佇列中的訊息數目 ﹔當佇列滿時,新進的訊息將會被丟棄掉。預設為 100。
[align=center]stats( )[/align][align=center]number[/align]設定每隔多久時間統計一次被丟棄的訊息數。預設為 10 分鐘 (600 秒)。
[align=center]create_dirs( )[/align][align=center]yes 或 no[/align]如果紀錄檔所處的目錄不存在,是否要建立。預設為 yes。
[align=center]dir_owner( )[/align][align=center]username[/align]指定所建立目錄的擁有者。預設為 root。
[align=center]dir_group( )[/align][align=center]groupname[/align]指定所建立目錄的擁有群組。預設為root。
[align=center]dir_perm( )[/align][align=center]perm value[/align]指定所建立目錄的權限。預設為 0700。
[align=center]owner( )[/align][align=center]username[/align]syslog-ng 所建立檔案的擁有者。預設為 root。
[align=center]group( )[/align][align=center]groupname[/align]syslog-ng 所建立檔案的擁有群組。預設為 root。
[align=center]perm( )[/align][align=center]perm value[/align]syslog-ng 所建立檔案的權限。預設為 0600。
[align=center]time_reopen( )[/align][align=center]number[/align]當連線斷掉後,需間隔多少秒才能再重新連線。預設為 60 秒。

範例

options { long_hostnames(no); use_time_recvd(yes);
     stats(43200); log_fifo_size(200);
};

探討 long_hostnames( )、keep_hostname( )

 當進行訊息紀錄轉送時,log server 上的 syslog-ng 在預設情況下,會去改寫所收到訊息內的主機名稱 [ keep_hostname(no) ],接著 syslog-ng 會檢查 long_hostnames ( chain_hostnames ) 是否設定為 yes,如果是的話,則 syslog-ng 會把傳送訊息給它的這台來源主機名稱附加在訊息中的主機名稱之後 (比如 server1/server2),否則會把訊息內原本的主機名稱替換掉。【範例說明】 假使現在有三台主機透過 DNS 解析的結果如下: 192.168.1.1 ( server1 )、192.168.1.2 ( server2 )、192.168.1.3 ( server3 ),其中 server1 原本的主機名稱是 linux (根據 /etc/HOSTNAME),而在 linux 主機上所產生的訊息會傳送到 server2,接著 server2 再把訊息傳給 server3,參考一下架構圖:

 如果現在 Client 端對 server1 進行 ssh 遠端連線,則每一部 server 紀錄檔內之訊息,所顯示的主機名稱如下表所示:

在上表中所看到的 src,是 syslog-ng.conf 中設定 source 時所使用的識別字 ( identifier )。
9.2.3 訊息來源 ( Sources ) 訊息來源 (source) 是由一些訊息來源驅動器 (source drivers) 所組成。為了宣告一個訊息來源,必須在設定檔中使用 source 敘述,其設定語法如下:
source <identifier> { source-driver(params);source-driver(params);… } ;
 首先 identifier 必須是所給的訊息來源中唯一的識別字,而這個識別字不能和任何的保留字有所衝突。再來其後就是指定您要使用的 source-driver,這將決定未來所要收集的訊息紀錄為何。

 接著先補充一下系統和 syslogd 進行通訊的方式,了解了它們之間的互動後,會有助於您對 syslog-ng 更進一步的認識。

syslogd 跟系統之間的通訊方式:
[align=center]使用平台[/align][align=center]通  訊  方  式[/align]
[align=center]Linux[/align]使用 /dev/log 這個具 SOCK_STREAM 風格的 UNIX socket。所謂的 socket file,一般是指在 unix 系統上,用來跟網路相關服務做互動的一個特殊檔案,它可以作為網路資料溝通的一個承接口。而實際上,socket 是具有連線導向與無連線導向的分別。
[align=center]BSD[/align]使用 /var/run/log 這個具 SOCK_DGRAM 風格的 UNIX socket。
 在 syslog-ng 中,每個可能的通訊機制會有相對應的 source driver。比如要打開一個具有 SOCK_DGRAM 風格的 UNIX socket 進行通訊時,就必須使用 unix-dgram 這個 source driver,同樣的道理,在 Linux 中要打開具 SOCK_STREAM 風格的 UNIX socket 進行通訊,就會使用到 unix-stream 這個 source driver 。 每個 driver 可以攜帶一些參數,而有些參數是必要的,有些參數則是選擇性的。必要的參數是有其位置性的,此乃意味著他們需按規定的順序來被指派。unix-stream 及 unix-dgram driver 都必須指派一個必要參數,此必要參數就是指 socket file ,至於其他選擇性的參數就放在 socket file 之後。選擇性參數可按任何順序來指派。syslog-ng 中,可利用的 source drivers:

[align=center]來源驅動器[/align][align=left]簡  單  描  述[/align]
[align=center]internal( )[/align]syslog-ng 內部產生的訊息。
[align=center]unix-stream( )[/align]讀取所指定的 socket file 訊息 (SOCK_STREAM)。
[align=center]unix-dgram( )[/align]讀取所指定的 socket file 訊息 (SOCK_DGRAM)。
[align=center]file( )[/align]讀取特殊檔案 (非一般文字檔,如 /proc/kmsg) 的訊息資料。
[align=center]pipe( ),fifo( )[/align]讀取所指定的 pipe file 訊息。
[align=center]tcp( )[/align]在指定的本機 TCP port 及介面位址監聽訊息。
[align=center]udp( )[/align]在指定的本機 UDP port 及介面位址監聽訊息。
[align=center]sun-stream( )[/align]在 solaris系統上,打開指定的 STREAMS 裝置,並讀取其內之訊息。
 接著以下會針對部分 source driver 做個探討。



unix-stream( ) 及 unix-dgram( )

 這兩個 source driver 剛剛已介紹過,不過要留意核心如果是在 2.4.0 版以後,則應該對 /dev/log 這個 socket 使用 unix-dgram,如指定成 unix-stream,反而會無法取得核心的訊息。最後來補充一下它們可使用的選項。

unix-stream 及 unix-dgram 可利用之選項:


[align=center]選項名稱[/align][align=center]可設定之值[/align][align=center]簡  單  描  述[/align]
[align=center]owner( )[/align][align=center]username[/align]設定 socket file 的擁有者。預設為 root。
[align=center]group( )[/align][align=center]groupname[/align]設定 socket file 的擁有群組。預設為 root。
[align=center]perm( )[/align][align=center]perm value[/align]設定 socket file 的權限。預設為 0666。
[align=center]max-connections( )[/align][align=center]number[/align]限定同時間能允許的串流連線數。另外此選項只能用於 unix-stream( ) 之中。預設為 10。


tcp( ) 及 udp( )


 先來看看 tcp( ) 及 udp( ) 這兩個 source driver 的宣告方式:
tcp([options]) ;
udp([options]) ;
 options 就是指那些可以提供給 tcp( ) 或 udp( ) 來使用的選項。

tcp( ) 及 udp( ) 可使用之選項

[align=center]選項名稱[/align][align=center]可設定之值[/align][align=center]簡  單  描  述[/align]
[align=center]ip( ) 或 localip( )[/align][align=center]IP 位址[/align]擔任 log server 的主機所要監聽的介面位址。預設為 0.0.0.0。
[align=center]port( ) 或 localport( )[/align][align=center]Port number[/align]擔任 log server 的主機所要監聽的 port number。預設為 514 port。
[align=center]max-connections( )[/align][align=center]number[/align]這是同時間最大連線數的限定 ﹔另外此選項只能用於 tcp( ) 的來源中。預設為 10。
範例
source src { unix-stream("/dev/log" max-connections(100));
       internal();
       udp(ip(0.0.0.0) port(514));
};
9.2.4 過濾器 ( Filters ) 透過 filter 的設定,可以讓我們對訊息來源做進一步的過濾,並將其分門別類的做控管,以期能更準確地處理系統訊息。過濾器也都有唯一的識別符號,語法如下:
filter <identifier> { expression ; } ;
 expression 中,可以使用 syslog-ng 的內部函式來編寫布林表示式,意即可把這些內部函式來搭配 and、or 及 not 等邏輯運算子,而組合成多個過濾條件,以決定是否要讓日誌訊息通過。使用在 filter 敘述中的過濾函式

[align=center]過 濾 函 式[/align][align=center]使 用 方 法[/align][align=left]簡 單 描 述[/align]
[align=center]facility( )[/align][align=center]facility(facility[,facility])[/align]比對訊息來源的服務類型 (facility)。常見的 facility 有 auth、authpriv、cron、daemon、kern、lpr、mail、news、syslog、user、local{0-7}、* 等。
[align=center]level( ) 或 priority( )[/align][align=center]level(pri[,pri1..pri2])[/align]依照訊息的優先等級來做比對。level 有 none、debug、info、notice、warn、err、crit、alert、emerg、* 等。
[align=center]program( )[/align][align=center]program(regexp)[/align]使用正規表示法來與紀錄訊息中的程式名稱欄位做比對。
[align=center]host( )[/align][align=center]host(regexp)[/align]使用正規表示法來與紀錄訊息中的主機名稱欄位做比對。
[align=center]match( )[/align][align=center]match(regexp)[/align]使用正規表示法來與紀錄訊息做比對。
[align=center]filter( )[/align][align=center]filter(filtername)[/align]呼叫另外一個已存在的 filter 來使用。
[align=center]netmask( )[/align][align=center]netmask(ip/mask)[/align]檢查來源端的 IP 是否在指定的子網路中。
範例
filter f_message { level(info .. err) and not facility(cron,mail,news) or match("deny") ; } ;
 這裡定義了一個 filter 叫 f_messages,其所代表的過濾條件為:除了 cron、mail、news 以外的其他 facility,其 level 是在 info ~ err 層級者,或者訊息中包含 "deny" 這個字串的話,都是符合過濾條件的訊息。

9.2.5 訊息目的 (Destinations) 訊息目的是指當訊息來源 (sources) 被過濾器 (filters) 做規則比對後,把那些符合比對規則的訊息,要送往到哪裡的意思。 destination 可以是一般檔案、命名通道 ( pipe )、tty 或另一台主機。

 與 sources 相同,destination 也是包含一個或多個目的驅動器 (destination drivers),如此方可曉得要把指定的訊息送往何處。在設定檔內,需使用如下的 destination 敘述:
destination <identifier> { destination-driver(params) ; destination-driver(params) ; ... } ;
syslog-ng 中,可利用的 destination drivers
[align=center]目的驅動器[/align][align=left]簡  單  描  述[/align]
[align=center]file( )[/align]寫入訊息至所指定的檔案。
[align=center]pipe( ) , fifo( )[/align]寫入訊息至所指定的 pipe file。
[align=center]unix-stream( )[/align]送出訊息至所指定的 socket file (SOCK_STREAM)。
[align=center]unix-dgram( )[/align]送出訊息至所指定的 socket file (SOCK_DGRAM)。
[align=center]udp( )[/align]送出訊息至所指定主機的 UDP port。
[align=center]tcp( )[/align]送出訊息至所指定主機的 TCP port。
[align=center]usertty( )[/align]如果使用者登入時,送出訊息給該指定的使用者 (即時線上通知)。
[align=center]program( )[/align]送出訊息至所指定程式的標準輸入。
 另外在 destination 敘述中,file( ) 內所指定的檔案名稱,可利用巨集 (參考下表) 來對此檔名做擴展。

可使用之巨集一覽表:


[align=center]巨集名稱[/align][align=left]用 法 描 述[/align]
[align=center]PROGRAM[/align]指定送出訊息的程式名稱為何。
[align=center]FACILITY[/align]訊息類型的名稱。
[align=center]PRIORITY(LEVEL)[/align]訊息的優先等級。
[align=center]YEAR[/align]訊息被送出時的年份。
[align=center]MONTH[/align]訊息被送出時的月份。
[align=center]WEEKDAY[/align]訊息被送出時是星期幾。
[align=center]DAY[/align]訊息是在幾號被送出的。
[align=center]HOUR[/align]訊息是在幾點被送出的。
[align=center]MIN[/align]訊息是在幾分被送出的。
[align=center]HOST[/align]訊息來源的主機名稱。
Note:時間巨集所顯示的時間,有可能是使用紀錄檔中原始訊息的時間,或 log server 接收到這個訊息的時間,因為它會受到 use_time_recvd( ) 這個選項的控制。另外當訊息經過好幾台主機時,則 HOST 巨集所產生的主機名稱,將會受到 chain_hostnames( ) 這個選項的影響,如果是 chain_hostnames(yes),則會使用第一台主機名稱。
範例
destination d_day { file("/var/log/messages.$DAY"); };
destination dhost { udp("192.168.1.155" port(514)); };
9.2.6 日誌路徑 (Log paths) 從前面的介紹已經可以了解要如何定義 sources、filters 及 destinations,所以接著就可以利用 log 敘述來把他們給做個組合。log 敘述的語法如下:
log { source(s1) ; source(s2) ; ...
   filter(f1) ; filter(f2) ; ...
   destination(d1) ; destination(d2) ; ...
   flags(flag1[,flag2…] ) ; } ;
 上面的 log 敘述應該蠻容易理解的,每個 source、filter 及 destination 後的 s1、f1、d1、…,就是把剛剛所宣告的 identifier 套用進去而已,這樣就可以先根據所指定的 source 去讀取訊息,再依 filter 進行訊息過濾,最後才把這些過濾後的訊息送往 destination 所指定的目的。 設定檔內一定會存在著好幾筆的 log 敘述,而在預設的情況下,這些 log 敘述將會依照他們在設定檔中出現的位置來依序執行,因此,同一筆訊息紀錄有可能會被送往相同或不同的目的好幾次,如以目的為紀錄檔來說,則同一紀錄檔內也許會存在著重複的記錄,或者不同紀錄檔中有可能會存在相同的訊息紀錄 ﹔而這個預設的行為,將可以藉由 flags( ) 的設定而改變。比如您在某個 log 敘述中使用了 flags(final) 這個旗標時,表示在將此次訊息輸出至指定的目的後,爾後就不再處理這個訊息了。範例
source src {
   internal( );
   unix-dgram("/dev/log");
};

filter f_mailinfo { level(info) and facility(mail); };
filter f_mail { facility(mail); };
filter f_messages { not facility(news); };

destination mailinfo { file("/var/log/mail.info"); };
log { source(src); filter(f_mailinfo); destination(mailinfo); };

destination mail { file("/var/log/mail"); };
log { source(src); filter(f_mail); destination(mail); };

destination messages { file("/var/log/messages"); };
log { source(src); filter(f_messages); destination(messages); };
 以上面的設定內容來說,假使現在執行 "rcpostfix restart" 之後,則此郵件服務重新啟動的訊息,將會記錄在 /var/log/mail.info、/var/log/mail、/var/log/messages 這三個檔案中。倘若修改一下第二個 log 敘述成:
log { source(src); filter(f_mail); destination(mail);flags(final);};
則此訊息在這個地方將是最後一次被紀錄,因此郵件服務重新啟動的訊息,只會出現在 /var/log/mail.info 及 /var/log/mail 中,而不會出現在 /var/log/messages 裡。

9.2.7 syslog-ng.cong 設定檔說明

 了解了前面幾小節所提的觀念後,最後就來看看 syslog-ng.conf 的設定內容,不過只針對幾個要點來說明。

suse:~ # vi /etc/syslog-ng/syslog-ng.conf

####################### Global options#########################


options { long_hostnames(off); sync(0); perm(0640); stats(3600); };

####################source my_src { .... };#####################

source src {
# include internal syslog-ng messages
# note: the internal() soure is required!

   internal();

# the following line will be replaced by the
# socket list generated by SuSEconfig using
# variables from /etc/sysconfig/syslog:

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

# uncomment to process log messages from network:
#udp(ip("0.0.0.0") port(514));
#若欲讓此台主機擔任 log server,則可把上一行的註解拿掉,以接受網路上
#其他主機所傳來的訊息紀錄。
};

####################### Filter definitions#######################

filter f_iptables  { facility(kern) and match("IN=") and match("OUT="); };#此 filter 用來過濾核心訊息中,同時包含有 " IN= " 及 " OUT= " 這些字串之所有核心訊息。filter f_console   { level(warn) and facility(kern) and not filter(f_iptables)
            or level(err) and not facility(authpriv); };# 此 filter 用來過濾核心訊息之 level 為 warn ( 不包括 f_iptables 的過濾訊息) 者,
#或所有 facility (不包括 authpriv ) 其 level 為 err 者。
# 以下 filter 的過濾條件都很好理解,這裡就不再說明了。filter f_newsnotice { level(notice) and facility(news); };
filter f_newscrit  { level(crit) and facility(news); };
filter f_newserr   { level(err) and facility(news); };
filter f_news     { facility(news); };
filter f_mailinfo  { level(info) and facility(mail); };
filter f_mailwarn  { level(warn) and facility(mail); };
filter f_mailerr   { level(err, crit) and facility(mail); };
filter f_mail    { facility(mail); };
filter f_cron    { facility(cron); };
filter f_local    { facility(local0, local1, local2, local3,
                   local4, local5, local6, local7); };
filter f_acpid    { match('^\[acpid\]:'); };
filter f_netmgm   { match('^NetworkManager:'); };
filter f_messages  { not facility(news,mail) and not filter(f_iptables); };
filter f_warn    { level(warn, err, crit) and not filter(f_iptables); };
filter f_alert    { level(alert); };
##### Most warning and errors on tty10 and on the xconsole pipe: #####

destination console { file("/dev/tty10" group(tty) perm(0620)); };# 這個 destination,是要把訊息記錄到第十個終端機,並指定 /dev/tty10 的擁有群組為 tty,
# 權限是 0620。
log { source(src); filter(f_console); destination(console); };#將 src 所定義的訊息來源,經 f_console 做訊息過濾後,再將此訊息輸出至 tty10。
destination xconsole { pipe("/dev/xconsole" group(tty) perm(0400)); };
log { source(src); filter(f_console); destination(xconsole); };
###################root is informed immediately###################

# destination root { usertty("root"); };
#此 destination 會把訊息送至 root 的 console。

# log { source(src); filter(f_alert); destination(root); };
#將 src 所定義的訊息來源,經 f_alert 做訊息過濾後,再送往 root 的 console。################Mail-messages in separate files:################

destination mailinfo { file("/var/log/mail.info"); };
log { source(src); filter(f_mailinfo); destination(mailinfo); };
destination mailwarn { file("/var/log/mail.warn"); };
log { source(src); filter(f_mailwarn); destination(mailwarn); };
destination mailerr { file("/var/log/mail.err" fsync(yes)); };
log { source(src); filter(f_mailerr); destination(mailerr); };

# and also all in one file:

destination mail { file("/var/log/mail"); };
log { source(src); filter(f_mail); destination(mail); };

################### acpid messages in one file:###################

destination acpid { file("/var/log/acpid"); };
log { source(src); filter(f_acpid); destination(acpid); flags(final); };# 應該還記得 final 的意思吧,不太記得的話,回過頭複習複習。
############### NetworkManager messages in one file:##############

destination netmgm { file("/var/log/NetworkManager"); };
log { source(src); filter(f_netmgm); destination(netmgm); flags(final); };

####################Cron-messages in one file:####################
# (don't forget to provide logrotation config)

# destination cron { file("/var/log/cron"); };
# log { source(src); filter(f_cron); destination(cron); };
##############Some boot scripts use/require local[1-7]:##############

destination localmessages { file("/var/log/localmessages"); };
log { source(src); filter(f_local); destination(localmessages); };

####All messages except iptables and the facilities news and mail:####

destination messages { file("/var/log/messages"); };
log { source(src); filter(f_messages); destination(messages); };

##############Firewall (iptables) messages in one file:##############

destination firewall { file("/var/log/firewall"); };
log { source(src); filter(f_iptables); destination(firewall); };

###############Warnings (except iptables) in one file:###############

destination warn { file("/var/log/warn" fsync(yes)); };
log { source(src); filter(f_warn); destination(warn); };

###################keep all messages in one file:###################
# (don't forget to provide logrotation config)

# destination allmessages { file("/var/log/allmessages"); };
# log { source(src); destination(allmessages); };
 修改了 syslog-ng.conf 後,請記得重新啟動 syslog-ng。
suse:~ # rcsyslog restart
 不過如果之前您有按照第一節 syslogd 設定方式而修改過 /etc/sysconfig/syslog 的話,那請先執行 "rcsyslog stop" ,然後把 /etc/sysconfig/syslog 改回原來的預設值:
suse:~ # vi /etc/sysconfig/syslog
SYSLOG_DAEMON="syslogd-ng"
SYSLOGD_PARAMS=""
 最後再啟動 syslog-ng 即可:
suse:~ # rcsyslog start
9.3 紀錄檔輪替( logrotate )

9.3.1 紀錄檔輪替的概念

 在了解紀錄檔的重要性後,不知大家有沒有想過一個問題,系統的紀錄檔每天記載那麼多資訊,且這個動作一直持續著在進行著,那會不會哪天把整顆硬碟給塞爆了呢 ? 答案是否定的,因為系統每天都會交由 /usr/sbin/logrotate 這支程式去讀取 /etc/logrotate.conf 檔案,而 logrotate.conf 檔案的內容,主要就是關於紀錄檔輪替方面的設定。

 何謂輪替呢 ? 以 /var/log/mail 紀錄檔來說,假使我們設定一週執行一次輪替,又輪替檔 (紀錄檔在經過輪替後所產生的檔案) 數目最多三個,則當執行第一次紀錄檔輪替時,mail 會變成 mail.1,也就是 mail.1 的內容就是之前 mail 的內容,緊接著系統就會再製造另一個新的空的 mail 檔案出來 ﹔執行第二次輪替時,mail.1 會變成 mail.2,mail 變成 mail.1,然後再 create 一個新的 mail 檔案 ﹔而在執行第三次輪替後就會有 mail.1、mail.2、mail.3 等三個輪替檔 (紀錄檔的備份) ﹔接著在執行第四次輪替時,由於當初設定輪替檔最多只能有三個,所以 mail.3 就會先被移除,然後 mail.2 變 mail.3, mail.1 變 mail.2,mail 變 mail.1。按照這個輪替原理來推算的話,就算今天進行第一百次輪替時,輪替檔數目還是只有三個,所以不會讓紀錄檔的內容一直持續成長下去。

  一開始不是有提到 logrotate 程式每天都會載入 logrotate.conf 嗎,從哪可看得出來呢 ? 找找看在 /etc/cron.daily 目錄下是不是有個叫 logrotate 的 script,再看看其內容:
suse:~ #cat /etc/cron.daily/logrotate
#!/bin/sh

TMPF=`mktemp /tmp/logrotate.XXXXXXXXXX`

/usr/sbin/logrotate /etc/logrotate.conf 2>&1 | tee $TMPF
EXITVALUE=${PIPESTATUS[0]}

if [ $EXITVALUE != 0 ]; then
 # wait a sec, we might just have restarted syslog
 sleep 1
 # tell what went wrong
 /bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
 /bin/logger -t logrotate -f $TMPF
fi

rm -f $TMPF
exit 0
 這個意思是說當這支 script 在執行時, logrotate 程式會載入 /etc/logrotate.conf 檔案,而當執行有誤時 (即退出值為非 0),在紀錄檔 /var/log/messages 內就會出現 "logrotate: ALERT exited abnormally with [127]" 這一類的訊息。

9.3.2 設定 logrotate.conf

 有了紀錄檔輪替的概念之後,接著就來介紹紀錄檔輪替的主要設定檔內容:

suse:~ # vi /etc/logrotate.conf

# see "man logrotate" for details
# rotate log files weekly
weekly
# 設定紀錄檔每週執行一次輪替。
# 您還可以使用 daily (每天輪替) 及 monthly (每月輪替) 去做設定。

# keep 4 weeks worth of backlogs
rotate 4
# 保持四個輪替檔 (備份的紀錄檔),也就是說您最多只能產生四個輪替檔啦。
# create new (empty) log files after rotating old ones
create
# 紀錄檔進行輪替後,會建立一個新的、空的紀錄檔出來。

# uncomment this if you want your log files compressed
#compress
# 紀錄檔輪替後所產生的輪替檔要不要壓縮 (預設是採 gzip 壓縮),
# 如果要的話,就將註解拿掉。
# uncomment these to switch compression to bzip2
compresscmd /usr/bin/bzip2
uncompresscmd /usr/bin/bunzip2
# 當 compress 參數被指定的前提下,將輪替檔改採 bzip2 壓縮。
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
# 這行設定的主要意思是說,在 /etc/logrotate.d/ 目錄下的所有檔案都一併會被讀入。

# 在剛剛前面介紹過的那些參數是屬於 global 參數,而位於 /etc/logrotate.d 下的檔案中,
# 如果有未設定到的參數,則會套用 global 的參數,當兩個地方的設定參數起衝突時,
# 是以 /etc/logrotate.d 目錄下的檔案為主。

# no packages own wtmp -- we'll rotate them here
#/var/log/wtmp {
# monthly
# create 0664 root utmp
# rotate 1
#}
# 您也可以把紀錄檔的輪替設定在這裡。至於此處的設定是說/var/log/wtmp 紀錄檔會
# 每個月輪替一次,且在輪替後所產生的新紀錄檔,其權限為 664,擁有者及擁有群組
# 為 root 及 utmp,並且最多只能有一個紀錄檔的備份。
# system-specific logs may be also be configured here.
 緊接著就來探討一下剛剛提到的 /etc/logrotate.d 中,那些檔案裡怎麼設定紀錄檔方面的輪替:

suse:~ #vi /etc/logrotate.d/syslog
/var/log/warn /var/log/messages /var/log/allmessages /var/log/localmessages /var/log/firewall {
 compress 
 dateext 
 maxage 365 
 rotate 99 
 missingok 
notifempty
 size +4096k 
 create 640 root root 
 sharedscripts 
 postrotate 
  /etc/init.d/syslog reload 
 endscript
}
 首先您需先指出要設定輪替的紀錄檔有哪些,當要對多個紀錄檔做相同輪替方面的設定時,每個紀錄檔間需以空白字元隔開,然後再把輪替方面的相關參數設定在 { } 內。以下就針對這些參數做說明。


compress
紀錄檔輪替後要壓縮,不過此處非採 gzip 壓縮噢,因為 global 處已經指定使用 bzip2 壓縮了。

dateext
將輪替檔檔名中的數字,改成以時間格式來顯示,如 mail-20070125.bz2。

maxage 365
移除 365 天以前的輪替檔。

rotate 99
最多能有 99 個輪替檔 (紀錄檔備份)。

missingok
輪替時如果紀錄檔不存在,不需提示任何訊息。預設為 nomissingok。

notifempty
如果紀錄檔是空的,不進行輪替。預設為 ifempty。

size +4096k
當紀錄檔大小超過 4096 k 時才進行輪替。您亦可使用 M 來做單位,若不指定單位則為 bytes。

create 640 root root
輪替後所產生的新紀錄檔,其權限為 640,擁有者及擁有群組皆為 root。

sharedscripts
如果有多個紀錄檔同時被輪替時,則介於 postrotate 及 endscript 之間的程式,
只執行一次即可。

postrotate
紀錄檔輪替後,會執行位於 postrotate 及 endscript 之間的程式。而這裡是設定輪替後執行 "/etc/init.d/syslog reload",至於執行這個動作的主要目的,是因為輪替後會產生一個新的紀錄檔,因此要讓 syslogd ( syslog-ng ) 重新認識這個新檔案才行。
 再看另外一個檔案:

suse:~ # vi /etc/logrotate.d/wtmp

/var/log/wtmp {
 compress
 dateext
 maxage 365
 rotate 99
 size=+400k
 notifempty
 missingok
copytruncate
}
# 這裡只有一個 copytruncate 未介紹過。copytruncate 是說在進行紀錄檔輪替時,會先將
# 紀錄檔的內容複製到輪替檔後才清除紀錄檔的內容,因此從頭到尾紀錄檔都還存在,所以您不需
# 設定 create 參數 (就算設定上去也會被忽略 ),當然更不需要執行 reload 的動作囉。
9.3.3 syslogd 與 logrotate 的練習範例

 以下舉個 syslogd 與 logrotate 的實際範例給各位做參考,看看這兩者如何搭配起來做設定。


要求事項如下一. 設定 syslog.conf:將有關核心的所有訊息紀錄在 /var/log/kernel 檔案 ﹔另外把核心所出現的訊息,其訊息等級在 err 以上 (含 err) 時,紀錄在第十個終端機上。

將郵件服務的所有訊息紀錄在 /var/log/maillog 裡,並採取非同步寫入的方式。

將排程服務的所有訊息紀錄在 /var/log/cron。

除了核心訊息、排程服務及郵件服務的訊息外,其他所有的訊息都紀錄在 /var/log/allmessages 裡。

二. 設定紀錄檔輪替:

  針對以上這些紀錄檔,於 /etc/logrotate.d/syslog 內,做相同輪替方面的設定。紀錄檔輪替後,採 gzip 壓縮。

最多只能有八個紀錄檔的備份檔 (輪替檔)。

當紀錄檔大小超過 2 M 時才進行輪替。

如果紀錄檔是空的,則不進行輪替。

紀錄檔輪替後所產生的新紀錄檔,其權限為 640,擁有者及擁有群組皆為 root。

三. 將您目前所設定的這台主機,當成 log (syslogd) server 來使用。

[b]

相關設定如下[/b]

一. 設定 syslog.conf:
suse:~ #vi /etc/syslog.conf
kern.*                /var/log/kernel
kern.err               /dev/tty10
mail.*               -/var/log/maillog
cron.*                /var/log/cron
*.*;kern.none;cron.none;mail.none  /var/log/allmessages
二. 設定紀錄檔輪替:
suse:~ # vi /etc/logrotate.d/syslog

/var/log/kernel /var/log/maillog /var/log/cron /var/log/allmessages {
  compress
compresscmd /usr/bin/gzip
  rotate 8
  size +2M
  notifempty
  create 640 root root
  sharedscripts
  postrotate
   /etc/init.d/syslog reload
 endscript
}
三. 設定 log server:
suse:~ #vi /etc/sysconfig/syslog
SYSLOGD_PARAMS="-r"

suse:~ # rcsyslog restart

9.4 登入的監控


 這裡介紹三個與使用者登入紀錄有關的檔案,不過您無法直接瀏覽這些檔案的內容,必須透過指令才能存取這些檔案。



/var/log/lastlog (指令 lastlog)


 紀錄使用者最後一次登入系統的時間。只要是 /etc/passwd 檔案中所存在的帳號,都會紀錄在這個檔案內 (除了 nobody 帳號),因此您可以了解到有哪些帳號從未登入系統。
suse:~ # lastlog
Username  Port   From       Latest
root    tty1           Wed Jan 31 11:31:15 +0800 2007
bin                  **Never logged in**
daemon                **Never logged in**
  :略                   :略
barry    pts/2  192.168.1.2   Tue Jan 30 15:28:56 +0800 2007
mary    tty3           Mon Jan 29 11:11:47 +0800 2007


/var/run/utmp (指令 who、w 或 finger)
 紀錄目前有哪些使用者登入系統,包括本機及遠端登入。而當使用者登出後,就會從此檔案中被移除。
suse:~ # who
root   tty1   Sep 23 00:23
mary   tty3   Sep 23 00:24
root   pts/0   Sep 22 23:29 (192.168.1.2)
 一般使用者也可以存取這個檔案,但若您不想讓使用者查詢誰在線上的話,可以修改一下 utmp 的權限:

suse:~ # chmod 660 /var/run/utmp


/var/log/wtmp (指令 last )

 紀錄使用者登入及登出的時間,並會統計登入至登出的存續時間。
suse:~ # last
tina  :0           Fri Sep 23 14:24 - 14:36 (00:12)
barry  tty3           Fri Sep 23 00:49 still logged in
mary  pts/1   192.168.1.2  Fri Sep 23 00:44 still logged in
mary  tty3Fri         Sep 23 00:24 - 00:49 (00:25)
root  tty1Fri         Sep 23 00:23 still logged in
 當使用者登入時,login 程式會將此次登入的時間地點寫入 /var/log/lastlog 裡 ﹔接著開啟 /var/run/utmp,也同時把登入資料寫入其中,一直到使用者登出後,才將資料從 utmp 中移除 ﹔最後開啟 /var/log/wtmp,把使用者在 utmp 中的資料寫入 wtmp 中,而當使用者登出時會再寫入一次,只不過這次會把使用者從登入到登出的存續時間做個統計並紀錄下來。

copyright 2006 by barry ( 柏青哥 )
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: