logger(二):linux下syslog & syslog-ng 詳解

Linux下的sysylogsyslog-ng

     一臺服務器的日誌對系統工程師來說是至關重要的,一旦服務器出現故障或被入侵,我們需要查看日誌來定位問題的關鍵所在,所以說對於線上跑的服務器而言日誌應該合理的處理及管理.下面來介紹下linux系統的syslog日誌服務器.

一、syslog詳解

1.1syslog簡介

syslog 是一種工業標準的協議,可用來記錄設備的日誌。在UNIX系統,路由器、交換機等網絡設備中,系統日誌(System Log)記錄系統中任何時間發生的大小事件。管理者可以通過查看系統記錄,隨時掌握系統狀況。UNIX的系統日誌是通過syslogd這個進程記錄系統有關事件記錄,也可以記錄應用程序運作事件。通過適當的配置,我們還可以實現運行syslog協議的機器間通信,通過分析這些網絡行爲日誌,藉以追蹤掌握與設備和網絡有關的狀況。syslog 系統日誌記錄着linux系統啓動及運行的過程中產生的信息, RHEL 5.x系統上默認自帶了syslog 的配置文件是/etc/syslog.conf. syslog默認有兩個守護進程,klogd,syslogd。klogd 進程是記錄系統運行的過程中內核生成的日誌,而在系統啓動的過程中內核初始化過程中 生成的信息記錄到控制檯(/dev/console)當系統啓動完成之後會把此信息存放到/var/adm或/var/log/目錄下的信息文件中(messages.*)。一個典型的syslog記錄包括生成程序的名字和一個文本信息。它還包括一個設備和一個優先級範圍。 通過使用syslog.conf文件,可以對生成的日誌的位置及其相關信息進行靈活的配置。

 Syslogd 進程是記錄非內核以外的信息: centos 6.x的syslogd被改名爲rsyslogd,其默認的配置文件是/etc/rsyslog.conf

 

 

2.syslog配置詳解:

該配置文件指明瞭syslogd守護程序記錄日誌的行爲,該程序在啓動時查詢配置文件。該文件由不同程序或消息分類的單個條目組成,每個佔一行。對每類消息提供一個選擇域和一個動作域。

這些域由tab隔開:選擇域指明消息的類型和優先級;動作域指明syslogd接收到一個與選擇標準相匹配的消息時所執行的動作.

每個選擇域都是由消息類型和優先級組成.當指明一個優先級時,syslogd將記錄一個擁有相同或者更高優先級的消息。

Syslog.conf基本語法格式:

 [facility].[priority]   [action]

 消息類型.優先級  動作域

 

2.1 Facility可以理解爲日誌來源或類別,消息類型

 

1. auth      # 認證相關的 

2. authpriv  # 權限,授權相關的

3. cron      # 任務計劃相關的

4. daemon    # 守護進程相關的

5. kern      # 內核相關的

6. lpr       # 打印相關的

7. mail      # 郵件相關的

8. mark      # 標記相關的

9. news      # 新聞相關的

10. security  # 安全相關的,與auth 類似 

11. syslog    # syslog自己的

12. user      # 用戶相關的

13. uucp      # unix to unix cp 相關的

14. local0 到 local7 # 用戶自定義使用

15. *         # *表示所有的facility

 

 

 

2.2 priority優先級,從高到低

 

1.emerg/oanic     # 會導致系統不可用的

2.alert           # 必須馬上處理的

3.crit            # 比較嚴重的

4.err/error       # 錯誤信息 

5.warning/warn    # 可能影響系統功能,需要提醒用戶的重要事件

6.notice          # 不影響正常功能,需要注意的消息 

7.info            # 一般信息

8.debug           # 程序或系統的調試信息

9.*               # 表示所有的日誌級別 

