服务器端配置:
首先配置/etc/rsyslog.conf文件,去掉前面的#启用下列2项:
- $ModLoad imudp
- $UDPServerRun 514
$IncludeConfig /etc/rsyslog.d/*.conf 可以注意到这一句,这就是rsyslog的配置文件读取的路径和文件名,这里代表这个目录下的所有.conf的文件名都会读取,当然也可以直接指定一个唯一的配置文件,一般默认我们需要把记录的信息添加到50-default.conf,所以配置/etc/rsyslog.d/50-default.conf,(建议备份此文件后清空该文件,达到硬盘空间最大利用)加入一句:
- local3.info -/var/log/ipwall/messages.log
随后配置logrotate的配置文件/etc/logrotate.conf,加入下面的内容:
- /var/log/ipwall/messages.log { #日志路径一定要和rsyslog定义的日志文件路径一致
- rotate 65535 #滚动65535次
- create 0777 syslog adm #设置权限,方便windows连接samba服务器
- compress #采用压缩
- size 50M #文件大小50M以上的分割日志
- dateext
- dateformat .%s #定义文件切割后的文件名,必须配合dateext使用
- postrotate
- /bin/kill -HUP $(/bin/cat /var/run/rsyslogd.pid 2>/dev/null) &>/dev/null
- endscript
- }
logrotate命名方式确实太单调了,默认通过数字后缀来分割,支持时间格式函数格式,但是只支持 %Y %m %d %s这4个函数,由于logrotate确实不支持“小时:分钟”这样的函数,无奈只有写了个脚本把%s的秒数换算成日期+时刻这样的惯用格式,并且我们把日志文件按日期分类到各个文件夹里。我们在
/etc/rsyslog.d/rename.sh 创建一个文件,注意更改执行权限 chmod 755 /etc/rsyslog.d/rename.sh
- #!/bin/bash
-
- /usr/sbin/logrotate /etc/logrotate.conf
- cd /var/log/ipwall
- /bin/ls | /usr/bin/awk -F'.' '/log.*gz/{system("mv "$0" `date -d \"@"$3"\" +%y-%m-%d_%H-%M`.gz")}'
- /bin/ls *gz | /usr/bin/awk -F"_" 'NR==1{i=$1;system("mkdir -p "i"")}{if($1==i)system("mv "$0" "i"")}'
以本案为例,是做的防火墙上网日志记录,要求最大化保存日志,这里就没有设置rotate回滚次数,并且上面的脚本也按照日期把记录的日志分类保存到文件夹内,下面的脚本是当磁盘空间接近饱和的时候删除最早那天的日志文件夹,我们在 chmod 755 /etc/rsyslog.d/delbak.sh 创建更更改权限。
- #!/bin/bash
- SPACE=$(df /var/log/ipwall | awk 'NR==2{print $4}')
- SP=20000000
- cd /var/log/ipwall
- [ $SPACE -le $SP ] && ls -d */ | awk 'NR==1{system("rm -rf "$0"")}'
由于要加入crontab计划运行,所以脚本里的外部命令一定要指定全路径,而且要预先加载环境变量文件:
- echo "* * * * * . /etc/profile;/etc/rsyslog.d/rename.sh" >> /var/spool/cron/crontabs/root
- echo "10 0 * * * /etc/rsyslog.d/delbak.sh" >> /var/spool/cron/crontabs/root
该配置在ubuntu11.04版本下调试通过.至此问题完美解决。
客户端配置:
这里客户端我们使用syslogd,客户端是可以选择本机记录还是选择远程记录,如果是远程记录的话那就是需要用到上述的配置程序等。我们以远程记录为例,修改/etc/syslog.conf文件,加入两条规则:
我们把local3.info级别的信息发送到192.168.2.3去远程记录,还包括一些其他info信息(排除local3 mail authpriv cron),系统就自动会把syslog的发送去远程,如果本机记录则修改为本地路径即可。
- # Netfilter nflog
- local3.info @192.168.2.3
- # Log anything (except mail) of level info or higher.
- *.info;local3.none;mail.none;authpriv.none;cron.none @192.168.2.3