跟我学Rsyslog
在数据为王的时代,日志管理是一个绕不开的话题,相应的开源软件有不少,比如热门的三件套:Logstash、ElasticSearch、Kibana,可惜我对这些高大上的东西往往心存敬畏,不敢轻易触碰,相比较而言,我更喜欢能够快速上手的东西。
对于日志管理,老版本的Linux缺省使用Syslog,其配置大致如下所示:
shell> cat /etc/syslog.conf # Log all kernel messages to the console. # Logging much else clutters up the screen. # kern.* /dev/console # Log anything (except mail) of level info or higher. # Don't log private authentication messages! *.info;mail.none;authpriv.none;cron.none /var/log/messages # The authpriv file has restricted access. authpriv.* /var/log/secure # Log all the mail messages in one place. mail.* -/var/log/maillog # Log cron stuff cron.* /var/log/cron # Everybody gets emergency messages *.emerg * # Save news errors of level crit and higher in a special file. uucp,news.crit /var/log/spooler # Save boot messages also to boot.log local7.* /var/log/boot.log
其中涉及两个概念:Facility和Severity,中文的意思大致是类型和级别。重点说明两条配置的含义:首先,所有Severity大于等于info的信息都会被保存到「/var/log/messages」中,但是Facility为mail、authpriv、cron的消息例外;其次,所有Facility为mail的消息都会保存到「/var/log/maillog」中,日志文件前面的减号表示的意思是异步写文件。
关于Syslog的内容我并不想多说,否则就偏离了主题,大家如果有不清楚的地方,可以参考鸟哥的Linux私房菜。虽然Syslog中规中矩,但是随着时间的推移,无论是功能还是性能,它都显得捉襟见肘,于是出现了:Rsyslog和Syslog-ng,它们都涵盖SysLog的常用功能,不过在功能和性能上更为出色,至于孰优孰劣是个仁者见仁智者见智的问题,鉴于多数Linux发行版均选择了Rsyslog,姑且让我随波逐流一次。
如果说Rsyslog有哪些缺点的话,那么兼容性无疑是很显眼的一个,不同版本之间的差异比较大,使用时需要格外留意一下。在使用前最好完整的浏览几遍官方文档,此外网络上有一些不错的文章可供参考,比如:rsyslog研究,rsyslog和logrotate服务,核心概念在这些资料里都有提及,本文就不赘述了,这里着重与快速上手。
安装配置
我以CentOS为例,说明如何通过RPM来安装Rsyslog:
shell> cd /etc/yum.repos.d/ shell> wget http://rpms.adiscon.com/v8-stable/rsyslog.repo shell> yum install rsyslog
安装完成后,我们可以查看一下到底都装了些什么东西:
shell> rpm -ql rsyslog /etc/logrotate.d/syslog /etc/pki/rsyslog /etc/rc.d/init.d/rsyslog /etc/rsyslog.conf /etc/rsyslog.d /etc/sysconfig/rsyslog ...
如果系统里有Syslog的话,那么在启动Rsyslog之前,别忘了先关闭它:
shell> service syslog stop shell> service rsyslog start
如果运行Rsyslog时出现问题,那么可以通过激活调试模式来查找原因:
shell> cat /etc/sysconfig/rsyslog # Options for rsyslogd # Syslogd options are deprecated since rsyslog v3. # If you want to use them, switch to compatibility mode 2 by "-c 2" # See rsyslogd(8) for more details SYSLOGD_OPTIONS="-d -n"
如果你想测试Rsyslog是否工作的话,可以通过系统内建的logger命令发消息;如果你想测试Rsyslog性能如何的话,可以考虑使用官方提供的tcpflood。
实例演示
在我们动手之前,有必要了解一下Rsyslog的工作流程,说起来非常简单:首先数据通过输入模块进入主队列,然后经由过滤条件分解到各个子队列,最后交给输出模块。
理解了Rsyslog的工作流程,我们就可以实例演示了,请听题:请把多台Web服务器上的access日志发送到统一的App服务器,集中管理。
设置Web服务器,把信息通过TCP的方式发送给App服务器:
*.* @@<HOST>:<PORT>
设置App服务器,开启TCP支持:
input(type="imtcp" port="<PORT>")
如果在主配置文件里加入太多内容的话就太臃肿了,应该尽量使用子配置文件:
# Include all config files in /etc/rsyslog.d/ $IncludeConfig /etc/rsyslog.d/*.conf
看看在Web服务器上应该如何设置子配置文件:
$WorkDirectory /path input(type="imfile" File="/path/to/web/access.log" Facility="user" Severity="info" Tag="web_access" StateFile="web_access.state" PersistStateInterval="1")
通过imfile输入模块,我们可以简单的引入文件。需要说明的是,StateFile被用来记录日志位置等信息,PersistStateInterval被用来控制StateFile的持久化频率,测试阶段,可以把它设置的小点儿,正式阶段,出于效率的考虑,可以把它调大点儿,但是相应的也会出现丢失数据的潜在风险,具体设置多少合适需要结合自己的情况来斟酌。
然后看看在App服务器上应该如何设置子配置文件:
template(name="msg" type="string" string="%msg:2:$%\n") if $syslogtag == "web_access" then { action(type="omfile" File="/path/to/access.log" Template="msg") stop }
通过omfile输出模块可以简单的实现汇总,利用template指令定义仅记录msg数据,此外还使用Property Replacer去除了msg开头的空格。
如果仅此而已就太无趣了,实际上利用omprog输出模块,我们可以玩得更出彩:
module(load="omprog") template(name="msg" type="string" string="%msg:2:$%\n") if $syslogtag == "web_access" then { action(type="omprog" Binary="/usr/bin/php /path/to/script.php" Template="msg") stop }
数据通过管道无缝传递给外部程序,可以说赋予了Rsyslog更多的可能性,你可以使用任何熟悉的语言来实现,本例中用的是PHP,大致代码如下所示:
<?php while (($data = fgets(STDIN)) !== false) { // ... } ?>
本文可以看作是Rsyslog入门指引,深入介绍可以参考香草的总结。
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:老王 来源: 火丁笔记
- 标签: Rsyslog
- 发布时间:2014-05-10 21:23:40
- [71] Twitter/微博客的学习摘要
- [65] find命令的一点注意事项
- [65] IOS安全–浅谈关于IOS加固的几种方法
- [63] android 开发入门
- [62] Go Reflect 性能
- [62] 如何拿下简短的域名
- [61] Oracle MTS模式下 进程地址与会话信
- [60] 流程管理与用户研究
- [57] 图书馆的世界纪录
- [57] 读书笔记-壹百度:百度十年千倍的29条法则