10.none           # 跟* 相反,表示啥也沒有

      

     例如:“mail.*”將把所有優先級的消息都發送到操作動作指定的/var/log/mail文件裏。使用“*”限定符與使用“debug”優先級的效果完全一樣,後者也將把所有類型的消息發送到指定地點。 

 

 

 

2.3 action表示日誌記錄位置

1.   系統上的絕對路徑  # 普通文件 如: /var/log/xxx 

2.  |                # 管道  通過管道送給其他的命令處理 

3.  終端             # 終端   如:/dev/console

4.  @HOST            # 遠程主機 如: @10.0.0.1

5.  用戶             # 系統用戶 如: root

6.  *            # 登錄到系統上的所有用戶,一般emerg級別的日誌是這樣定義的

 

 

 

 

2.4 一些例子:

   1.mail.info   /var/log/mail.log # 表示將mail相關的,級別爲info及  info以上級別的信息記錄到/var/log/mail.log文件中  

   2.auth.=info  @10.0.0.1  # 表示將auth相關的,基本爲info的信息記錄到10.0.0.1主機上去前提是10.0.0.1要能接收其他主機發來的日誌信息  

   3.user.!=error                  # 表示記錄user相關的,不包括error級別的信息  

   4.user.!error                   # 與user.error相反 

   5.*.info                        # 表示記錄所有的日誌信息的info級別  

   6.mail.*                        # 表示記錄mail相關的所有級別的信息  

   7.*.*                           # 你懂的.  

   8.cron.info;mail.info           # 多個日誌來源可以用";" 隔開  

   9.cron,mail.info                # 與cron.info;mail.info 是一個意思  

   10.mail.*;mail.!=info           # 表示記錄mail相關的所有級別的信息,但是不包括info級別的 

   11.uucp,news.crit /var/log/spooler     #UUCPnews設備能產生許多外部消息。它把這些消息存到自己的日誌(/var/log/spooler)中並把級別限爲\"err\"或更高

   12.  **.emerg @linuxaid.com.cn      #當一個緊急消息到來時,可能想讓所有的用戶都得到。也可能想讓自己的日誌接收並保存。

   13.#kern.* /dev/console              #有時syslogd將產生大量的消息。例如內核(\"kern\"設備)可能很冗長,用戶很難看得清楚明瞭,那麼用戶可能想把內核消息記錄到/dev/console中。表明內核日誌記錄被註釋掉了

 

 

2.5 如下解析一下rhel5.x系統上自帶的syslog的配置文件/etc/syslog.conf

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

# 表示將所有facility的info級別,但不包括mail,authpriv,cron相關的信息,記錄到 /var/log/messages文件  

*.info;mail.none;authpriv.none;cron.none                /var/log/messages 

# 表示將權限,授權相關的所有基本的信息,記錄到/var/log/secure文件中.這個文件的權限是600  

authpriv.*                                              /var/log/secure 

# 表示將mail相關的所有基本的信息記錄到/var/log/maillog文件中,可以看到路徑前面有一個"-"  

# "-" 表示異步寫入磁盤,  

mail.*                                                  -/var/log/maillog 

# 表示將任務計劃相關的所有級別的信息記錄到/var/log/cron文件中  

cron.*                                                  /var/log/cron 

# 表示將所有facility的emerg級別的信息,發送給登錄到系統上的所有用戶  

*.emerg                                                 *  

# 表示將uucp及news的crit級別的信息記錄到/var/log/spooler文件中  

uucp,news.crit                                          /var/log/spooler 

# 表示將local7的所有級別的信息記錄到/var/log/boot.log文件中,  

# 上面說過local0 到local7這8個是用戶自定義使用的,這裏的local7記錄的是系統啓動相關的信息  

local7.*                                                /var/log/boot.log

 

 

