友情提醒:本文系统环境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做一台日志服务器
实验拓扑:
实验角色设定:
主机 |
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上登陆信息写入
三. rsyslog的日志文件的轮替
系统的日志文件会随着使用天数和发生事件的增加在自动增长,对于7*24*365运行的服务器来说,如果没有一种机制限制这种增长,那么会有大部分的硬盘被消耗掉,linux系统设计了一种方式来解决这个问题:日志轮替。
日志轮替就是使用一个程序名为/usr/sbin/logrotate程序根据配置文件的设定,使用同名的空的日志文件替换现有的日志文件,被替换掉的日志文件,被改名后放置或删除掉。
日志文件轮替示意图:
/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数据库结合,实现将日志条目存储于数据库
实验拓扑:
实验角色设定:
主机 |
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 ./*
下面使用浏览器来安装吧:
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上一些东东,有错误请指出。一下午又过去了,时间过的太快了!!