目录:
一 ELK是什么
FileBeat
Elasticsearch
Logstash
Kibana   
总结一句话,这是一个归集系统,也就是把所有环境、所有机器、所有目录的日志都集中起来管理,因此定位日志的方式跟以前大不一样。最后呈现给我们的就如同一个大的数据库
二 目前项目应用场景
- .log 文件+elk 如aiom、tpcloud、onu、sg 
- k8s+elk 
三 开始使用
以下文档,建议打开kibana界面跟随操作
kibana介绍
因为最后呈现给我们的是kibana,也就是一个用户界面,所以前面其他elasticsearch、logstash等不需要掌握,只需掌握kibana工具使用即可
总结一句话:可以傻瓜式点点点
定位本质
如上面说到,最后呈现跟我们的就是一个大的数据库,那么中心思想就不难想象,就是使用一个个字段来进行搜索、过滤、排序、关联。
Ps:听说厉害的人甚至都不需要界面化kibana来查,有兴趣可以用原生elasticsearch来增删改查
下面用一个案例来说明一下操作步骤
案例
:high_brightness: 一种是传统的was方式,一种是正在改进的docker方式也就是k8s环境。两套环境都已完成日志的归集部署
- 要点一:索引根据不同环境来命名如: - 环境1为:test-%{+YYYY.MM.dd},因此可以建立索引模式test-*后面的+YYYY.MM.dd代表日期,也就是每天一个索引,我们使用正则来创建索引模式,是因为方便夸日期进行搜索,下同。
- 环境2: testdev-%{+YYYY.MM.dd}, 因此可以建立索引模式testdev-*
 - 这里可能有些同学会疑惑,为什么选择两个不同的索引模式,为什么不用同一个呢?我之前也考虑过用同一个,也就是一个项目一个索引,但是发现不同环境有很多不同的字段,比如k8s中有namespace、pod这些概念,传统环境中有主机概念、文件路径概念。如果放到同一个索引里,对不同的数据都会产生多余的字段,因为同一个索引是共享字段的。所以为了处理方便采取分离的方式。 
- 环境1为:
- 要点二:项目日志数据结构为: - %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level-***%X{traceId}***- [%thread] %logger{5} - %msg%n}
 此结构在elk已经转化为:- time 时间戳
- level 日志级别
- traceId 调用链traceId
- logger 打印日志类
- info 日志具体内容
 - 要点三:模块 包括 portal、order、bpm等
 
:question: 知道这些有什么用呢?
记得上面说过的大的数据库吗,所有的数据都转化为一条sql记录,没错,一个索引就是一张表,以上这些统统都转化为一个个字段,如下表:
这些字段如何在elk上体现如下表:  
| 字段名 | 环境1 | 环境2 | 备注 | 
|---|---|---|---|
| 模块如:order | moduleName | kubernetes.labels.app | |
| 日志级别如:Error | level | level | |
| 时间戳 | @timestamp | @timestamp | 一般统计时间段或者排序用的上 | 
| 调用链 | traceId | traceId | 组合查询最重要的标识 | 
| 日志所在类 | logger | logger | 如c.h.e.p.u.a.f.UeeUrlFilter | 
| 进程ID | threadId | threadId | threadId | 
| 日志内容 | info | info | 核心日志内容 | 
| 完整日志 | message | message | 一条日志的所有内容,其他多个字段由它拆分而来 | 
| 日志路径 | log.file.path | 不需要 | |
| 主机名 | 暂时不用,后期加上 | 
(在kibana Discovery界面的左侧部分参考本文最后一张图)
时间戳、日志级别、调用链traceId等一个都不能少。如果现在对照着kibana你是不是发现还有些奇怪的字段,有兴趣的可以去了解,影响不大。
其他的字段有兴趣的同学可以去探索
- :mrs_claus: 真实场景一    - 图形化显示
 参考资料
 
- 图形化显示
四 常见问题
- 没有日志 
 ①、确定elasticsearch组件是否正常 (get 请求)- curl http://localhost:9200/_cat/health?v- 主要观察status是否为green- ②、确定当天日志索引是否存在 - http://localhost:9200/_cat/indices?v
 或者
 - GET /_cat/indices/<index>- 全索引查询,查看结果中是否有对应的日志索引 - 以上如果都正常,那么可能就是你限定条件错误,导致查询失败。如果异常,那么确实是没有收集到。一般步骤(查看kafka中topic -> 查看logstash日志 -> 查看源日志) 
- 无法搜索到日志 
 ①、确定搜索条件是否正确(模块、时间、关键字)
 ②、可能需要等待几分钟(还没收集到,延迟或者磁盘满了)
 ③、时区是否有问题,尤其是针对8点以前的日志,解决方法是往前搜索一天。此问题已解决
- 日志时间有问题 
 有两个时间。
 ①、k8s中容器时区不对一般差8个小时,参考上面2.3
 ②、日志打印时间和收集时间不一致,一般差1秒以内
- kibana 不可用的怎么办