如果需要重新啓動syslog守護進程(/etc/syslog.conf的修改只有在syslog守護進程重新啓動後纔會生效),並且只想重新啓動syslog守護進程而不是整個系統,在Red Hat Linux機器上,執行以下兩條命令之一即可:/etc/rc.d/init.d/syslogstop;/etc/rc.d/init.d/syslogstart/etc/rc.d/init.d/syslogrestart

 

 

 

 

2.6 使用syslog接口

加載sys/syslog.h文件

        openlog:打開日誌設備,以供讀取和寫入,與文件系統調用的open類似; 

         syslog:寫入日誌,與文件系統調用的write類似; 

         closelog:關閉日誌設備,與文件系統調用的close類似; 

         vsyslog:它和syslog功能一樣,負責寫入日誌,只是參數格式不同。

 

(1)openlog函數

該函數的聲明如下:

void openlog(const char *ident, int option, int facility);

此函數用來打開一個到系統日誌記錄程序的連接,打開之後就可以用syslog或vsyslog函數向系統日誌裏添加信息了。而closelog函數就是用來關閉此連接的。

第一個參數ident是一個標記,ident所表示的字符串將固定地加在每行日誌的前面以標識這個日誌,通常就寫成當前程序的名稱以作標記。

第二個參數 option一般是下列選項值取“與”運算(使用“|”表示,如“LOG_CONS | LOG_PID”)的結果:

LOG_CONS:如果送到system logger時發生問題,直接寫入系統終端; 

LOG_NDELAY:立即開啓連接,通常連接是在第一次寫入消息時纔打開的; 

LOG_PERROR:將消息也同時送到stderr設備; 

LOG_PID:將進程PID含入所有消息中。

第三個參數facility指明記錄日誌的程序的類型,它主要具有如下幾類日誌類型:

LOG_AUTH :安全/授權消息 

LOG_AUTHPRIV:安全/授權消息 

LOG_CRON:時間守護進程(cron和at)專用 

LOG_DAEMON:其它系統守護進程 

LOG_KERN:核心消息 

LOG_LOCAL0到LOG_LOCAL7:系統保留 

LOG_LPR:printer子系統 

LOG_MAIL:mail子系統 

LOG_NEWS:USENET新聞子系統 

LOG_SYSLOG:syslogd進程內部所產生的消息 

LOG_USER(缺省):一般使用者缺省使用消息 

LOG_UUCP:UUCP子系統 

LOG_FTP:FTP子系統使用

(2)syslog函數

syslog函數的聲明如下:

void syslog(int priority, const char * message, ...);

第一個參數是消息的緊急級別priority,第二個參數是消息及其格式,之後是格式對應的參數,如同C語言裏面printf輸出函數一樣使用,具體的格式這裏就不再詳述,它不是本書介紹的重點。

這裏還需要詳細介紹一下第一個參數priority,它是由severity level和facility組成的。Facility已經在上面介紹了,下面介紹一下severity level,也就是消息的重要級別,它主要包括:

LOG_EMERG:緊急狀況 

LOG_ALERT:高優先級問題,比如說數據庫崩潰等,必須要立即採取反應行動 

LOG_CRIT:重要狀況發生,比如硬件故障 

LOG_ERR:錯誤發生 

LOG_WARNING:警告發生 

LOG_NOTICE:一般狀況,需要引起注意 

LOG_INFO:信息狀況 

 LOG_DEBUG:調試消息

在實際使用中,如果我們的程序要使用系統日誌功能,只需要在程序啓動時使用openlog函數來連接syslogd程序,後面隨時用syslog函數寫日誌就行了。

(3)closelog函數

相對上述2個函數來說,該函數非常簡單,其聲明如下:

void closelog( void );

值得注意的是,雖然該函數的使用和調用情況非常簡單,但是是必不可少的,因爲在Linux系統中,打開的日誌也是資源,如果只使用openlog函數打開日誌,而忘記使用closelog關閉日誌的話,當打開的日誌數量累積到一定程度,便會造成內存不足,從而引起系統問題。所以,提醒用戶在使用中特別注意

 

 

 

 

