使用Fluentd + MongoDB构建实时日志收集系统

日志处理场景

日志量大

日志分散不易进行统一分析

难以添加有效监控

系统实现

  • Fluentd(td-agent)

  • MongoDB

  • Python Script(PyMongo module)

  • Zabbix 

解决方案

系统架构

  • Fluentd+Mongodb+Python+zabbix

  • Fluentd实时收集LB日志,JSON化,存入中央Mongodb

  • Python程序查询Mongodb数据进行实时计算;计算结果存入zabbix;zabbix负责告警及图形展现


使用Fluentd + MongoDB构建实时日志收集系统_第1张图片

Fluentd/Mongodb架构图

Fluentd介绍

Fluentd is an open source data collector for unified logging layer.

Fluentd allows you to unify data collection and consumption for a better use and understanding of data.

Fluentd是一个日志收集系统,它的特点在于其各部分均是可定制化的,你可以通过简单的配置,将日志收集到不同的地方。

使用Fluentd + MongoDB构建实时日志收集系统_第2张图片

fluentd说明

在不使用plugin的情况下Fluentd仅仅是将日志输入转化为JSON格式输出的工具;各类plugin极大拓展了Fluentd的功能

Fluentd plugin最重要的有如下三种:

  1. Input plugin 定义日志来源标准化,输入的格式

  2. Buffer plugin 定义fluentd缓存的配置以实现可靠性

  3. Output Plugin 定义输出的格式及目的地,可以是文件,网络,数据库,etc

Fluentd Input Plugin

http   

    让fluentd从http client获取数据

tail   

     tail是最常用的input plugin;

<source> 
type tail 
path /var/log/httpd-access.log #tail监听的文件地址
tag apache.access                   #每个输入需要一个特定标签以区别
format apache|syslog|自定义正则       #format可以灵活自定义                    
</source>

foward

    将其他fluentd/fluent-cat命令的输出作为该fluentd的输入;

exec

    通过执行外部命令,以命令执行的结果作为fluentd的输入;

Fluentd Output Plugin

  • Ouput Plugin用于存储Fluentd收集来的数据;目前有很多开源的plugin,如:fluentd-flume,fluentd-splunk,fluentd-cassandra,fluentd-scribe,fluentd-mongodb

  • Output plugin中最完美的当属mongodb plugin,因为Fluentd/Mongodb都以JSON为基础;mongodb良好的插入查询性能可以顶住海量日志实时分析的压力;mongodb的capped collection很好的解决了日志定量轮转的问题

安装部署

安装

ubuntu 12.04 安装,针对本版本,其他版本请看官网文档

curl -L http://toolbelt.treasuredata.com/sh/install-ubuntu-precise-td-agent2.sh | sh

配置

如果你是使用上面的deb/rpm包安装的Fluentd,那么配置文件位置在:/etc/td-agent/td-agent.conf,否则其位置应该在:/etc/fluentd/fluentd.conf

首先我们编辑配置文件中的source来设置日志来源

<source>
  type tail
  format apache
  path /var/log/apache2/access_log
  tag mongo.apache
</source>

其中:

type tail: tail方式是 Fluentd 内置的输入方式,其原理是不停地从源文件中获取新的日志。

format apache: 指定使用 Fluentd 内置的 Apache 日志解析器。

path /var/log/apache2/access_log: 指定日志文件位置。

tag mongo.apache: 指定tag,tag被用来对不同的日志进行分类

自定义format配置:

除了默认的apache、json等farmat配置,还可以通过写正则来配置解析器,如:

format /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$/

下面是fulentd自带的apache解析器:

    class ApacheParser < Parser
      REGEXP = /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$/
      TIME_FORMAT = "%d/%b/%Y:%H:%M:%S %z"
      
      。。。

https://github.com/fluent/fluentd/blob/710fc88ded9d8d5e12ee4bd4a02a1d5c86cadf4e/lib/fluent/parser.rb

下面再来编辑输出配置,配置日志收集后存储到MongoDB中

<match mongo.**>
  # plugin type
  type mongo

  # mongodb db + collection
  database apache
  collection access

  # mongodb host + port
  host localhost
  port 27017

  # interval
  flush_interval 10s
</match>

match标签后面可以跟正则表达式以匹配我们指定的tag,只有匹配成功的tag对应的日志才会运用里面的配置。配置中的其它项都比较好理解,看注释就可以了,其中flush_interval是用来控制多长时间将日志写入MongoDB一次。

