linux下syslog-ng日志集中管理服務部署記錄


 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM