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就进入垃圾信息收集状态的时间。该值应该比较高,以保证正常情况下不会打断日志消息的收取。 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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 运维实践手册