syslog-ng+mongodb构建集中日志服务

之前写过一篇关于syslog的东西,同时,对于mongodb来说,本站的介绍也不少,MongoDB一直是站长Litrin又爱又恨的no-sql数据库。

上次也说过,做一个集中化的日志系统,最为主要的优势在于它非常容易做日志分析和挖掘,而且对于松散的日志数据来说MongoDB又是一个很好的数据容器。说实话,Litrin很久之前就苦于自己写脚本将日志文件拆分后导入Mongo中进行数据分析,非常不方便。直到前些日子研究了一下syslog-ng,果然有人实现了这个插件——syslog直接写数据到MongoDB!

话说syslog和mongoDB两家人都有个共同的特点:分为开源和商业两个版本。说实话,我个人很认同这种社区盈利的方法。可值得吐槽的是,也许是在推商业版的缘故,两家人提供的官方文档总有误导用户的嫌疑,该详细说的一笔带过,一个技术细节给你画图拉表讲个几十页!这次要讲的mongo插件,syslog-ng的官方文档竟然只字未提。

好吧,系统还是Ubuntu 1204

将系统默认的rsyslog替换成syslog-ng

apt-get remove rsyslog
apt-get install syslog-ng syslog-ng-mod-mongodb syslog-ng-mod-json

启用syslog-ng-mod-mongodb插件,我还是尽量服从syslog-ng配置文件的结构

vi /etc/syslog-ng/modules.conf,增加一行:

@module afmongodb

增加MongoDB的配置,vi /etc/syslog-ng/syslog-ng.conf,增加如下配置

destination d_mongodb_1 {
  mongodb(
    host("localhost") #mongo主机IP
    port(27017) #mongo主机的端口
    database("syslog")#存储日志文件的DB
    collection("log_content")#日志文件的collection
    value-pairs(scope("selected-macros" "nv-pairs")) #日志存储格式
  );
};

好吧,有个让人脑洞大开的地方,在某个版本之后host()和port()配置竟然就这么平白无故的取消掉了,取而代之的是统一的一个server(“IP:PORT”)配置!我是在另外一台主机上通过编译最新代码安装syslog-ng的时候死活启动不了服务之后不得不回去读源码才发现这个坑的。

现在,我们假设将所有的mail日志都通过destination d_mongodb_1 来存储的话,配置如下,配置文件的格式不算太复杂,相信大多数人一看就懂:

log { source(s_src); filter(f_mail); destination(d_mongodb_1);};

重启,使配置生效:

 service syslog-ng restart

简单测试一下:

 root@host>echo 123 | logger -p mail.debug

去mongo看看

root@host:/etc/syslog-ng# mongo 
MongoDB shell version: 2.0.4
connecting to: 127.0.0.1/test
> use syslog
switched to db syslog
> show collections
log_content
system.indexes
> db.log_content.count()
5 //日志的行数,这里返回了5,是因为我之前做过多次的测试。
> db.log_content.findOne()
{
 "_id" : ObjectId("53c3903aa3e22fdc11000001"),
 "HOST" : "localhost",
 "HOST_FROM" : "localhost",
 "LEGACY_MSGHDR" : "logger: ",
 "PRIORITY" : "debug",
 "SOURCEIP" : "127.0.0.1",
 "MESSAGE" : "123",
 "FACILITY" : "mail",
 "TAGS" : ".source.s_src",
 "SEQNUM" : "1",
 "PROGRAM" : "logger",
 "DATE" : "Jul 14 16:09:29",
 "SOURCE" : "s_src"
}

到这里就结束了?当然不!还没有开启syslog-ng的TCP监听端口。增加一个新的来源,命名为s_network。

source s_network { udp(ip(0.0.0.0) port(514)); };

修改log配置

log { source(s_network); filter(f_mail); destination(d_mongodb_1);};

要说syslog-ng的最大优势是什么,Litrin个人觉得是他灵活方便的支持多种复杂的过滤器和来源目标。你可以定义多个不同的来源、等级(facility)、通道(severity),然后通过不同的组合定义到不同的db和collection非常方便。

最后,说一下日志格式的几种配置。

你可以通过 value-pairs(scope(“selected-macros” ))的方式为你的日志定义一个合适的格式,而且支持同时定义多个默认的scope格式(我的例子便是)。对应默认的scope格式代码如下:

base 默认格式,包含了FACILITY, PRIORITY, HOST, PROGRAM, PID(抛出日志的进程号), MESSAGE 和 DATE(日期时间).
core
fc3164
syslog-proto  新的syslog日志协议,在base的基础上独立了由客户端生成的MSGID(message Id)
rfc5424
selected-macros  Base的基础上增加了TAGS(配置文件中的 source名称), SOURCEIP(来源IP) 和 SEQNUM(Mongdb上增加的计数器)
all-macros selected-macros之上将所有配置文件中的详情保存到mongodb
sdata 基于syslog-proto/rfc5424,增加了所有的sdata值
nv-pairs name-value pairs,一个我非常喜欢的方式,如果日志中有csv或json则自动解析并记入mongo,但忽略解析以’.’开头的内容。
dot-nv-pairs 同上,不过仅解析以’.’开头的内容。
all-nv-pairs 同上两种无论是否以’.’开头的内容全部解析。
everything 开启全部的信息记录。

如果这个还不够的活,你可以选择更为灵活,更为麻烦的格式自定义

value-pairs(
  key("DATE") key("FACILITY") key("PRIORITY") key("MESSAGE")
  pair("HOST" "${SOURCE.HOST}")
  pair("PROGRAM" "${SOURCE.PROGRAM.NAME}")
  pair("PID" "$(SOURCE.PROGRAM.PID}")
)
推荐阅读:
今天有个同事在配置Apache
想必各位平时在用任何网络设备的
很多情况下,我们往往需要通过对
将vlan用于网络管理是非常普

发表评论

电子邮件地址不会被公开。 必填项已用*标注

请补全下列算式: *

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据