3.syslog-ng配置詳解:

   syslog-ng (syslog-Next generation) 是syslog的升級版,syslog-ng有兩個版本,一個是收費的,一個是開源的,那麼作爲syslog的下一代產品,功能是可想而知,肯定比syslog的功能強大的多,如 
高性能 可靠的傳輸 支持多平臺 高可靠性 衆多的用戶羣體 強大的日誌過濾及排序 事件標籤和關聯性 支持最新的IETF標準 等....

3.1 syslog-ng 的設計原則:

 通過正規表達式協助,除支持原facitily/level方式,還支持內容過濾等以建立更好的消息過濾機制; 

 支持主機鏈,即使日誌消息經過多重網絡轉發,仍可找到原發出主機的信息和整個消息鏈; 

 支持強大的自定義配置,並且清晰、明瞭。 

開源版本的主頁 http://www.balabit.com/network-security/syslog-ng/opensource-logging-system/overview

 

3.2 syslog-ng 安裝:

1.rhel5.x的系統上安裝方法:

 yum install gcc*  

cd /usr/src 

wget http://www.balabit.com/downloads/files/syslog-ng/sources/3.2.4/source/eventlog_0.2.12.tar.gz 

 wget http://www.balabit.com/downloads/files/syslog-ng/open-source-edition/3.3.5/source/syslog-ng_3.3.5.tar.gz 

 tar xvf eventlog_0.2.12.tar.gz 

 cd eventlog-0.2.12 

 ./configure --prefix=/usr/local/eventlog 

 make 

 make install 

 

 cd /usr/src 

 tar xvf syslog-ng_3.3.5.tar.gz 

 cd syslog-ng-3.3.5 

 export PKG_CONFIG_PATH=/usr/local/eventlog/lib/pkgconfig 

 ./configure --prefix=/usr/local/syslog-ng 

 make 

 make install 

 

2.Ubuntu 2.6.x上的安裝方法

 Sudo apt-get install syslog-ng

 

3.3 syslog-ng 原理:

LOG STATEMENTS『SOURCES - FILTERS -DESTINATIONS』
消息路徑 『消息源 - 過濾器 - 目的站』

也就是說,通過定義多個消息源,把匹配上若干個過濾器的消息導向到指定的目的地,從而組成一個消息路徑。

3.4 syslog-ng 配置詳解:

   文件:$/etc/syslog-ng.conf

1. syslog-ng.conf文件裏的內容有以下幾個部分組成

2. 全局選項,多個選項時用分好";"隔開 

3. options { .... }; 

4. 定義日誌源

5. source s_name { ... }; 

6. 定義過濾規則,規則可以使用正則表達式來定義,這裏是可選的,不定義也沒關係 

7. filter f_name { ... }; 

8. 定義目標 

9. destination d_name { ... }; 

10. 定義消息鏈可以將多個源,多個過濾規則及多個目標定義爲一條鏈 

11. log { ... }; 

12. 詳解如下 

13. ---------------------------------------------------------------- 

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

15.     更多選項如下 

16.     chain_hostnames(yes|no)     # 是否打開主機名鏈功能,打開後可在多網絡段轉發日誌時有效 

17.     long_hostnames(yes|no)      # chain_hostnames的別名,已不建議使用 

18.     keep_hostname(yes|no)       # 是否保留日誌消息中保存的主機名稱 

19.     use_dns(yes|no)             # 是否打開DNS查詢功能, 

20.     use_fqdn(yes|no)            # 是否使用完整的域名 

21.     check_hostname(yes|no)      # 是否檢查主機名有沒有包含不合法的字符 

22.     bad_hostname(regexp)        # 可通過正規表達式指定某主機的信息不被接受 

23.     dns_cache(yes|no)           # 是否打開DNS緩存功能 

24.     dns_cache_expire(n)         # DNS緩存功能打開時,一個成功緩存的過期時間 

