zoukankan      html  css  js  c++  java
  • 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就进入垃圾信息收集状态的时间。该值应该比较高,以保证正常情况下不会打断日志消息的收取。
  • 相关阅读:
    原生微信小程序砸金蛋奖程序代码分析
    git 如何恢复到指定版本--很常用的方法
    cupload.js手动插入数据
    asp.net Core3.1自定义权限体系-菜单和操作按钮权限
    linux 解决docker、docker-compose命令权限问题(sudo)
    Supervisor 安装和使用教程
    php 无限级分类查找父节点所有子节点【找出 某节点的子节点】
    bat echo 输出内容为不同的颜色
    git 提交团队项目代码的流程
    bat脚本 切换到其他盘符
  • 原文地址:https://www.cnblogs.com/kevingrace/p/6519504.html
Copyright © 2011-2022 走看看