Elasticsearch是個(gè)開源分布式搜索引擎,它的特點(diǎn)有:分布式,零配置,自動(dòng)發(fā)現(xiàn),索引自動(dòng)分片,索引副本機(jī)制,restful風(fēng)格接口,多數(shù)據(jù)源,自動(dòng)搜索負(fù)載等。
Fluentd是一個(gè)日志收集系統(tǒng),它的特點(diǎn)在于其各部分均是可定制化的,你可以通過簡(jiǎn)單的配置,將日志收集到不同的地方。
Kibana也是一個(gè)開源和免費(fèi)的工具,它Kibana可以為 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以幫助您匯總、分析和搜索重要數(shù)據(jù)日志。
Fluentd的安裝在博客中有提及到,在這里變不多講了地址。Elasticsearch與Kibana的安裝詳情參考地址。
本文中主要是對(duì)Fluentd與Elasticsearch的對(duì)接進(jìn)行說明,并創(chuàng)建Python腳本,為Python App來完成日志提交。
Fluentd配置文件
<match project.*>
type copy
<store>
type stdout
output_type json
</store>
<store>
type elasticsearch
host localhost
port 9200
index_name project
type_name project
flush_interval 5s
logstash_format true
logstash_prefix project
</store>
</match>
我對(duì)match是project.*
的日志分別輸出到stdout和elasticsearch中。不知道為啥index_name
與elasticsearch中的_index
不一樣。反而logstash_prefix是_index
的前綴,并與當(dāng)前日期拼接成為完整的_index
。不知道是否和logstash_format設(shè)為true有關(guān),但是如果沒有l(wèi)ogstash_format這個(gè)參數(shù),elasticsearch就接收不到Fluentd的日志。
Python腳本
# coding: utf-8
import os
import logging
from fluent import handler
custom_format = {
'host': '%(hostname)s',
'where': '%(module)s.%(funcName)s', # 具體到文件、函數(shù)
'loglevel': '%(levelname)s',
'stack_trace': '%(exc_text)s'
}
logging.basicConfig(level=logging.ERROR)
env = os.environ.get('PROJECT_ENV') if os.environ.get(
'PROJECT_ENV') else 'local'
l = logging.getLogger('project.' + env)
h = handler.FluentHandler('project.' + env, host='127.0.0.1', port=24224)
formatter = handler.FluentRecordFormatter(custom_format)
h.setFormatter(formatter)
l.addHandler(h)
需要安裝fluent-logger,安裝命令pip install fluent-logger
。在相應(yīng)的文件中引用l
,使用l.info(...)
、l.error(...)
等命令,就能將相應(yīng)的日志輸出到Elasticsearch中,并在Kibana中顯示。