syslog-ng 學習

http://luyongxin88.blog.163.com/blog/static/925580720112275183903/


  因爲工作的需要,涉及到了syslog-ng。現在看來,在外包公司工作,也就這麼兩點的好處了,一是拿的錢稍微多點,二就是能接觸一下新的東西。當然,想要深入瞭解,公司是不會提供這樣的機會了,還是自己看看吧。以下都是一些網絡上學習來了有關syslog-ng的知識。整理一下。以前認爲網絡上都有,自己轉載了沒必要,但某天突然領悟到:自己看了,和自己記錄了不一樣,我們不能說書本上都有了上課就不做筆記了。再有就是放在自己的地方,查詢起來也方便,不用東找西找的,會顯得系統一些。

  --------------------

syslog-next generation 即下一代的系統日誌管理工具

The syslog-ng application is a flexible and highly scalable system logging application that is ideal for creating centralized logging solutions. The main features of syslog-ng are summarized below.

# 註釋 :syslog-ng 應用程序是一個靈活、高擴展性的系統日誌工具,主要是用於解決集中日誌記錄的工具。它的主要特點有 :

1、可靠的日誌傳輸。syslog-ng 允許你發送日誌到遠程的日誌服務器上。傳輸過程使用 TCP ,區別於 syslog 的 UDP ,可以確保不會丟失數據

2、通過使用 SSL/TLS 來加密日誌傳輸過程。不過這個功能只有在 premium 版本才提供。

3、基於磁盤的緩衝。syslog-ng 可以在網絡連接失效時先把日誌寫入硬盤,等網絡連接恢復時再傳輸到日誌服務器上,而且確保日誌的順序不會混亂。不過這個功能也是 premium 版本才提供的。

4、直接數據庫訪問。能夠把日誌直接存入數據庫,以便進行搜索及配合日誌分析應用程序。支持 MySQL、Oracle、PostgreSQL、SQLIife ,同樣也是 premium 才支持

5、支持多種操作系統。包括 Linux、Unix、BSD、Solaris、HP-UX、AIX 等。甚至還可以通過代理和 Windows 主機進行通信

6、過濾器和歸類。syslog=ng 應用程序可以根據收的喔的日誌的內容進行排序、或者根據源ip、應用程序、優先級等。可以通過宏自動建立目錄、文件、數據庫。支持 regex 和布爾表達式,確保只轉發你想要的內容

7、支持 ipv4 和 ipv6

syslog-ng在一般linux系統下的配置文件爲/etc/syslog-ng/syslog-ng.conf

一般 syslog-ng 可能含有以下5個章段:

options{}

全局設置。 These can be overridden in any of the next four sections

source{}

信息來源來源可以是文件本地 sockets, 或者遠程主機。

destination{}

信息目標可以是文件本地 sockets, 或者遠程主機。

filter{}

過濾選項非常強大且複雜;你可以過濾日誌中的任何方面,比如基礎的 syslogd 快捷字段(facility namesman 5 syslog.conf 獲取更多信息),log 等級,主機名,以及任何log中出現的字段或者是數字。

log{}

此段將來源 目的 過濾 都給連接起來並且告訴syslog-ng如何處理日誌。

配置的主要內容爲消息路徑的匹配規則,這個和iptables 的規則是差不多的。

消息路徑由3部分組成:

消息路徑 = 日誌消息源  +  過濾規則  +  消息目地

其運行過程:消息源 --->  syslog-ng --> 消息命中 -->  對應的日誌目的

消息源

消息源:  

source <identifier> { source-driver(params);source-driver(params);... };消息源驅動器 source driver,用來收集日誌消息,和系統的syslogd交換信息,記錄日誌

 實例:

source src { unix-stream("/dev/log"); internal(); udp(ip(0.0.0.0) port(514)); };

 identifier  是給定消息源的唯一標誌

驅動器可以使用參數,參數有些是必需的,有些是可選的。必需的參數一般在前面。上面的指令中,/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 中,過濾器執行日誌路由,決定日誌是否滿足通過的條件

filter <identifier> {expression;}; 表達式中可以包含邏輯操作符 and or  not

例一個搜索來自blurp主機,包含deny的日誌消息的過濾指令
filter f_blurp_deny { host("blurp") and match("deny"); };

 下面是syslog-ng的過濾函數:
facility() 根據設備選擇日誌消息
level()或者priority() 根據優先級選擇日誌消息
program() 日誌消息的程序名是否匹配一個正則表達式
host() 日誌消息的主機名是否和一個正則表達式匹配
match() 對日誌消息的內容進行正則匹配
filter() 調用另一條過濾規則並判斷它的值

 

 日誌消息的目的
