服务器端配置:
首先配置/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
这是syslog日志定义的规定,local3是facility,info是level。具体可以查询syslog定义级别。这里特别注意的是后面还有类似 *.info 记录的一定得注释逃生,否则系统还是会另外记录一份日志,这点至关重要,仔细再检查一下后面的那些摸版是否和我们定义的有重复记录的情况。配置完后别忘了service rsyslog restart重新启动服务。
随后配置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
- }
在这里一定要加posrotate/endscript这段脚本,这样可以使rsyslog程序重新读取配置文件,这样做的作用是让rsyslog程序释放对messages.log文件持有的文件描述符,否则即使日志文件被分割后,rsyslog也不会向新产生的日志文件写数据。举个例子,如果不加这段脚本,即使logrotate程序将messages.log文件截断并重命名为messages.log.1315446541,但是syslog程序仍然会向原messages.log文件中写入数据。我们可以利用kill -HUP命令给进程ID发送signal,促使该PID进程重新启动。
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文件,加入两条规则:
- # 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
我们把local3.info级别的信息发送到192.168.2.3去远程记录,还包括一些其他info信息(排除local3 mail authpriv cron),系统就自动会把syslog的发送去远程,如果本机记录则修改为本地路径即可。
阅读(16097) | 评论(0) | 转发(1) |