Linux下的sysylog與syslog-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 #UUCP和news設備能產生許多外部消息。它把這些消息存到自己的日誌(/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