Rsyslog

    目前 Rsyslog 本身也支持多种输入输出方式,内部逻辑判断和模板处理。

    不同模块插件在 rsyslog 流程中发挥作用的原理,可以阅读:http://www.rsyslog.com/doc/master/configuration/modules/workflow.html

    流程中可以使用 组件来完成数据的切分(相当于 logstash 的 filters/grok 功能)。

    rsyslog 从 v7 版本开始带有 omelasticsearch 插件可以直接写入数据到 elasticsearch 集群,配合 mmnormalize 的使用示例见: http://puppetlabs.com/blog/use-rsyslog-and-elasticsearch-powerful-log-aggregation

    类似的还有 mmjsonparse 组件。

    使用示例见:

    虽然 Rsyslog 很早就支持直接输出数据给 elasticsearch,但如果你使用的是 v8.4 以下的版本,我们这里并不推荐这种方式。因为normalize 语法还是比较简单,只支持时间,字符串,数字,ip 地址等几种。在复杂条件下远比不上完整的正则引擎。

    那么,怎么使用 rsyslog 作为日志收集和传输组件,来配合 logstash 工作呢?

    如果只是简单的 syslog 数据,直接单个 logstash 运行即可,配置方式见本书 2.4 章节。

    如果你使用的是最新的 v8.4 版 rsyslog,其中有一个新加入的 mmexternal 模块。该模块是在 v7 的 omprog 模块基础上发展出来的,可以让你使用任意脚本,接收标准输入,自行处理以后再输出回来,而 rsyslog 接收到这个输出再进行下一步处理,这就解决了前面提到的 “normalize 语法太简单”的问题!

    下面是使用 rsyslog 的 mmexternal 和 omelasticsearch 完成 Nginx 访问日志直接解析存储的配置。

    rsyslog 配置如下:

    其中调用的 python 脚本示例如下:

    注意输出的时候,顶层的 key 是不能变的,msg 还得叫 msg,如果是 hostname 还得叫 hostname ,等等。否则,rsyslog 会当做处理无效,直接传递原有数据内容给下一步。

    从实际运行效果看,rsyslog 对 mmexternal 的程序没有最大并发数限制!所以如果你发送的数据量较大的事情,rsyslog 并不会像普通的转发模式那样缓冲在磁盘队列上,而是持续 fork 出新的 mmexternal 程序,几千个进程后,你的服务器就挂了!!