25.     dns_cache_expire_failed(n)  # DNS緩存功能打開時,一個失敗緩存的過期時間 

26.     dns_cache_size(n)           # DNS緩存保留的主機名數量 

27.     create_dirs(yes|no)         # 當指定的目標目錄不存在時,是否創建該目錄 

28.     dir_owner(uid)              # 目錄的UID 

29.     dir_group(gid)              # 目錄的GID 

30.     dir_perm(perm)              # 目錄的權限,使用八進制方式標註,例如0644 

31.     owner(uid)                  # 文件的UID 

32.     group(gid)                  # 文件的GID 

33.     perm(perm)                  # 文件的權限,同樣,使用八進制方式標註 

34.     gc_busy_threshold(n)        # syslog-ng忙時,其進入垃圾信息收集狀態的時間一旦分派的對象達到這個數字,syslog-ng就啓動垃圾信息收集狀態。默認值是:3000 

35.     gc_idle_threshold(n)        # syslog-ng空閒時,其進入垃圾信息收集狀態的時間一旦被分派的對象到達這個數字,syslog-ng就會啓動垃圾信息收集狀態,默認值是:100 

36.     log_fifo_size(n)            # 輸出隊列的行數 

37.     log_msg_size(n)             # 消息日誌的最大值(bytes 

38.     mark(n)                     # 多少時間(秒)寫入兩行MARK信息供參考,目前沒有實現 

39.     stats(n)                    # 多少時間(秒)寫入兩行STATUS信息,默認值是:600 

40.     sync(n)                     # 緩存多少行的信息再寫入文件中,0爲不緩存,局部參數可以覆蓋該值。 

41.     time_reap(n)                # 在沒有消息前,到達多少秒,即關閉該文件的連接 

42.     time_reopen(n)              # 對於死連接,到達多少秒,會重新連接 

43.     use_time_recvd(yes|no)      # 宏產生的時間是使用接受到的時間,還是日誌中記錄的時間;建議使用R_的宏代替接收時間,S_的宏代替日誌記錄的時間,而不要依靠該值定義。 

44.  

45. source s_name { internal(); unix-dgram("/dev/log"); udp(ip("0.0.0.0") port(514)); }; 

46.  

47.     file (filename)                 # 從指定的文件讀取日誌信息 

48.     unix-dgram  (filename)          # 打開指定的SOCK_DGRAM模式的unix套接字,接收日誌消息 

49.     unix-stream (filename)          # 打開指定的SOCK_STREAM模式的unix套接字,接收日誌消息 

50.     udp ( (ip),(port) )             # 在指定的UDP端口接收日誌消息 

51.     tcp ( (ip),(port) )             # 在指定的TCP端口接收日誌消息 

52.     sun-streams (filename)          # solaris系統中,打開一個(多個)指定的STREAM設備,從其中讀取日誌消息 

53.     internal()                      # syslog-ng內部產生的消息 

54.     pipe(filename),fifo(filename)   # 從指定的管道或者FIFO設備,讀取日誌信息 

55.  

56. filter f_name   { not facility(news, mail) and not filter(f_iptables); }; 

57.     更多規則函數如下 

58.     facility(..)    # 根據facility(設備)選擇日誌消息,使用逗號分割多個facility 

59.     level(..)       # 根據level(優先級)選擇日誌消息,使用逗號分割多個level,或使用“..”表示一個範圍 

60.     program(表達式)    # 日誌消息的程序名是否匹配一個正則表達式 

61.     host(表達式)   # 日誌消息的主機名是否和一個正則表達式匹配 

62.     match(表達式)  # 對日誌消息的內容進行正則匹配 

63.     filter()        # 調用另一條過濾規則並判斷它的值 

64.     定義規則的時候也可以使用邏輯運算符and or not 

65.  

66. destination d_name { file("/var/log/messages"); }; 

67.     更多動作如下 

