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日志集中管理服务部署记录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
下面部署实例目的:
实现接收远程客户端服务日志(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服务器上后,为了方便查看日志是出于哪台客户机,需要在日志传输过程中进行打上标记。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
比如在上面客户机传输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知识详解====================

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
一、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就进入垃圾信息收集状态的时间。该值应该比较高,以保证正常情况下不会打断日志消息的收取。
posted @   散尽浮华  阅读(14980)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
历史上的今天:
2016-03-08 Docker容器基础介绍
2016-03-08 如何查询一个进程下面的线程数(进程和线程区别)
2016-03-08 Zookeeper 运维实践手册
点击右上角即可分享
微信分享提示