fluentd mysql_使用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架構圖
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說明
在不使用plugin的情況下Fluentd僅僅是將日志輸入轉化為JSON格式輸出的工具;各類plugin極大拓展了Fluentd的功能
Fluentd plugin最重要的有如下三種:
Input plugin 定義日志來源標準化,輸入的格式
Buffer plugin 定義fluentd緩存的配置以實現可靠性
Output Plugin 定義輸出的格式及目的地,可以是文件,網絡,數據庫,etc
Fluentd Input Plugin
http
讓fluentd從http client獲取數據
tail
tail是最常用的input plugin;
type?tail
path?/var/log/httpd-access.log?#tail監聽的文件地址
tag?apache.access???????????????????#每個輸入需要一個特定標簽以區別
format?apache|syslog|自定義正則???????#format可以靈活自定義
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來設置日志來源
type?tail
format?apache
path?/var/log/apache2/access_log
tag?mongo.apache
其中:
type tail: tail方式是 Fluentd 內置的輸入方式,其原理是不停地從源文件中獲取新的日志。
format apache: 指定使用 Fluentd 內置的 Apache 日志解析器。
path /var/log/apache2/access_log: 指定日志文件位置。
tag mongo.apache: 指定tag,tag被用來對不同的日志進行分類
自定義format配置:
除了默認的apache、json等farmat配置,還可以通過寫正則來配置解析器,如:
format?/^(?[^?]*)?[^?]*?(?[^?]*)?\[(?[^\]]*)\]?"(?\S+)(?:?+(?[^?]*)?+\S*)?"?(?[^?]*)?(?[^?]*)(?:?"(?[^\"]*)"?"(?[^\"]*)")?$/
下面是fulentd自帶的apache解析器:
class?ApacheParser?
REGEXP?=?/^(?[^?]*)?[^?]*?(?[^?]*)?\[(?[^\]]*)\]?"(?\S+)(?:?+(?[^?]*)?+\S*)?"?(?[^?]*)?(?[^?]*)(?:?"(?[^\"]*)"?"(?[^\"]*)")?$/
TIME_FORMAT?=?"%d/%b/%Y:%H:%M:%S?%z"
。。。
https://github.com/fluent/fluentd/blob/710fc88ded9d8d5e12ee4bd4a02a1d5c86cadf4e/lib/fluent/parser.rb
下面再來編輯輸出配置,配置日志收集后存儲到MongoDB中
#?plugin?type
type?mongo
#?mongodb?db?+?collection
database?apache
collection?access
#?mongodb?host?+?port
host?localhost
port?27017
#?interval
flush_interval?10s
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了。
【參考文獻】
http://www.csdn.net/article/2014-08-08/2821120
總結
以上是生活随笔為你收集整理的fluentd mysql_使用Fluentd + MongoDB构建实时日志收集系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java api 英文_JAVA中英文A
- 下一篇: ios怎么安装python3.7_Pyt