68.     file (filename)                 # 把日誌消息寫入指定的文件 

69.     unix-dgram  (filename)          # 把日誌消息寫入指定的SOCK_DGRAM模式的unix套接字 

70.     unix-stream (filename)          # 把日誌消息寫入指定的SOCK_STREAM模式的unix套接字 

71.     udp (ip),(port)                 # 把日誌消息發送到指定的UDP端口 

72.     tcp (ip),(port)                 # 把日誌消息發送到指定的TCP端口 

73.     usertty(username)               # 把日誌消息發送到已經登陸的指定用戶終端窗口 

74.     pipe(filename),fifo(filename)   # 把日誌消息發送到指定的管道或者FIFO設備 

75.     program(parm)                   # 啓動指定的程序,並把日誌消息發送到該進程的標準輸入 

76.  

77. log { source(s_name); filter(f_name); destination(d_name) }; 

 

3.5 syslog-ng.conf 例子:

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

2.  

3. source src {  

4.             internal();  

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

6.             # 表示日誌來源爲本機udp的514端口, 

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

8. }; 

9.  

10. filter f_iptables   { facility(kern) and match("IN=") and match("OUT="); }; 

11.  

12. filter f_console    { level(warn) and facility(kern) and not filter(f_iptables) 

13.                       or level(err) and not facility(authpriv); }; 

14.  

15. filter f_newsnotice { level(notice) and facility(news); }; 

16. filter f_newscrit   { level(crit)   and facility(news); }; 

17. filter f_newserr    { level(err)    and facility(news); }; 

18. filter f_news       { facility(news); }; 

19.  

20. filter f_mailinfo   { level(info)      and facility(mail); }; 

21. filter f_mailwarn   { level(warn)      and facility(mail); }; 

22. filter f_mailerr    { level(err, crit) and facility(mail); }; 

23. filter f_mail       { facility(mail); }; 

24.  

25. filter f_cron       { facility(cron); }; 

26.  

27. filter f_local      { facility(local0, local1, local2, local3, 

28.                                local4,  local6, local7); }; 

29.  

30. filter f_acpid_full { match('^acpid:'); }; 

31. filter f_acpid      { level(emerg..notice) and match('^acpid:'); }; 

32.  

33. filter f_acpid_old  { match('^\[acpid\]:'); }; 

34.  

35. filter f_netmgm     { match('^NetworkManager:'); }; 

36.  

37. filter f_messages   { not facility(news, mail) and not filter(f_iptables); }; 

38. filter f_warn       { level(warn, err, crit) and not filter(f_iptables); }; 

39. filter f_alert      { level(alert); }; 

40.  

41. destination console  { pipe("/dev/tty10"    owner(-1) group(-1) perm(-1)); }; 

42. log { source(src); filter(f_console); destination(console); }; 

43.  

44. destination xconsole { pipe("/dev/xconsole" owner(-1) group(-1) perm(-1)); }; 

45. log { source(src); filter(f_console); destination(xconsole); }; 

46.  

47. destination newscrit   { file("/var/log/news/news.crit" 

48.                               owner(news) group(news)); }; 

49. log { source(src); filter(f_newscrit); destination(newscrit); }; 

50.  

51. destination newserr    { file("/var/log/news/news.err" 

52.                               owner(news) group(news)); }; 

53. log { source(src); filter(f_newserr); destination(newserr); }; 

54.  

55. destination newsnotice { file("/var/log/news/news.notice" 

56.                               owner(news) group(news)); }; 

57. log { source(src); filter(f_newsnotice); destination(newsnotice); }; 

58.  

59. destination mailinfo { file("/var/log/mail.info"); }; 

60. log { source(src); filter(f_mailinfo); destination(mailinfo); }; 

61.  

62. destination mailwarn { file("/var/log/mail.warn"); }; 

63. log { source(src); filter(f_mailwarn); destination(mailwarn); }; 

