syslog是Linux系統預設的日誌守護程式,預設的syslog配置檔案是/etc/syslog.conf檔案。syslog守護程式是可配置的,它允許人們為每一種型別的系統資訊精確地指定一個存放地點。比較 syslog ,syslog-ng 具有眾多高階的功能:更好的網路支援,更加方便的配置,集中式的網路日誌儲存,並且更具有彈性。比如,使用syslogd時,所有的iptables日誌與其他核心日誌一起全部儲存到了kern.log檔案裡。Syslog-ng則可以讓你有選擇性的將iptables部分分出到另外的日誌檔案中。Syslogd僅能使用UDP協議,Syslog-ng 可以使用UDP和TCP協議。所以我們可以在加密的網路隧道中傳輸日誌到集中日誌伺服器。
syslog-ng的一個設計原則就是建立更好的訊息過濾粒度。syslog-ng能夠進行基於內容和優先權/facility的過濾。另一個設計原則是更容易進行不同防火牆網段的資訊轉發,它支援主機鏈,即使日誌訊息經過了許多計算機的轉發,也可以找出原發主機地址和整個轉發鏈。最後的一個設計原則就是儘量使配置檔案強大和簡潔。syslog-ng作為syslog的替代工具,可以完全替代syslog的服務,並且通過定義規則,實現更好的過濾功能。之前介紹了Linux下rsyslog日誌收集服務環境部署記錄,下面簡單介紹下syslog-ng日誌集中管理服務部署記錄:
下面部署例項目的: 實現接收遠端客戶端服務日誌(nginx、mysql、php、apache)儲存在本地一臺日誌伺服器上提供檢視。 即遠端客戶機採用syslog-ng將其日誌通過管道pipe傳送到本地的日誌伺服器上進行檢視。 一、syslog-ng安裝(服務端和客戶端都要安裝) [root@syslog-ng ~]# wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm [root@syslog-ng ~]# rpm -ivh epel-release-latest-6.noarch.rpm --force [root@syslog-ng ~]# yum install syslog-ng -y ============================================================================================== 溫馨提示: 由於日誌集中管理服務syslog-ng採用的是C/S架構,所以客戶端也需要安裝syslog-ng。 如果客戶端只是傳輸系統日誌到syslog-ng伺服器上,那麼客戶端就不需安裝syslog-ng了,只需要在在syslog.conf配置裡新增一條: #vim /etc/syslog.conf //這是系統日誌,所有級別的所有日誌。 *.* @192.168.10.205 //此處IP地址為日誌伺服器IP【即客戶端的ip】 ============================================================================================== 二、syslog-ng服務端配置記錄(192.168.10.205) [root@syslog-ng ~]# cp /etc/syslog-ng/syslog-ng.conf /etc/syslog-ng/syslog-ng.conf.bak [root@syslog-ng ~]# vim /etc/syslog-ng/syslog-ng.conf ...... options { flush_lines (0); time_reopen (10); log_fifo_size (1000); long_hostnames (off); use_dns (no); use_fqdn (no); create_dirs (yes); #此行改為yes keep_hostname (yes); }; ...... source s_log { udp(ip(0.0.0.0) port(514)); }; ...... destination d_log { file("/data/syslog-ng/kevin.log"); }; ...... log { source(s_log); destination(d_log); }; 配置說明: options 為全域性配置引數 source 是日誌從本機的哪個IP哪個埠接收資訊 destination 接收到資訊儲存在哪個檔案 log 就是將來源資訊寫入到目的檔案中 建立日誌存放檔案 [root@syslog-ng ~]# mkdir /data/syslog-ng/ [root@syslog-ng ~]# touch /data/syslog-ng/kevin.log #此檔案其實可以不用提前建立,會自動建立。 [root@syslog-ng ~]# chmod 600 /data/syslog-ng/kevin.log 啟動syslog-ng服務 [root@syslog-ng ~]# /etc/init.d/syslog-ng start Plugin module not found in 'module-path'; module-path='/lib64/syslog-ng', module='afsql' Plugin module not found in 'module-path'; module-path='/lib64/syslog-ng', module='afsql' [ OK ] 三、syslog-ng客戶端配置記錄(192.168.10.206) 將客戶端伺服器nginx日誌通過管道檔案傳輸到日誌伺服器上(即輸出到syslog-ng伺服器端) [root@web-node01 ~]# cp /etc/syslog-ng/syslog-ng.conf /etc/syslog-ng/syslog-ng.conf.bak [root@web-node01 ~]# vim /etc/syslog-ng/syslog-ng.conf ...... options { flush_lines (0); time_reopen (10); log_fifo_size (1000); long_hostnames (off); use_dns (no); use_fqdn (no); create_dirs (yes); #修改為yes keep_hostname (yes); }; ...... source s_slog { pipe("/data/kevin/log.pipe"); }; ...... destination d_slog { udp(192.168.10.205 port(514)); }; #ip為syslog-ng服務端ip地址 ...... log { source(s_slog); destination(d_slog); }; 建立管道檔案 [root@web-node01 ~]# mkdir /data/kevin [root@web-node01 ~]# mkfifo /data/kevin/log.pipe 啟動syslog-ng服務 [root@web-node01 ~]# /etc/init.d/syslog-ng start Plugin module not found in 'module-path'; module-path='/lib64/syslog-ng', module='afsql' Starting syslog-ng: Plugin module not found in 'module-path'; module-path='/lib64/syslog-ng', module='afsql' [ OK ] 驗證測試: 比如將客戶端nginx服務日誌資訊匯入到管道檔案中 [root@web-node01 ~]# tail -f /etc/nginx/logs/access.log >> /data/kevin/log.pipe & [root@web-node01 ~]# ps -ef|grep -v grep|grep "tail -f /etc/nginx/logs/access.log" root 28598 25044 0 15:08 pts/2 00:00:00 tail -f /etc/nginx/logs/access.log 接著去syslon-ng的服務端檢視,發現日誌已經傳過來了。 注意這個日誌傳輸是實施在刷的,也就是說只要syslog-ng客戶端那邊的日誌實時在刷,服務端這邊就會實時地接收過來。 [root@syslog-ng ~]# tail -f /data/syslog-ng/kevin.log Jul 4 15:08:40 web-node01 172.17.13.18 - [04/Jul/2018:15:05:04 +0800] "GET / HTTP/1.1" 403 571 "-" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 - 0.000 - - - Jul 4 15:08:40 web-node01 172.17.13.18 - [04/Jul/2018:15:05:04 +0800] "GET /favicon.ico HTTP/1.1" 404 571 "http://192.168.10.206:8080/" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 - 0.000 - - - Jul 4 15:08:40 web-node01 172.17.13.18 - [04/Jul/2018:15:05:32 +0800] "GET /a.txt HTTP/1.1" 200 10 "-" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 - 0.000 - - - Jul 4 15:08:40 web-node01 172.17.13.18 - [04/Jul/2018:15:08:05 +0800] "GET /a.txt HTTP/1.1" 304 0 "-" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 - 0.000 - - - Jul 4 15:08:40 web-node01 172.17.13.18 - [04/Jul/2018:15:08:06 +0800] "GET /a.txt HTTP/1.1" 304 0 "-" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 - 0.000 - - - Jul 4 15:08:40 web-node01 172.17.13.18 - [04/Jul/2018:15:08:06 +0800] "GET /a.txt HTTP/1.1" 304 0 "-" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 - 0.000 - - - Jul 4 15:08:40 web-node01 172.17.13.18 - [04/Jul/2018:15:08:07 +0800] "GET /a.txt HTTP/1.1" 304 0 "-" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 - 0.000 - - - Jul 4 15:08:40 web-node01 172.17.13.18 - [04/Jul/2018:15:08:28 +0800] "GET /a.txt HTTP/1.1" 200 1136 "-" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 - 0.000 - - - Jul 4 15:08:40 web-node01 172.17.13.18 - [04/Jul/2018:15:08:29 +0800] "GET /a.txt HTTP/1.1" 304 0 "-" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 - 0.000 - - - 到此,一個簡單的syslog-ng日誌集中管理服務環境就部署成功了。 ======================================================================================== 需要注意的是: 上面實驗僅僅是傳輸了客戶端的nginx日誌到遠端日誌伺服器上,其實是可以配置傳輸多個日誌的,只需要: 1)在syslog-ng服務端和客戶端的syslog-ng.conf檔案裡配置多個source及destination即可! 2)多個配置時,記住埠一定不能配置成一樣的,否則多個日誌會被傳輸到遠端伺服器的同一個日誌裡!!預設埠是514,多配置的時候,可以用比如5514、5515、5516等埠。 如在上面配置傳輸nginx日誌的基礎上,再輸出客戶機的/var/log/message日誌、/var/log/redis/redis.log日誌和/var/log/slapd/slapd.log日誌到syslog-ng伺服器端,則需要新增操作: 1)在syslog-ng伺服器端(192.168.10.205)需要新增配置: [root@syslog-ng ~]# vim /etc/syslog-ng/syslog-ng.conf ...... source s_mem { udp(ip(0.0.0.0) port(5514)); }; source s_redis { udp(ip(0.0.0.0) port(5515)); }; source s_slapd { udp(ip(0.0.0.0) port(5516)); }; ...... destination d_mem { file("/data/syslog-ng/mem.log"); }; destination d_redis { file("/data/syslog-ng/redis.log"); }; destination d_slapd { file("/data/syslog-ng/slapd.log"); }; ...... log { source(s_mem); destination(d_mem); }; log { source(s_redis); destination(d_redis); }; log { source(s_slapd); destination(d_slapd); }; 建立日誌存放檔案 [root@syslog-ng ~]# touch /data/syslog-ng/mem.log [root@syslog-ng ~]# touch /data/syslog-ng/redis.log [root@syslog-ng ~]# touch /data/syslog-ng/slapd.log [root@syslog-ng ~]# chmod 600 /data/syslog-ng/mem.log [root@syslog-ng ~]# chmod 600 /data/syslog-ng/redis.log [root@syslog-ng ~]# chmod 600 /data/syslog-ng/slapd.log 重啟syslog-ng服務 [root@syslog-ng ~]# /etc/init.d/syslog-ng restart Stopping syslog-ng: [ OK ] Plugin module not found in 'module-path'; module-path='/lib64/syslog-ng', module='afsql' Starting syslog-ng: Plugin module not found in 'module-path'; module-path='/lib64/syslog-ng', module='afsql' [ OK ] [root@syslog-ng ~]# lsof -i:514 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME syslog-ng 32260 root 10u IPv4 108534591 0t0 UDP *:syslog [root@syslog-ng ~]# lsof -i:5514 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME syslog-ng 32260 root 11u IPv4 108534592 0t0 UDP *:5514 [root@syslog-ng ~]# lsof -i:5515 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME syslog-ng 32260 root 12u IPv4 108534593 0t0 UDP *:5515 [root@syslog-ng ~]# lsof -i:5516 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME syslog-ng 32260 root 13u IPv4 108534594 0t0 UDP *:5516 2)在syslog-ng客戶端(192.168.10.206)需要新增配置: [root@web-node01 ~]# vim /etc/syslog-ng/syslog-ng.conf ...... source s_smem { pipe("/data/kevin/mem.pipe"); }; source s_sredis { pipe("/data/kevin/redis.pipe"); }; source s_slapd { pipe("/data/kevin/slapd.pipe"); }; ...... destination d_smem { udp(192.168.10.205 port(5514)); }; destination d_sredis { udp(192.168.10.205 port(5515)); }; destination d_slapd { udp(192.168.10.205 port(5516)); }; ...... log { source(s_smem); destination(d_smem); }; log { source(s_sredis); destination(d_sredis); }; log { source(s_slapd); destination(d_slapd); }; 建立管道檔案 [root@web-node01 ~]# mkfifo /data/kevin/mem.pipe [root@web-node01 ~]# mkfifo /data/kevin/redis.pipe [root@web-node01 ~]# mkfifo /data/kevin/slapd.pipe 重啟syslog-ng服務 [root@web-node01 ~]# /etc/init.d/syslog-ng restart Stopping syslog-ng: [ OK ] Plugin module not found in 'module-path'; module-path='/lib64/syslog-ng', module='afsql' Starting syslog-ng: Plugin module not found in 'module-path'; module-path='/lib64/syslog-ng', module='afsql' [ OK ] 然後進行日誌傳輸 [root@web-node01 ~]# tail -f /var/log/messages >> /data/kevin/mem.pipe & [root@web-node01 ~]# tail -f /var/log/redis/redis.log >> /data/kevin/redis.pipe & [root@web-node01 ~]# tail -f /var/log/slapd/slapd.log >> /data/kevin/slapd.pipe & [root@web-node01 kevin]# ps -ef|grep "tail -f" root 4296 4295 0 15:53 ? 00:00:00 tail -f /var/log/messages root 4302 25044 0 15:54 pts/2 00:00:00 tail -f /etc/nginx/logs/access.log root 4360 25044 0 15:54 pts/2 00:00:00 tail -f /var/log/redis/redis.log root 4431 25044 0 15:54 pts/2 00:00:00 tail -f /var/log/slapd/slapd.log 3)最後去syslog-ng伺服器檢視,發現日誌已經成功傳輸過來了! [root@syslog-ng ~]# ll /data/syslog-ng total 48 -rw-------. 1 root root 5062 Jul 4 15:54 kevin.log -rw-------. 1 root root 30279 Jul 4 15:55 mem.log -rw-------. 1 root root 984 Jul 4 15:54 redis.log -rw-------. 1 root root 1049 Jul 4 15:54 slapd.log [root@syslog-ng ~]# tail -f /data/syslog-ng/mem.log #如下日誌的前面可以判斷這些日誌是從哪臺客戶機傳過來的(web-node01這是客戶機的主機名) Jul 4 15:29:59 web-node01 openldap-slave Keepalived_vrrp[2637]: VRRP_Instance(VI_1) ignoring received advertisment... Jul 4 15:30:01 web-node01 openldap-slave Keepalived_vrrp[2637]: (VI_1): ip address associated with VRID 51 not present in MASTER advert : 192.168.10.208 Jul 4 15:30:01 web-node01 openldap-slave Keepalived_vrrp[2637]: bogus VRRP packet received on eth0 !!! Jul 4 15:30:01 web-node01 openldap-slave Keepalived_vrrp[2637]: VRRP_Instance(VI_1) ignoring received advertisment... Jul 4 15:30:07 web-node01 openldap-slave Keepalived_vrrp[2637]: (VI_1): ip address associated with VRID 51 not present in MASTER advert : 192.168.10.208 [root@syslog-ng ~]# tail -f /data/syslog-ng/redis.log Jul 4 15:54:19 web-node01 25274:S 07 May 10:37:15.851 * Background append only file rewriting started by pid 25277 Jul 4 15:54:19 web-node01 25274:S 07 May 10:37:15.910 * AOF rewrite child asks to stop sending diffs. Jul 4 15:54:19 web-node01 25277:C 07 May 10:37:15.910 * Parent agreed to stop sending diffs. Finalizing AOF... Jul 4 15:54:19 web-node01 25277:C 07 May 10:37:15.910 * Concatenating 0.00 MB of AOF diff received from parent. Jul 4 15:54:19 web-node01 25277:C 07 May 10:37:15.910 * SYNC append only file rewrite performed Jul 4 15:54:19 web-node01 25277:C 07 May 10:37:15.910 * AOF rewrite: 6 MB of memory used by copy-on-write [root@syslog-ng syslog-ng]# tail -f slapd.log May 22 16:20:13 web-node01 openldap-slave slapd[30022]: conn=1017 op=1 SRCH base="dc=kevin,dc=com" scope=2 deref=0 filter="(objectClass=*)" May 22 16:20:13 web-node01 openldap-slave slapd[30022]: conn=1017 op=1 SRCH attr=* + May 22 16:38:00 web-node01 openldap-slave slapd[30022]: conn=1018 fd=24 ACCEPT from IP=[::1]:60196 (IP=[::]:389) May 22 16:38:00 web-node01 openldap-slave slapd[30022]: conn=1018 op=0 BIND dn="cn=Manager,dc=kevin,dc=com" method=128 May 22 16:38:00 web-node01 openldap-slave slapd[30022]: conn=1018 op=0 BIND dn="cn=Manager,dc=kevin,dc=com" mech=SIMPLE ssf=0
=======================溫馨提示========================
在將客戶機日誌傳輸到遠端syslog-ng伺服器上後,為了方便檢視日誌是出於哪臺客戶機,需要在日誌傳輸過程中進行打上標記。
比如在上面客戶機傳輸nginx日誌時打上標記,比如: 1)如果標記為web-node01-nginx.log,做法為: 在客戶機上先建立管道檔案,接著重啟syslo-ng服務,然後再打標記,最後進行檔案傳輸 [root@web-node01 ~]# mkfifo /data/kevin/log.pipe [root@web-node01 ~]# /etc/init.d/syslog-ng start [root@web-node01 ~]# sed -ri 's/(^.)/web-node01-nginx.log--\1/' /etc/nginx/logs/access.log [root@web-node01 ~]# tail -f /etc/nginx/logs/access.log >> /data/kevin/log.pipe & 檢視客戶機的/etc/nginx/logs/access.log日誌,發現標記已經打上了 [root@web-node01 ~]# tail -f /etc/nginx/logs/access.log web-node01-nginx.log--172.16.42.183 - [04/Jul/2018:16:52:10 +0800] "GET /a.txt HTTP/1.1" 200 1136 "-" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 - 0.000 - - - web-node01-nginx.log--172.16.42.183 - [04/Jul/2018:16:52:10 +0800] "GET /favicon.ico HTTP/1.1" 404 571 "http://192.168.10.206:8080/a.txt" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 - 0.000 - - - web-node01-nginx.log--172.16.42.183 - [04/Jul/2018:16:52:10 +0800] "GET /a.txt HTTP/1.1" 200 1136 "-" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 - 0.000 - - - 然後去syslong-ng伺服器端,檢視傳輸過來的nginx日誌,發現也打上了標記 [root@syslog-ng ~]# tail -f /data/syslog-ng/kevin.log Jul 4 17:47:27 web-node01 web-node01-nginx.log--172.16.42.183 - [04/Jul/2018:16:52:10 +0800] "GET /a.txt HTTP/1.1" 200 1136 "-" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 - 0.000 - - - Jul 4 17:47:27 web-node01 web-node01-nginx.log--172.16.42.183 - [04/Jul/2018:16:52:10 +0800] "GET /favicon.ico HTTP/1.1" 404 571 "http://192.168.10.206:8080/a.txt" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 - 0.000 - - - Jul 4 17:47:27 web-node01 web-node01-nginx.log--172.16.42.183 - [04/Jul/2018:16:52:10 +0800] "GET /a.txt HTTP/1.1" 200 1136 "-" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 - 0.000 - - - 2)標記為kevin-test-haha,做法為: [root@web-node01 ~]# sed -ri 's/(^.)/kevin-test-haha--\1/' /etc/nginx/logs/access.log [root@web-node01 ~]# tail -f /etc/nginx/logs/access.log >> /data/kevin/log.pipe & 檢視客戶機的/etc/nginx/logs/access.log日誌,發現標記已經打上了 [root@web-node01 ~]# tail -f /etc/nginx/logs/access.log kevin-test-haha--172.16.42.183 - [04/Jul/2018:16:54:22 +0800] "GET /a.txt HTTP/1.1" 304 0 "-" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 - 0.000 - - - kevin-test-haha--172.16.42.183 - [04/Jul/2018:16:54:23 +0800] "GET /a.txt HTTP/1.1" 304 0 "-" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 - 0.000 - - - kevin-test-haha--172.16.42.183 - [04/Jul/2018:17:50:43 +0800] "GET /a.txt HTTP/1.1" 304 0 "-" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 - 0.000 - - - 然後去syslong-ng伺服器端,檢視傳輸過來的nginx日誌,發現也打上了標記 [root@syslog-ng ~]# tail -f /data/syslog-ng/kevin.log Jul 4 17:54:03 web-node01 kevin-test-haha--172.16.42.183 - [04/Jul/2018:16:54:22 +0800] "GET /a.txt HTTP/1.1" 304 0 "-" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 - 0.000 - - - Jul 4 17:54:03 web-node01 kevin-test-haha--172.16.42.183 - [04/Jul/2018:16:54:23 +0800] "GET /a.txt HTTP/1.1" 304 0 "-" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 - 0.000 - - - Jul 4 17:54:03 web-node01 kevin-test-haha--172.16.42.183 - [04/Jul/2018:17:50:43 +0800] "GET /a.txt HTTP/1.1" 304 0 "-" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 - 0.000 - - - 3)其他日誌打標記,做法和上面類似。 注意:最好不要打多次標記,否則日誌裡就會顯示多次標記!
=====================補充擴充套件:syslog-ng知識詳解====================
一、syslog-ng設計原則 syslog-ng替代syslog是基於以下的設計原則的: - 通過正規表示式協助,除支援原facility/level方式,還支援內容過濾等以建立更好的訊息過濾機制; - 支援主機鏈,即使日誌訊息經過多重網路轉發,仍可找到原發出主機的資訊和整個訊息鏈; - 支援強大的自定義配置,並且清晰、明瞭。 二、syslog-ng架構 syslog-ng的配置基於下面的架構: LOG STATEMENTS 『SOURCES - FILTERS - DESTINATIONS』 訊息路徑 『訊息源 - 過濾器 - 目的站』 也就是說,通過定義多個訊息源,把匹配上若干個過濾器的訊息導向到指定的目的地,從而組成一個訊息路徑。 三、配置引數 1)訊息源SOURCES 定義格式為: source { sourcedriverparams; sourcedriverparams; ... }; 含義:一個訊息源的標識 sourcedriver:訊息源驅動器,可以支援若干引數,並使用分號“;”隔離多個訊息源驅動器 訊息源驅動器有: file (filename) :從指定的檔案讀取日誌資訊 unix-dgram (filename) :開啟指定的SOCK_DGRAM模式的unix套接字,接收日誌訊息 unix-stream (filename) :開啟指定的SOCK_STREAM模式的unix套接字,接收日誌訊息 udp ( (ip),(port) ) :在指定的UDP埠接收日誌訊息 tcp ( (ip),(port) ) :在指定的TCP埠接收日誌訊息 sun-streams (filename) :在solaris系統中,開啟一個(多個)指定的STREAM裝置,從其中讀取日誌訊息 internal() : syslog-ng內部產生的訊息 pipe(filename),fifo(filename) :從指定的管道或者FIFO裝置,讀取日誌資訊 例如: source s_sys { file ("/proc/kmsg" log_prefix("kernel: ")); unix-stream ("/dev/log"); internal(); # udp(ip(0.0.0.0) port(514)); #如果取消註釋,則可以從udp的514埠獲取訊息 }; 注意: linux使用/dev/log作為SOCK_STREAM unix的套接字,BSD使用/var/run/log;引數需要使用括號括住。 2)過濾器 FILTERS 定義格式為: filter { expression; }; 含義:一個過濾器標識 expression:表示式 表示式支援: 邏輯操作符:and(和)、or(或)、not(非); 函式:可使用正規表示式描述內容 過濾函式有: 引用 facility(,):根據facility(裝置)選擇日誌訊息,使用逗號分割多個facility level(,):根據level(優先順序)選擇日誌訊息,使用逗號分割多個level,或使用“..”表示一個範圍 program(regexp):日誌訊息的程式名是否匹配一個正規表示式 host(regexp):日誌訊息的主機名是否和一個正規表示式匹配 match(regexp):對日誌訊息的內容進行正則匹配 filter():呼叫另一條過濾規則並判斷它的值 例如: filter f_filter2 { level(info..emerg) and not facility(mail,authpriv,cron); }; 注意: 這裡的level定義info,相當於syslog的.=info,並不包括更低的等級; 若需要包括更低的等級,請使用“..”表示一個等級範圍; 另外,filter(DEFAULT),用於捕獲所有沒有匹配上的日誌訊息。filter(*)是無效的。 3)目的地DESTINATIONS 定義格式為: destination { destdriverparams; destdriverparams; ... ;}; 含義:一個目的地的標識 destdriver:目的地驅動器 目的地驅動器有: file (filename) :把日誌訊息寫入指定的檔案 unix-dgram (filename) :把日誌訊息寫入指定的SOCK_DGRAM模式的unix套接字 unix-stream (filename) :把日誌訊息寫入指定的SOCK_STREAM模式的unix套接字 udp (ip),(port) :把日誌訊息傳送到指定的UDP埠 tcp (ip),(port) :把日誌訊息傳送到指定的TCP埠 usertty(username) :把日誌訊息傳送到已經登陸的指定使用者終端視窗 pipe(filename),fifo(filename) :把日誌訊息傳送到指定的管道或者FIFO裝置 program(parm) :啟動指定的程式,並把日誌訊息傳送到該程式的標準輸入 舉例: destination d_mesg { file("/var/log/messages"); }; destination d_syslog { udp ("192.168.228.225" port(514)); }; 注意: 配合使用udp或tcp即可實現集中的日誌伺服器。注意,udp函式的寫法上和訊息源驅動器中的定義不同。 4)訊息路徑LOG STATEMENTS 定義格式為: log { source S1; source S2; ... filter F1; filter F2; ... destination D1; destination D2; ... }; 把訊息源、過濾器、訊息目的組合起來就形成一條完整的指令。日誌路徑中的成員是順序執行的。凡是來源於指定的訊息源,匹配所有指定的過濾器,並送到指定的地址。 注意: 同樣的,每條日誌訊息都會經過所有的訊息路徑,並不是匹配後就不再往下執行的,請留意。 四、選項引數 除了上述的訊息路徑定義外,syslog-ng還可以設定一些選項引數以優化其操作。 全域性的選項引數,定義在配置檔案的開頭位置(yum install -y man): # man syslog-ng.conf # man 8 syslog-ng options { opt1; opt2; ... }; 選項有: chain_hostnames(yes|no) :是否開啟主機名鏈功能,開啟後可在多網路段轉發日誌時有效 long_hostnames(yes|no) : 是chain_hostnames的別名,已不建議使用 keep_hostname(yes|no) : 是否保留日誌訊息中儲存的主機名稱,否時,總是使用來源主機來作重寫日誌的主機名 use_dns(yes|no) : 是否開啟DNS查詢功能,應使用防火牆保護使用syslog-ng的節點安全,並確認所有主機都是可以通過dns解釋的,否則請關閉該選項。 use_fqdn(yes|no) : 是否使用完整的域名 check_hostname(yes|no) : 是否檢查主機名有沒有包含不合法的字元 bad_hostname(regexp) : 可通過正規表示式指定某主機的資訊不被接受 dns_cache(yes|no) : 是否開啟DNS快取功能 dns_cache_expire(n) : DNS快取功能開啟時,一個成功快取的過期時間 dns_cache_expire_failed(n) : DNS快取功能開啟時,一個失敗快取的過期時間 dns_cache_size(n) : DNS快取保留的主機名數量 create_dirs(yes|no) : 當指定的目標目錄不存在時,是否建立該目錄 dir_owner(uid) : 目錄的UID dir_group(gid) : 目錄的GID dir_perm(perm) : 目錄的許可權,使用八進位制方式標註,例如0644 owner(uid) : 檔案的UID group(gid) : 檔案的GID perm(perm) : 檔案的許可權,同樣,使用八進位制方式標註 gc_busy_threshold(n) : 當syslog-ng忙時,其進入垃圾資訊收集狀態的時間。一旦分派的物件達到這個數字,syslog-ng就啟動垃圾資訊收集狀態。預設值是:3000。 gc_idle_threshold(n) : 當syslog-ng空閒時,其進入垃圾資訊收集狀態的時間。一旦被分派的物件到達這個數字,syslog-ng就會啟動垃圾資訊收集狀態,預設值是:100 log_fifo_size(n) : 輸出佇列的行數 log_msg_size(n) : 訊息日誌的最大值(bytes) mark(n) : 多少時間(秒)寫入兩行MARK資訊供參考,目前沒有實現 stats(n) : 多少時間(秒)寫入兩行STATUS資訊供,預設值是:600 sync(n) : 快取多少行的資訊再寫入檔案中,0為不快取,區域性引數可以覆蓋該值。 time_reap(n) : 在沒有訊息前,到達多少秒,即關閉該檔案的連線 time_reopen(n) : 對於死連線,到達多少秒,會重新連線 use_time_recvd(yes|no) : 巨集產生的時間是使用接受到的時間,還是日誌中記錄的時間;建議使用R_的巨集代替接收時間,S_的巨集代替日誌記錄的時間,而不要依靠該值定義。 例如: options { sync (0); time_reopen (10); log_fifo_size (1000); long_hostnames (off); use_dns (no); use_fqdn (no); create_dirs (no); keep_hostname (yes); }; 五、部分函式的引數 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檔案。 六、關於垃圾收集狀態 當滿足一定的條件,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就進入垃圾資訊收集狀態的時間。該值應該比較高,以保證正常情況下不會打斷日誌訊息的收取。