destination 指定日誌消息的去處。目的可以包括一些目的驅動器,指定日誌的派發方向。
destination  <identifier> { destination-driver(params);estination-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並啓動指定的程序,把日誌消息發送到這個進程的標準輸出。
兩個日誌消息源驅動器比較相似,都打開AF_UNIX類型的套接字,在套接字上監聽日誌消息。unix-stream()主要用在Linux,使用 SOCK_STREAM參數,是面向連接的,不會造成日誌消息的丟失;unix-dgram()用在BSD系統上,使用SOCK_DGRAM參數,是無連 接的,如果系統過載,會造成日誌消息丟失。

日誌路徑

前面的章節中,我們學習瞭如何定義消息源、過濾器和消息目的。現在我們要把這些結合起來形成一條完整的指令。凡是來源於指定的消息源,匹配所有指定的過濾器,並送到指定的地址。其語法如下:

 log { source(s1); source(s2); ...

filter(f1); filter(f2); ...

destination(d1); destination(d2); ... };

 

實例

 source s_all {< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />

        # message generated by Syslog-NG

        internal();

        # standard Linux log source (this is the default place for the syslog()

        # function to send logs to)

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

        # messages from the kernel

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

        # use the following line if you want to receive remote UDP logging messages

        # (this is equivalent to the "-r" syslogd flag)

        # udp();

        udp(ip("0.0.0.0") port(514));

 

};

 

#===========================added  by Bill ============

filter f_aqtas  { facility(local7);};

filter f_aqvue  { facility(local6);};

filter f_aqlyx  { facility(local5);};

 

 

destination aqtas { file("/var/log/aqtas.log"); };

destination aqvue { file("/var/log/aqvue.log"); };

destination aqlyx { file("/var/log/aqlyx.log"); };

 

log { source(s_all); filter (f_aqtas); destination(aqtas); };

log { source(s_all); filter (f_aqvue); destination(aqvue); };

log { source(s_all); filter (f_aqlyx); destination(aqlyx); };

   

=======

以上已經將主要的syslog-ng的配置內容做了說明,還有其他一些需要了解

 選項
選項可以改變syslog-ng 的行爲,語法如下:
options { option1(params);option(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 之後要重啓服務:

# /etc/init.d/syslog-ng restart

測試

現在你日誌一般是認證日誌,所以你可以先嚐試着打開一個新的登錄窗口,使用su 或者是 sudo 都可以。接着檢查 /var/log/auth.log 文件。在客戶端上做一些操作,接着檢查 /var/log/HOSTS 是否已經爲遠程客戶端創建了新的目錄。

另外一個方法是使用更加高級的 logger 命令:

# logger “this is a test”

# logger -p auth.debug “this is a test”



==================補充:20110907

 1、facility
facility定義日誌消息的範圍,其可使用的key有:
引用
auth -由 pam_pwdb 報告的認證活動。
authpriv -包括特權信息如用戶名在內的認證活動 
cron -與 cron 和 at 有關的計劃任務信息。 
daemon -與 inetd 守護進程有關的後臺進程信息。 
kern -內核信息,首先通過 klogd 傳遞。 
lpr -與打印服務有關的信息。 
mail -與電子郵件有關的信息 
mark - syslog內部功能用於生成時間戳 
news -來自新聞服務器的信息 
syslog -由 syslog 生成的信息 
user -由用戶程序生成的信息 
uucp -由 uucp 生成的信息 
local0-local7 -與自定義程序使用
* 通配符代表除了 mark 以外的所有功能

除mark爲內部使用外,還有security爲一箇舊的key定義,等同於auth,已經不再建議使用。

2、level級別
level定義消息的緊急程度。按嚴重程度由高到低順序排列爲:
引用
emerg -該系統不可用,等同panic
alert -需要立即被修改的條件 
crit -阻止某些工具或子系統功能實現的錯誤條件 
err -阻止工具或某些子系統部分功能實現的錯誤條件,等同error
warning -預警信息,等同warn 
notice -具有重要性的普通條件 
info -提供信息的消息 
debug -不包含函數條件或問題的其他信息 
none -沒有重要級,通常用於排錯 
* 所有級別,除了none 

其中,panic、error、warn均爲舊的標識符,不再建議使用。

在定義level級別的時候,需要注意兩點:
引用
1)優先級是由應用程序在編程的時候已經決定的,除非修改源碼再編譯,否則不能改變消息的優先級;
2)低的優先級包含高優先級,例如,爲某個應用程序定義info的日誌導向,則涵蓋notice、warning、err、crit、alert、emerg等消息。(除非使用=號定義)


3、selector選擇條件
通過小數點符號“.”把facility和level連接在一起則成爲selector(選擇條件)。
可以使用分號“;”同時定義多個選擇條件。也支持三個修飾符:
引用
* - 所有日誌信息
= - 等於,即僅包含本優先級的日誌信息
! - 不等於,本優先級日誌信息除外

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章