阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Rsyslog日志服务器安装配置

149次阅读
没有评论

共计 4395 个字符,预计需要花费 11 分钟才能阅读完成。

最近公司的日志传输服务器因网间带宽被调整后出现了日志堵塞的情况,更为严重的是公司大量的业务日志也是通过 PHP 的 syslog 接口传输的。这样,因为 rsyslog 的新版本默认不期望丢弃任何数据,而 rsyslog 中的日志又传输不出去,导致了业务在写日志的时候“被”堵塞住了。

拿到 rsyslog 的配置后,发现仅有一些简单的关于传输逻辑的配置,而关于 rsyslog 进程、队列、传输效率的配置参数都采用默认,这种仅仅能够 work around 的配置在测试或运行初期是允许存在一段时间的,在系统、环境正常的时候能够运行。一旦出现异常,各种问题就全出来了。

推荐的文档和我认为比较关键的配置请见下图:

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 服务器。实际上新版 Nginx 可以直接发 Syslog 请求。

设置 Web 服务器:

module(load="imfile")

ruleset(name="remote") {
    action(type="omfwd"
        Protocol="tcp"
        Target="<HOST>"
        Port="<PORT>")

    stop
}

input(type="imfile"
    File="/path/to/web/access.log"
    Facility="user"
    Severity="info"
    Tag="web_access"
    PersistStateInterval="1"
    Ruleset="remote")

通过 imfile 输入模块,我们引入文件,并且绑定 Ruleset。不过需要说明的是,需要通过配置 WorkDirectory 来声明状态文件的保存位置,这个状态文件被用来记录扫描日志位置等信息,PersistStateInterval 被用来控制状态文件的持久化频率,测试阶段,可以把它设置的小点儿,正式阶段,出于效率的考虑,可以把它调大点儿,但是相应的也会出现丢失数据的潜在风险,具体设置多少合适需要结合自己的情况来斟酌。

设置 App 服务器:

module(load="imtcp")

template(name="msg" type="string" string="%msg:2:$%\n")

ruleset(name="analysis") {
    action(type="omfile"
        File="/path/to/access.log"
        Template="msg")

    stop
}

input(type="imtcp"
    Port="<PORT>"
    Ruleset="analysis")

通过 omfile 输出模块可以简单的实现汇总,利用 Template 指令定义仅记录 msg 数据,此外还使用 Property Replacer 去除了 msg 开头的空格。

如果仅此而已就太无趣了,实际上利用 omprog 输出模块,我们可以玩得更出彩:

module(load="omprog")

ruleset(name="analysis") {
    action(type="omprog"
        Binary="/usr/bin/php /path/to/script.php"
        Template="msg")

    stop
}

数据通过管道无缝传递给外部程序,可以说赋予了 Rsyslog 更多的可能性,你可以使用任何熟悉的语言来实现,以 PHP 为例,大致代码如下所示:

<?php

while (($data = fgets(STDIN)) !== false) {// ...}

?>

一个需要注意的地方是,如果循环里的业务逻辑比较重,那么可能会导致拥堵,此时可以考虑不直接在循环里处理业务逻辑,而是稍作处理,直接转发给 Gearman 之类的任务分发器,稍后有 Gearman 把任务分发给相应的 Worker 来处理。

友情提示:如果主配置文件太臃肿的话,可以考虑使用子配置文件:

# Include all config files in /etc/rsyslog.d/
$IncludeConfig /etc/rsyslog.d/*.conf

本文可以看作是 Rsyslog 入门指引。

————————————– 分割线 ————————————–

CentOS 上配置 rsyslog 客户端用以远程记录日志  http://www.linuxidc.com/Linux/2015-02/112989.htm

CentOS 6.3 下利用 Rsyslog+LogAnalyzer+MySQL 部署日志服务器 http://www.linuxidc.com/Linux/2013-07/86956.htm

使用 rsyslog mysql 和 logAnalyzer 的日志服务器 http://www.linuxidc.com/Linux/2012-09/70717.htm

Rsyslog 配置及使用教程  http://www.linuxidc.com/Linux/2015-02/113614.htm

RHEL5.4 部署中央日志服务器之 rsyslog+loganalyzer  http://www.linuxidc.com/Linux/2010-12/30801.htm

————————————– 分割线 ————————————–

Rsyslog 的详细介绍 :请点这里
Rsyslog 的下载地址 :请点这里

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2015-08/121537.htm

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-20发表,共计4395字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中