64.  

65. destination mailerr  { file("/var/log/mail.err" fsync(yes)); }; 

66. log { source(src); filter(f_mailerr);  destination(mailerr); }; 

67.  

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

69. log { source(src); filter(f_mail); destination(mail); }; 

70.  

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

72. destination null { }; 

73. log { source(src); filter(f_acpid); destination(acpid); flags(final); }; 

74.  

75. log { source(src); filter(f_acpid_full); destination(null); flags(final); }; 

76.  

77. log { source(src); filter(f_acpid_old); destination(acpid); flags(final); }; 

78.  

79. destination netmgm { file("/var/log/NetworkManager"); }; 

80. log { source(src); filter(f_netmgm); destination(netmgm); flags(final); }; 

81.  

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

83. log { source(src); filter(f_local); destination(localmessages); }; 

84.  

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

86. log { source(src); filter(f_messages); destination(messages); }; 

87.  

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

89. log { source(src); filter(f_iptables); destination(firewall); }; 

90.  

91. destination warn { file("/var/log/warn" fsync(yes)); }; 

92. log { source(src); filter(f_warn); destination(warn); }; 

93.  

94. filter f_ha         { facility(local5); }; 

95. destination hamessages { file(/var/log/ha); }; 

96. log { source(src); filter(f_ha); destination(hamessages); }; 

 

3.6 syslog-ng 的擴展項:

syslog-ng除了有全局選項參數外,不同的函數還可以定義其參數,其中包括:
1、擴展file的宏 引用

HOST 日誌消息的源發主機名。如果日誌消息穿過幾個主機,並且chain_hostname()功能已經打開,就使用第一個主機名。 
FACILITY :日誌消息來自的日誌設備 
PRIOPRITY/LEVEL :日誌消息的優先級 
PROGRAM :發送日誌消息的程序 
YEAR :發送日誌消息的年份,這個宏既可以指定日誌消息送出的時間,也可以指定日誌消息收到的時間。這由use_time_recvd()選項控制 
MONTH :發送日誌消息的月份 
DAY :發送日誌消息的日子 
HOUR :小時 
MIN : 分鐘
SEC :秒

2、file的參數
例如:log_file_size()、sync()、owner()、perm()等,請參考上面的全局設定
3、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文件。

3.6 syslog-ng 的擴展項template選項用法:

1.例1:設定存入資料庫的目的:

destination d_mysql {pipe("/tmp/mysql.pipe"template("INSERT INTO logs (host, facility, priority, level, tag, date, time, program, msg) VALUES ( '$HOST', '$FACILITY', '$PRIORITY', '$LEVEL', '$TAG', '$YEAR-$MONTH-$DAY', '$HOUR:$MIN:$SEC', '$PROGRAM', '$MSG' );\n") template-escape(yes));};

#temple定義輸出格式(時間,日誌級別,信息),具體參考file宏

2.例2:

 template ws_fmt {template("$DATE $PRIORITY $MSG\n"); template_escape(no); };

 

3.7 syslog-ng 關於垃圾收集狀態:

當滿足一定的條件,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就進入垃圾信息收集狀態的時間。該值應該比較高,以保證正常情況下不會打斷日誌消息的收取。

 

3.8 使用方法及案例:

如:

1.安裝:ubuntu下安裝方法: apt-get install syslog-ng

 2.配置syslog-ng.conf文件,在目錄:/etc/syslog-ng/syslog-ng.conf

 3.將配置好的syslog-ng.conf替換源文件

 4.配置syslog-ng文件,在目錄:/etc/logrotate.d/syslog-ng

 5.啓動log服務:/etc/init.d/syslog-ng restart

     若不增加其他設定,可以通過下面的簡單命令即可替換原syslog服務:

# service syslog stop
# service syslog-ng start

3.9 參考資料:

man syslog-ng.conf
man 8 syslog-ng

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