启动 fluentd(td-agent)

配置文件: /etc/td-agent/td-agent.conf
启动命令: sudo /etc/init.d/td-agent start
停止: sudo /etc/init.d/td-agent stop
重启: sudo /etc/init.d/td-agent reload


以上主要对于fluentd作为重点,对于mongo配置安装和日志分析这里没有叙述。

附:

 apache/nginx access.log 说明

访问日志access_log记录了所有对Web服务器的访问活动。

正如其名字所示,访问日志access_log记录了所有对Web服务器的访问活动。

  下面是访问日志中一个典型的记录:

10.1.1.95 - e800 [18/Mar/2005:12:21:42 +0800] "GET /stats/awstats.pl?config=e800 HTTP/1.1" 200 899 "http://10.1.1.1/pv/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Maxthon)"

access日志组成:

这行内容由9项构成,上面的例子中有两项空白,但整行内容仍旧分成了9项。

   第一项信息是远程主机的地址。如果你想知道这个IP地址的域名,可通过nslookup或者host命令来查看。如果你想让Apache自己找出这个IP 的主机名,可以打开这个开关:HostnameLookups。(建议最好不要打开,会影响Apache记录服务器日志的速度)

   第二项是空白,用一个"-"占位符替代。实际上绝大多数时候这一项都是如此。这个位置用于记录浏览者的标识,这不只是浏览者的登录名字,而是浏览者的 email地址或者其他唯一标识符。这个信息由identd返回,或者直接由浏览器返回。很早的时候,那时Netscape 0.9还占据着统治地位,这个位置往往记录着浏览者的email地址。然而,由于有人用它来收集邮件地址和发送垃圾邮件,所以它未能保留多久,很久之前市 场上几乎所有的浏览器就取消了这项功能。因此,到了今天,我们在日志记录的第二项看到email地址的机会已经微乎其微了。

  第三项也是e800。这个位置用于记录浏览者进行身份验证时提供的名字。当然,如果网站的某些内容要求用户进行身份验证,那么这项信息是不会空白的。但是,对于大多数网站来说,日志文件的大多数记录中这一项仍旧是空白的。

  日志记录的第四项是请求的时间。这个信息用方括号包围,而且采用所谓的"公共日志格式"或"标准英文格式"。因此,上例日志记录表示请求的时间是2005年3月18日12:21:42。时间信息最后的"+0800"表示服务器所处时区位于UTC之后的8小时。

  日志记录的第五项信息或许是整个日志记录中最有用的信息,它告诉我们服务器收到的是一个什么样的请求。该项信息的典型格式是"METHOD RESOURCE PROTOCOL",即"方法 资源 协议"。 

   RESOURCE是指浏览者向服务器请求的文档,或URL。在这个例子中,浏览者请求的是"/stats/awstats.pl?config=e800 "。

   在上例中,METHOD是GET,其他经常可能出现的METHOD还有POST和HEAD。此外还有不少可能出现的合法METHOD,但主要就是这三种。

   PROTOCOL通常是HTTP,后面再加上版本号。

   日志记录的第六项信息是状态代码。它告诉我们请求是否成功,或者遇到了什么样的错误。大多数时候,这项值是200,它表示服务器已经成功地响应浏览器的 请求,一切正常。一般地说,以2开头的状态代码表示成功,以3开头的状态代码表示由于各种不同的原因用户请求被重定向到了其他位置,以4开头的状态代码表 示客户端存在某种错误,以5开头的状态代码表示服务器遇到了某个错误。 

   日志记录的第七项表示发送给客户端的总字节数。它告诉我们传输是否被打断(即,该数值是否和文件的大小相同)。把日志记录中的这些值加起来就可以得知服务器在一天、一周或者一月内发送了多少数据。

  日志记录的第八项记录的是客户在提出请求时所在的目录或URL。这次的是"http://10.1.1.1/pv/"即10.1.1.1的pv目录下的首页。大多数情况下,首页会是在httpd.conf中DocumentRoot 指令后面规定的那些类型和名字的web文件。 

   日志记录的第九项表示客户端的详细信息,这样你就不难理解为什么有些网站能够在页面中显示你的IP、OS、Browser了。 

【参考文献】

fluentd 官网文档 http://docs.fluentd.org/articles/install-by-deb

开源中国 fluentd  http://www.oschina.net/question/12_33599

http://www.csdn.net/article/2014-08-08/2821120


你可能感兴趣的:(使用Fluentd + MongoDB构建实时日志收集系统)