友情提醒:本文系统环境vmware 10+Centos 6.6 x86_64,以下涉及到的命令和用法请谨慎使用。

       内容概括:

                (1)rsyslog的配置文件与日志内容结构解读

                (2)使用rsyslog做一台日志服务器

                (3)rsyslog日志文件的轮替

                (4)rsyslog与mysql结合将日志信息写入数据库并使用loganalyzer进行管理

    日志对于系统的重要性不言而喻,比如对于故障诊断和***检测,没有日志几乎寸步难行。吐槽一下:微软你妹的,就不能把日志做的能让人看明白些,全是错误代码,去你官网查代码含义得到的也是让人费解。在此表扬一下Centos 6.6上使用的日志系统,记录的日志清晰明了,简单易读。收起恶心微软的心态,随我去看下centos6.6上的rsyslog 日志系统吧。

    一.rsyslog的配置文件与日志内容结构

    rsyslog是Centos6.6上用于记录应用程序产生日志的工具,当然应用程序自带日志记录工具的话就不使用rsyslog,比如httpd。rsyslog的官网是: http://www.rsyslog.com 

    在Centos 6.6 x86_64 上由rpm包:rsyslog-5.8.10-8.el6.x86_64.rpm 安装提供。

   ----------------------------------------------------

    /etc/rc.d/init.d/rsyslog 为rsyslog程序的启动管理脚本。

    /etc/sysconfig/rsyslog 为向rsyslog程序传递的参数文件。

    /etc/rsyslog.conf 是rsyslog的主配置文件。
    /etc/rsyslog.d 是rsyslog的辅助配置文件目录,以Centos特性,当配置项与主配置文件产生冲突时,以该辅助配置文件中的配置项信息为准。

    /sbin/rsyslogd 是二进制主程序。

    /lib64/rsyslog/*.so是rsyslog的模块文件。

    /usr/share/doc/rsyslog-5.8.10/ 是文档文件目录

    /usr/share/man/man5/rsyslog.conf.5.gz 是rsyslog主配置文件的man手册
    /usr/share/man/man8/rsyslogd.8.gz 是rsyslog 二进制主程序rsyslogd的man手册

    /var/log/ 是放置rsyslog记录的日志文件的位置。

    --------------------------------------------------

    rsyslog的主配置文件/etc/rsyslog.conf的结构和内容:

    默认情况下主配置文件/etc/rsyslog.conf由3部分组成:

    1) #### MODULES ####  --->启动/sbin/rsyslogd要加载的模块

        格式:

               $ModLoad module-name #注释

         $ModLoad 是关键字(/sbin/rsyslogd程序中定义的变量名)

         module-name:出现在/lib64/rsyslog/ 中的模块名称,记住不带.so

 

    2)  #### GLOBAL DIRECTIVES #### ----->全局规则设定

         格式:

               #注释

               规则内容

          例如:

             # Include all config files in /etc/rsyslog.d/
             $IncludeConfig /etc/rsyslog.d/*.conf

             含义为启动时要读取/etc/rsyslog.d/中所有以.conf为结尾的文件

    3) #### RULES #### ----->明细程序日志记录设定

       格式:

           #注释

           facility.priority         target

       

        facility:可理解为“产生日志对象”,例如:authpriv 是登陆认证的,mail 是邮件系统的。

       

        priority:指定的是日志级别,centos使用的日志级别如下,由低到高为:

            debug
            info
            notice
            warn, warning
            err, error
            crit
            alert
            emerg, panic

            级别越低产生的日志越明细越多,级别越高产生的日志越危险越少。

            指定级别的方式:
                *: 所有级别
                none: 没有级别,就是不记录的意思
                priority: 比此级别低的(包含该级别的)所有日志信息都会记录
                =priority: 仅记录指定级别


        target:将日志记录于指定的目标地点,可以有:

             系统文件中,例如:/var/log/secure

             用户:将日志信息通知给用户。

                  例如:系统默认emerg等级的日志就显示给系统上登陆用户:

                   # Everybody gets emergency messages
                   *.emerg                                                 *

             日志服务器:使用 @SERVER_ADDRESS 定义日志服务器地址

             管道:通过管道传递给某些命令。 | COMMAND

             在target前使用“-”表示异步写入。

      

        举例:

*.info;mail.none;authpriv.none;cron.none                /var/log/messages

含义:系统上所有程序(不包括mail,authprive,cron这些程序)产生的,info等级还有比info等级低的debug等级的日志信息记录在/var/log/messages中。

     ------------------------------------------------------

    日志内容:以/var/log/secure中一条目为例

    May  9 07:52:33 Test01 sshd[1882]: Accepted password for root from 192.168.100.100 port 49818 ssh2

    May  9 07:52:33:日志条目产生的时间

    Test01:日志条目产生的主机(产生事件的地点)

    sshd[1882]:产生日志条目的程序和进程号(产生日志的人物)

    Accepted password for root from 192.168.100.100 port 49818 ssh2:日志内容(产生的时间事件)

     时间,地点,人物,事件--》这不就是中小学学的记叙文四要素嘛!!!


  二.使用rsyslog做一台日志服务器

    实验拓扑:

Centos6.6上rsyslog一些用法和扩展_第1张图片


    实验角色设定:

主机
IP地址
角色
Test01
192.168.100.1/24
日志服务器,接收局域网服务器产生的日志
Test02
192.168.100.2/24
日志产生主机,将产生的登陆认证日志通过局域网传递给日志服务器记录。

    实验过程:

日志产生主机Test02上的配置:

    2.1)设定selinux状态和iptables防火墙

#测试网络连通性
[root@Test02 ~]# ping -c 1 192.168.100.1
PING 192.168.100.1 (192.168.100.1) 56(84) bytes of data.
64 bytes from 192.168.100.1: icmp_seq=1 ttl=64 time=3.75 ms
--- 192.168.100.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 4ms
rtt min/avg/max/mdev = 3.759/3.759/3.759/0.000 ms

#设定selinux状态为Permissive
[root@Test02 ~]# setenforce 0

#设定防火墙
[root@Test02 ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22 
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@Test02 ~]#


    2.2)修改rsyslog的配置文件,将登陆认证日志发向Test01

[root@Test02 ~]# vim /etc/rsyslog.conf 
修改:
# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure
authpriv.*                                              @192.168.100.1   
:wq

    2.3)重启rsyslog进程

[root@Test02 ~]# service rsyslog  restart
Shutting down system logger:                               [  OK  ]
Starting system logger:                                    [  OK  ]
[root@Test02 ~]#


日志服务器Test01上的配置:

    2.4)修改rsyslog配置文件启用UDP514端口

[root@Test01 ~]# vim /etc/rsyslog.conf 
# Provides UDP syslog reception
$ModLoad imudp$UDPServerRun 514
:wq

    2.5)重启rsyslog进程并观察端口

[root@Test01 ~]# service rsyslog restart
Shutting down system logger:                               [  OK  ]
Starting system logger:                                    [  OK  ]
[root@Test01 ~]# 
[root@Test01 ~]# ss -uapn | grep --color 514
UNCONN     0      0                         *:514                      *:*      users:(("rsyslogd",3509,3))
UNCONN     0      0                        :::514                     :::*      users:(("rsyslogd",3509,4))
[root@Test01 ~]#

    2.6)设定防护墙和selinux

[root@Test01 ~]# setenforce 0
[root@Test01 ~]# iptables -IINPUT 2 -p udp -s 192.168.100.0/24 -d 192.168.100.1 --dport 514 -j ACCEPT
[root@Test01 ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
ACCEPT     udp  --  192.168.0.0/24       192.168.100.1       udp dpt:514 
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22 
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@Test01 ~]#

    2.7)在Test02上用户登录观察Test01种/var/log/secure文件是否有关于Test02上登陆信息写入

Centos6.6上rsyslog一些用法和扩展_第2张图片


    三. rsyslog的日志文件的轮替

   

系统的日志文件会随着使用天数和发生事件的增加在自动增长,对于7*24*365运行的服务器来说,如果没有一种机制限制这种增长,那么会有大部分的硬盘被消耗掉,linux系统设计了一种方式来解决这个问题:日志轮替。

 日志轮替就是使用一个程序名为/usr/sbin/logrotate程序根据配置文件的设定,使用同名的空的日志文件替换现有的日志文件,被替换掉的日志文件,被改名后放置或删除掉


日志文件轮替示意图:

Centos6.6上rsyslog一些用法和扩展_第3张图片


    /usr/sbin/logrotate使用的配置文件有2类:

主配置文件/etc/logrotate.conf

辅助配置文件/etc/logrotate.d/*

     *相同配置选项,辅助配置文件中的设定优先被使用。

     logrotate是依靠cron任务实现日志轮替执行的:

[root@Test01 logrotate.d]# rpm -qf /usr/sbin/logrotate
logrotate-3.7.8-17.el6.x86_64
[root@Test01 logrotate.d]# rpm -ql logrotate
/etc/cron.daily/logrotate  ----------------》看到了该程序安装后在cron.daily下建立的任务
/etc/logrotate.conf
/etc/logrotate.d
/usr/sbin/logrotate
/usr/share/doc/logrotate-3.7.8
/usr/share/doc/logrotate-3.7.8/CHANGES
/usr/share/doc/logrotate-3.7.8/COPYING
/usr/share/man/man5/logrotate.conf.5.gz
/usr/share/man/man8/logrotate.8.gz
/var/lib/logrotate.status
[root@Test01 logrotate.d]#

   

主配置文件/etc/logrotate.conf中设定:

[root@Test01 ~]# less /etc/logrotate.conf | egrep -v '(^$|^#)'
weekly     ------->设定轮替期限为每周
rotate 4   ------->轮替后旧的日志文件保留4个周期
create     ------->创建新的空白文件
dateext    ------->使用时间做为轮替后文件的后缀
include /etc/logrotate.d  ----->程序启动同时读取该目录下文件的内容为轮替配置文件
/var/log/wtmp {           ----->针对/var/log/wtmp的做的设定
monthly                   ----->轮替周期为每月
create 0664 root utmp     ----->创建新的空白文件,权限为0664,属主root 属组utmp
minsize 1M                ----->当日志文件达到1M时,也可触发轮替
rotate 1                  ----->每次轮替后只保留1个旧文档
}
/var/log/btmp {           ----->针对/var/log/btmp做的设定
missingok                 ----->在做轮替时发生数据丢失也没问题 
monthly    
create 0600 root utmp    
rotate 1
}
[root@Test01 ~]#

辅助配置文件:/etc/logrotate.d/*

[root@Test01 ~]# cd /etc/logrotate.d
[root@Test01 logrotate.d]# ls     ---->可以看到该目录下文件的命名没有什么特殊要求
cups  dracut  httpd  mcelog  mysqld  numad  psacct  samba  syslog  vsftpd  yum
[root@Test01 logrotate.d]# less httpd
/var/log/httpd/*log {  ---->指明要被轮替的文件的位置
    missingok
    notifempty    --------->如果是空文件的话,不转储
    sharedscripts --------->该轮替动作只做一次,不管/var/log/httpd/*log能匹配多少日志文件
    delaycompress --------->转储的日志文件到下一次转储时才压缩
    postrotate    --------->在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
        /sbin/service httpd reload > /dev/null 2>/dev/null || true --->重新加载httpd配置文件
    endscript     --------->关键字,表示指明命令结束 
}

*更多logrotate的配置参数参见:# man 8 logrotate   


  从辅助配置文件中可以看到,其实设定日志文件轮替很容易:

    1)在/var/logrotate.d/ 下建立文件

    2)在1)建立的文件中指明要轮替的日志文件的位置和轮替参数

    3)让/usr/sbin/logrotate重新加载配置文件即可


小实验:手动实现日志文件的轮替

    1)建立轮替日志文件:/var/log/test.log

[root@Test01 ~]# touch /var/log/test.log
[root@Test01 ~]# cat /etc/inittab >>/var/log/test.log

    2)在/etc/logrotate.d/下建立指导/var/log/test.log轮替的指导文件test

[root@Test01 ~]# touch /etc/logrotate.d/test
[root@Test01 ~]# vim /etc/logrotate.d/test
/var/log/test.log {
    weekly
     minsize 3M
    create
    rotate 3
    compress
    sharedscripts
    postrotate
       /usr/bin/killall -HUP rsyslogd
    endscript
}

    3)使用logrotate命令手动触发轮替:

 # logrotate  [-vf]  logfile

 -v:显示过程

 -f:强制执行轮替,不管是否到达轮替条件。

 Logfile:一般都是 /etc/logrotate.conf

[root@Test01 ~]# ls /var/log
anaconda.ifcfg.log    anaconda.syslog   boot.log    cups        httpd    messages    sa       tallylog  yum.log
anaconda.log          anaconda.xlog     btmp        dmesg       lastlog  mysqld.log  samba    test.log
anaconda.program.log  anaconda.yum.log  ConsoleKit  dmesg.old   maillog  ntpstats    secure   wtmp
anaconda.storage.log  audit             cron        dracut.log  mcelog   prelink     spooler  xferlog
[root@Test01 ~]# logrotate -vf /etc/logrotate.conf 
。。。。。。。。。。
[root@Test01 ~]# ls /var/log/
anaconda.ifcfg.log    boot.log       dmesg.old            messages           secure-20150509       xferlog
anaconda.log          btmp           dracut.log           messages-20150509  spooler               xferlog-20150509
anaconda.program.log  btmp-20150509  dracut.log-20150509  mysqld.log         spooler-20150509      yum.log
anaconda.storage.log  ConsoleKit     httpd                ntpstats           tallylog              yum.log-20150509
anaconda.syslog       cron           lastlog              prelink            test.log
anaconda.xlog         cron-20150509  maillog              sa                 test.log-20150509.gz
anaconda.yum.log      cups           maillog-20150509     samba              wtmp
audit                 dmesg          mcelog               secure             wtmp-20150509
[root@Test01 ~]# vim /etc/logrotate.d/test 
[root@Test01 ~]# ll /var/log/test*
-rw-r--r--. 1 root root   0 May  9 15:47 /var/log/test.log
-rw-r--r--. 1 root root 484 May  9 15:47 /var/log/test.log-20150509.gz
#看到了吧这就是轮替后的被压缩的文件


    四.rsyslog同mariadb数据库结合,实现将日志条目存储于数据库

    实验拓扑:

Centos6.6上rsyslog一些用法和扩展_第4张图片

     实验角色设定:

主机
IP地址
角色
Test01
192.168.100.1
日志服务器,收集局域网认证登陆信息放入数据库中。
提供loganalyzer日志展示工具
Test02
192.168.100.2
日志产生服务器,将登陆认证信息记录至局域网日志服务器中


     实验过程:

日志产生主机Test02上的配置:

    4.1)设定selinux状态和iptables防火墙

#测试网络连通性
[root@Test02 ~]# ping -c 1 192.168.100.1
PING 192.168.100.1 (192.168.100.1) 56(84) bytes of data.
64 bytes from 192.168.100.1: icmp_seq=1 ttl=64 time=3.75 ms
--- 192.168.100.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 4ms
rtt min/avg/max/mdev = 3.759/3.759/3.759/0.000 ms

#设定selinux状态为Permissive
[root@Test02 ~]# setenforce 0

#设定防火墙
[root@Test02 ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22 
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@Test02 ~]#


    4.2)修改rsyslog的配置文件,将登陆认证日志发向Test01

[root@Test02 ~]# vim /etc/rsyslog.conf 
修改:
# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure
authpriv.*                                              @192.168.100.1   
:wq

   4.3)重启rsyslog进程

[root@Test02 ~]# service rsyslog  restart
Shutting down system logger:                               [  OK  ]
Starting system logger:                                    [  OK  ]
[root@Test02 ~]#


日志服务器Test01上的配置:

     4.4)配置和启用mysql数据库

[root@Test01 local]# setenforce 0
[root@Test01 local]# service iptables stop

[root@Test01 local]# service mysqld start
Starting MySQL                                             [  OK  ]
[root@Test01 local]# ss -tlpn | grep --color 3306
LISTEN     0      50                        *:3306                     *:*      users:(("mysqld",1630,15))
[root@Test01 local]#

    4.5)安装rsyslog同maraidb连接的模块

[root@Test01 local]# yum -y install rsyslog-mysql
#这个模块程序包系统光盘上自带的有
[root@Test01 local]# rpm -ql rsyslog-mysql
/lib64/rsyslog/ommysql.so      ---->生成的模块
/usr/share/doc/rsyslog-mysql-5.8.10
/usr/share/doc/rsyslog-mysql-5.8.10/createDB.sql  --->自带的生成rsyslog需要库表的工具
[root@Test01 local]#

   

    4.6)创建rsyslog在mysql中依赖的库和用户

[root@Test01 local]# mysql < /usr/share/doc/rsyslog-mysql-5.8.10/createDB.sql
#这里mysql登陆用户使用的root因为没设定登陆密码,故命令这样使用。

[root@Test01 local]# mysql 
[root@Test01 yum.repos.d]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.1.73 Source distribution
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| Syslog  -----------|-- >多了个Syslog库 
| mysql              |
| performance_schema |
| test               |
| vsftpd             |
+--------------------+
mysql> GRANT ALL ON Syslog.* TO 'lijun'@'127.0.0.1' IDENTIFIED BY 'redhat';
Query OK, 0 rows affected (0.09 sec)
#添加用户lijun用于rsyslog联系数据库

mysql> GRANT ALL ON Syslog.* TO 'lijun'@'localhost' IDENTIFIED BY 'redhat';
Query OK, 0 rows affected (0.00 sec)
#添加用户lijun用于rsyslog联系数据库

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

    4.7)配置rsyslog的主配置启用udp514端口和ommysql.so模块

[root@Test01 local]# vim /etc/rsyslog.conf
#### MODULES ####
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imklog   # provides kernel logging support (previously done by rklogd)
#$ModLoad immark  # provides --MARK-- message capability
$ModLoad ommysql  #启用4.5)种生成的ommysql模块
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

#启用udp514用于监听客户端日志写入

# The authpriv file has restricted access.
#authpriv.*                                              /var/log/secure
authpriv.*                                               :ommysql:127.0.0.1,Syslog,lijun,redhat

#定义将关于登陆认证的信息写入数据库。  :模块名:SQLSERVER地址,库名,用户名,登陆密码

[root@Test01 local]# service rsyslog restart
Shutting down system logger:                               [  OK  ]
Starting system logger:                                    [  OK  ]
[root@Test01 local]#   

    4.8)配置LAMP环境,安装loganalyzer 用于展示maraidb中记录的日志信息

配置LAMP系统环境,

[root@Test01 ~]# yum -y install httpd mysql-server mysql php php-mysql php-gd

安装loganalyzer:

[root@Test01 ~]# cd /var/www/html
[root@Test01 html]# mkdir tool
[root@Test01 html]# cd /root

[root@Test01 ~]# tar -xf loganalyzer-3.6.5.tar.gz
[root@Test01 ~]# cp -r loganalyzer-3.6.5/src/* /var/www/html/tool
[root@Test01 ~]# cp loganalyzer-3.6.5/contrib/* /var/www/html/tool
[root@Test01 ~]# cd /var/www/html/tool/
[root@Test01 tool]# chmod +x configure.sh secure.sh
[root@Test01 tool]# ./configure.sh

[root@Test01 tool]# chown -R apache.apache ./*

下面使用浏览器来安装吧:

Centos6.6上rsyslog一些用法和扩展_第5张图片

 Centos6.6上rsyslog一些用法和扩展_第6张图片


Centos6.6上rsyslog一些用法和扩展_第7张图片


Centos6.6上rsyslog一些用法和扩展_第8张图片

Centos6.6上rsyslog一些用法和扩展_第9张图片



Centos6.6上rsyslog一些用法和扩展_第10张图片

4.9)配置防火墙

[root@Test01 ~]# service iptables  start
[root@Test01 tool]# iptables -IINPUT 2 -p udp -s 192.168.100.0/24 -d 192.168.100.1 --dport 514 -j ACCEPT
[root@Test01 tool]# iptables -IINPUT 3 -p tcp  -s 192.168.100.100 -d 192.168.100.1 --dport 80 -m state --state NEW  -j ACCEPT
[root@Test01 tool]# iptables -IINPUT 4 -p tcp  -d 192.168.100.1 --dport 80 -m state --state NEW  -j DROP

     好吧,这就是rsyslog上一些东东,有错误请指出。一下午又过去了,时间过的太快了!!