歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多Linux

下一代系統日志工具(syslog-ng)

  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。
Copyright © Linux教程網 All Rights Reserved