IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

跟我学Rsyslog

火丁笔记 2014-05-10 21:23:40 累计浏览 1,728 次
本机暂存

   在数据为王的时代,日志管理是一个绕不开的话题,相应的开源软件有不少,比如热门的三件套:LogstashElasticSearchKibana,可惜我对这些高大上的东西往往心存敬畏,不敢轻易触碰,相比较而言,我更喜欢能够快速上手的东西。

   对于日志管理,老版本的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

   其中涉及两个概念:FacilitySeverity,中文的意思大致是类型和级别。重点说明两条配置的含义:首先,所有Severity大于等于info的信息都会被保存到「/var/log/messages」中,但是Facility为mail、authpriv、cron的消息例外;其次,所有Facility为mail的消息都会保存到「/var/log/maillog」中,日志文件前面的减号表示的意思是异步写文件。

   关于Syslog的内容我并不想多说,否则就偏离了主题,大家如果有不清楚的地方,可以参考鸟哥的Linux私房菜。虽然Syslog中规中矩,但是随着时间的推移,无论是功能还是性能,它都显得捉襟见肘,于是出现了:RsyslogSyslog-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入门指引,深入介绍可以参考香草的总结

同分类推荐文章

  1. 从零重建 macOS 开发机:可复现的环境初始化流程 (2026-06-14 20:36:00)
  2. 百度物理网络监控工具开源第二弹:毫秒级监控工具 baize,让你的网络问题无处遁形 (2026-06-11 08:10:28)
  3. How to Set Up Homebrew Tap for Private CLI Tools: A Complete Guide (2026-05-27 02:13:03)

查看更多 DevOps 文章 →

建议继续学习

  1. Linux如何统计进程的CPU利用率 (累计阅读 16,307)
  2. 我的 RHCA 之路 (累计阅读 14,012)
  3. Linux内存点滴 用户进程内存空间 (累计阅读 13,228)
  4. 给程序员新手的一些建议 (累计阅读 13,088)
  5. Linux 性能监控、测试、优化工具 (累计阅读 13,011)
  6. 关于linux内存free的一些事情 (累计阅读 12,867)
  7. ps - 按进程消耗内存多少排序 (累计阅读 12,686)
  8. Google怎么用linux (累计阅读 12,580)
  9. Linux Used内存到底哪里去了? (累计阅读 11,866)
  10. find命令的一点注意事项 (累计阅读 11,864)