1:为什么用到ELK:
一般我们需要进行日志分析场景:直接在日志文件中grep、awk就可以获得自己想要的信息。但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。需要集中化的日志管理,所有服务器上的日志收集汇总。常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。
一般大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。
一个完整的集中式日志系统,需要包含以下几个主要特点:
收集-能够采集多种来源的日志数据
传输-能够稳定的把日志数据传输到中央系统
存储-如何存储日志数据
分析-可以支持 UI分析
警告-能够提供错误报告,监控机制
ELK提供了一整套解决方案,并且都是开源软件,之间互相配合使用,完美衔接,高效的满足了很多场合的应用。目前主流的一种日志系统
1:对于数据仓库团队来说,日志是他们要分析的信息数据来源之一;
2:对于安全团队来说,日志是他们构建安全防御与漏洞挖掘的一种特征来源和触发信号源;
3:对于应用团队来说,日志是他们了解自己的系统运行状态与排除错误的一种手段;
etc.
2:ELK的简介
ELK是三个开源软件的缩写,分别表示:Elasticsearch, Logstash, Kibana ,它们都是开源软件。新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具。
Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
Logstash主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。
Kibana也是一个开源和免费的工具,Kibana可以为Logstash 和 ElasticSearch提供的日志分析友好的 Web界面,可以帮助汇总、分析和搜索重要数据日志。
3:ELK
ELK=elasticsearch+Logstash+kibana
elasticsearch:后台分布式存储以及全文检索
logstash:日志加工、解析、“搬运工”
kibana:数据可视化展示。
ELK架构为数据分布式存储、日志解析和可视化查询创建了一个功能强大的管理链。三者相互配合,取长补短,共同完成分布式大数据处理工作。
4:ElasticSearch
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTfulweb接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
5:ES优势
1)分布式实时文件存储,可将每一个字段存入索引,使其可以被检索到。
2)实时分析的分布式搜索引擎。
分布式:索引分拆成多个分片,每个分片可有零个或多个副本。集群中的每个数据节点都可承载一个或多个分片,并且协调和处理各种操作;
负载再平衡和路由在大多数情况下自动完成。
3)可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。也可以运行在单台PC上(已测试)
4)支持插件机制,分词插件、同步插件、Hadoop插件、可视化插件等。
6:Python使用elastic
滚屏:https://blog.csdn.net/u014431852/article/details/52830938
https://blog.csdn.net/YHYR_YCY/article/details/78882011
PS:一些elk的实现分享
1)新浪ES如何分析处理32亿条实时日志http://dockone.io/article/505
2)阿里ES构建挖财自己的日志采集和分析体系http://afoo.me/columns/tec/logging-platform-spec.html
3)有赞ES业务日志处理http://tech.youzan.com/you-zan-tong-ri-zhi-ping-tai-chu-tan/
4)ES实现站内搜索http://www.wtoutiao.com/p/13bkqiZ.html
# 参考:
# https://blog.csdn.net/YHYR_YCY/article/details/78882011
field = ["ip", "status", "uri", "http_user_agent"]
# 分析
# must 表示必须
# term 字段 此字段的status 的值必须为200
# range 表示log_time的范围,支持传入format, gte 开始时间,是一個format字符串,lt结束时间
# _source 文本查询中要查询的字段,数组形式给出
query = {
"bool": {
"must": [
{
"term": {
"status": 200
}
},
{
"range": {
"log_time": {
"gte": "",
"lt": "",
"format":"yyyy-MM-dd HH:mm",
"time_zone": "+08:00"
}
}
}
]
},
"_source": field
}
# 简单query
# query = {'query': {'range': {'age': {'gt': 11}}}}# 查找年龄大于11的所有文档
# query = {'query': {'term': {'name': 'jack'}}}# 查找名字叫做jack的所有文档
# 建立es连接
def get_conn():
host = ""
port = 9200
return Elasticsearch([{"host": host, "port": port}])
# 取数据
# index 索引, size一次的大小
# scroll 记录上一次查询的位置,_scroll_id,第一次查询时已经对查询结果做了快照
def search(esp):
es = get_conn()
res = es.search(
index = esp["index"],
size = esp["size"],
scroll = esp["scroll"],
request_timeout = esp["request_timeout"],
body = esp["query"]
)
hits_size = len(res["hits"]["hits"])
infos = res["hits"]["hits"]
while hits_size > 0:
infos += res["hits"]["hits"]
sid = res["_scroll_id"]
res = es.scroll(
scroll_id = sid,
scroll = esp["scroll"],
params = {"request_timeout": esp["request_timeout"]}
)
return infos
参考:
https://www.cnblogs.com/aresxin/p/8035137.html
https://blog.csdn.net/laoyang360/article/details/52244917