syslog是Linux系統默認的日誌守護進程,默認的syslog配置文件是/etc/syslog.conf文件。syslog守護進程是可配置的,它容許人們爲每一種類型的系統信息精確地指定一個存放地點。比較 syslog ,syslog-ng 具備衆多高級的功能:更好的網絡支持,更加方便的配置,集中式的網絡日誌存儲,而且更具備彈性。好比,使用syslogd時,全部的iptables日誌與其餘內核日誌一塊兒所有存儲到了kern.log文件裏。Syslog-ng則可讓你有選擇性的將iptables部分分出到另外的日誌文件中。Syslogd僅能使用UDP協議,Syslog-ng 可使用UDP和TCP協議。因此咱們能夠在加密的網絡隧道中傳輸日誌到集中日誌服務器。php
syslog-ng的一個設計原則就是創建更好的消息過濾粒度。syslog-ng可以進行基於內容和優先權/facility的過濾。另外一個設計原則是更容易進行不一樣防火牆網段的信息轉發,它支持主機鏈,即便日誌消息通過了許多計算機的轉發,也能夠找出原發主機地址和整個轉發鏈。最後的一個設計原則就是儘可能使配置文件強大和簡潔。syslog-ng做爲syslog的替代工具,能夠徹底替代syslog的服務,而且經過定義規則,實現更好的過濾功能。以前介紹了Linux下rsyslog日誌收集服務環境部署記錄,下面簡單介紹下syslog-ng日誌集中管理服務部署記錄:html
下面部署實例目的: 實現接收遠程客戶端服務日誌(nginx、mysql、php、apache)保存在本地一臺日誌服務器上提供查看。 即遠程客戶機採用syslog-ng將其日誌經過管道pipe傳送到本地的日誌服務器上進行查看。 1、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】 ============================================================================================== 2、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 ] 3、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,多配置的時候,能夠用好比551四、551五、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服務器上後,爲了方便查看日誌是出於哪臺客戶機,須要在日誌傳輸過程當中進行打上標記。node
好比在上面客戶機傳輸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知識詳解====================mysql
1、syslog-ng設計原則 syslog-ng替代syslog是基於如下的設計原則的: - 經過正規表達式協助,除支持原facility/level方式,還支持內容過濾等以創建更好的消息過濾機制; - 支持主機鏈,即便日誌消息通過多重網絡轉發,仍可找到原發出主機的信息和整個消息鏈; - 支持強大的自定義配置,而且清晰、明瞭。 2、syslog-ng架構 syslog-ng的配置基於下面的架構: LOG STATEMENTS 『SOURCES - FILTERS - DESTINATIONS』 消息路徑 『消息源 - 過濾器 - 目的站』 也就是說,經過定義多個消息源,把匹配上若干個過濾器的消息導向到指定的目的地,從而組成一個消息路徑。 3、配置參數 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; ... }; 把消息源、過濾器、消息目的組合起來就造成一條完整的指令。日誌路徑中的成員是順序執行的。凡是來源於指定的消息源,匹配全部指定的過濾器,並送到指定的地址。 注意: 一樣的,每條日誌消息都會通過全部的消息路徑,並非匹配後就再也不往下執行的,請留意。 4、選項參數 除了上述的消息路徑定義外,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); }; 5、部分函數的參數 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文件。 6、關於垃圾收集狀態 當知足必定的條件,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就進入垃圾信息收集狀態的時間。該值應該比較高,以保證正常狀況下不會打斷日誌消息的收取。