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

散盡浮華發表於2017-03-08

 

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

相關文章