rsyslog配置动态日志文件
来源:互联网 发布:c语言insert函数 编辑:程序博客网 时间:2024/05/21 11:33
近期项目中碰到一个syslog定向日志的问题,使用的是rsyslog(而不是syslog和syslog-ng),需求是根据程序生成syslog日志的syslogtag来将日志定向到$syslogtag.log的文件中,并且使之可以泽时回滚,也就是说文件达到一定大小的时候自动回滚。我对syslog并不是很熟悉,足足看了一下午的手册,实例才有了一个初步印象,然后在第二天上午着手完成自己的工作,第二天下午终于搞定了,然而被领导给否了...不过没有关系,虽然被否了,我还是要将其记录下来,回头用于自己的东西,起码这足足一整天的努力不能付之东流...
我有一个程序VPN,然而会在系统中生成N个实例,N的个数不确定,每个实例我希望将其日志记录在cli_X.log(其中X为自然数)的文件中,然后定义一个规则使之可以在文件大小超过一定量时回滚,我将其rsyslog配置文件放入/etc/rsyslog.d/srv_vpn.conf中,内容为:
而我的检查程序/bin/check-logrotate.sh的内容为:
我的日志回滚配置文件为/cfg/srv_logrotate,其内容为:
最后我有一个测试程序test.c,内容为:
到此为止,over!其实我试过使用多线程绑定多CPU启动将近2000个进程频繁写日志的情况,并不像老大所猜测的那样会导致大量的性能损耗,用top和sar测试没有发现任何问题,毕竟rsyslogd是一个独立的进程,如果觉得实在太忙了,它自己会处理好的,而脚本,根本不算什么,即使你使用:
$outchanel XXX YYY ZZZ
就会好吗?它难道不是也是要每次都判断是否到达了文件的max_size么?所不同的只是少了一个fork的开销而已,对于现在的系统,这根本不算什么。Unix号召每个进程只做一件事,为何要将所有的工作都交给一个程序呢?为何调用脚本就不好呢?这实际上是一个观念问题。如果我不是使用调用脚本的方式,而是写了一个rsyslog plugin或者用了大家都在用的$outchanel-虽然很笨拙的方式,我估计不会是这样的结果。也罢,这并没什么,不是吗?Unix每次只做好一件事,我深深记忆,我希望将多个脚本粘合起来来完成一件复杂的工作,而不是为了维护方便而使用单一的方式,再者,为何说bash脚本对总的代码没有什么共享呢?python好,PHP好,perl也不赖,就bash不好,是自己不喜欢吧,大家都是脚本,一些语法对于不会者都是天书,绝对不能觉得自己熟悉哪方面就要求摒弃其它的。在做事时,需要有一个标准,这是肯定的,大家不能你用python,他用perl,PHP,我用bash,C,需要统一起来,这是真的,但是不能由此而否定其它。我们不能以理论上怎么怎么就下结论,而应该亲自去整一把
我有一个程序VPN,然而会在系统中生成N个实例,N的个数不确定,每个实例我希望将其日志记录在cli_X.log(其中X为自然数)的文件中,然后定义一个规则使之可以在文件大小超过一定量时回滚,我将其rsyslog配置文件放入/etc/rsyslog.d/srv_vpn.conf中,内容为:
# 定义日志消息格式$template VPNDispatch, "%timegenerated% %msg%\n"# 定义动态的VPN客户端日志文件# 下面一行有点诡异,定义了一组动态文件,其中F代表使用分隔符,而91则代表[# 的Ascii码,也就是说使用[作为分隔符取第一个,就是说如果syslogtag是# cli_123[2212]:的话,我只取cli_123$template VPNCliLog, "/log/srv-%syslogtag:F,91:1%.log"# 过滤VPN客户端的日志到VPN客户端日志文件# 下面一行使用新的扩展模式过滤日志,注意“-?XXX”if ($syslogtag startswith 'cli_') then -?VPNCliLog; VPNDispatch# 检查VPN客户端日志是否需要回滚并择时回滚# 对于每写一行日志,都要检查是否需要回滚,检查程序是/bin/check-logrotate.sh# 注意“^XXX”。另外VPNCliLog是一个template,作为参数传给了检查脚本if ($syslogtag startswith 'KOALRHVPNC') then ^/bin/check-logrotate.sh;VPNCliLog
而我的检查程序/bin/check-logrotate.sh的内容为:
#!/bin/bashLOGROTATE_CONF=/cfg/srv_logrotateLOGROTATE_BIN=/usr/sbin/logrotatefile=$1max_size=$(cat $LOGROTATE_CONF |grep size|grep -o [0-9].*)size=$(/bin/ls $file -l|awk -F ' ' '{print $5}');unit=1024;# 得到单位,M或者kMK=$(echo $max_size|grep -o [^0-9])ret=$?max_size=$(echo $max_size|grep -o [0-9]*)# 换算到byteif [ $ret -eq 0 ] && [ $MK == 'G' ]; then let "max_size = $max_size * $unit * $unit * $unit";elif [ $ret -eq 0 ] && [ $MK == 'M' ]; then let "max_size = $max_size * $unit * $unit";elif [ $ret -eq 0 ] && [ $MK == 'k' ]; then let "max_size = $max_size * $unit";fi# 判断是否需要回滚if [ $size -gt $max_size ]; then $LOGROTATE_BIN $LOGROTATE_CONFfi
我的日志回滚配置文件为/cfg/srv_logrotate,其内容为:
size 4Mrotate 5/log/*.log{ missingok nomail rotate 5 compress delaycompress copytruncate create 644 root root}
最后我有一个测试程序test.c,内容为:
#include <syslog.h>#include <stdio.h>#include <stdlib.h>int main(int argc, char **argv){ openlog("cli_12", LOG_PID, LOG_DAEMON); syslog(LOG_DEBUG, "######## test 12 ########"); closelog(); openlog("cli_1223", LOG_PID, LOG_DAEMON); syslog(LOG_DEBUG, "######## test 1223 ########"); closelog(); openlog("cli_1", LOG_PID, LOG_DAEMON); syslog(LOG_DEBUG, "######## test 1 ########"); closelog(); //我在64位机器上测试之,突然在网上发现有人竟然用sizeof(int)来判断 //操作系统的位数,顿时就火了,于是写了了下面的代码,和syslog无关! printf("P is %d\n", sizeof(char *)); printf("I is %d\n", sizeof(int)); return 0;}
到此为止,over!其实我试过使用多线程绑定多CPU启动将近2000个进程频繁写日志的情况,并不像老大所猜测的那样会导致大量的性能损耗,用top和sar测试没有发现任何问题,毕竟rsyslogd是一个独立的进程,如果觉得实在太忙了,它自己会处理好的,而脚本,根本不算什么,即使你使用:
$outchanel XXX YYY ZZZ
就会好吗?它难道不是也是要每次都判断是否到达了文件的max_size么?所不同的只是少了一个fork的开销而已,对于现在的系统,这根本不算什么。Unix号召每个进程只做一件事,为何要将所有的工作都交给一个程序呢?为何调用脚本就不好呢?这实际上是一个观念问题。如果我不是使用调用脚本的方式,而是写了一个rsyslog plugin或者用了大家都在用的$outchanel-虽然很笨拙的方式,我估计不会是这样的结果。也罢,这并没什么,不是吗?Unix每次只做好一件事,我深深记忆,我希望将多个脚本粘合起来来完成一件复杂的工作,而不是为了维护方便而使用单一的方式,再者,为何说bash脚本对总的代码没有什么共享呢?python好,PHP好,perl也不赖,就bash不好,是自己不喜欢吧,大家都是脚本,一些语法对于不会者都是天书,绝对不能觉得自己熟悉哪方面就要求摒弃其它的。在做事时,需要有一个标准,这是肯定的,大家不能你用python,他用perl,PHP,我用bash,C,需要统一起来,这是真的,但是不能由此而否定其它。我们不能以理论上怎么怎么就下结论,而应该亲自去整一把
- rsyslog配置动态日志文件
- rsyslog配置动态日志文件-outchannel补丁
- rsyslog配置动态日志文件-template补丁
- rsyslog 日志服务器端配置
- 集中日志服务器Rsyslog配置
- rsyslog收集nginx日志配置
- rsyslog收集nginx日志配置
- rsyslog 读日志文件 ,当rsyslog 中断时,也会丢数据
- [快速配置]rsyslog+mysql+loganalyzer日志服务器
- Centos rsyslog远程日志服务配置
- 利用rsyslog 配置用户行为日志审计
- rsyslog日志服务器的配置步骤( 远程发送日志 )
- postfix 日志过滤与linux 日志 模块rsyslog配置
- rhel6.0配置rsyslog传送日志到远程主机
- CentOS上配置rsyslog客户端用以远程记录日志
- CentOS上配置rsyslog客户端用以远程记录日志
- CentOS上配置rsyslog客户端用以远程记录日志
- Rsyslog 日志服务器
- UILabel的详细使用及特殊效果
- Poj 1700 Crossing River
- 第十章 server windows程序设计 王艳平
- .net 4.0笔记
- 中国人的特点
- rsyslog配置动态日志文件
- C#利用SQL-DMO得到(局域网中)SQL服务器的列表
- hadoop总结
- Myeclipse中JDBC连接池的配置
- Ajax的工作原理
- poj 1699 TSP(状态压缩DP) + KMP
- 第六天——考试考试
- DVFS技术详解
- lua源代码文件分析