Kibana日志分析(一)基础概念与常用查询

最近发现,很多技术同事对强大的ELK“相逢见面不相识”,甚是遗憾!为了让这些朋友早日踏上ELK的康庄大道(不归路),让他们了解、使用,最终精通ELK,特制作了本系列教程,期望从浅入深,让大家逐步掌握ELK。
本文为此系列教程的第一篇,主要介绍ELK的总体结构和用途,并介绍Kibana的基础功能和查询语法。

0x1 什么是ELK

ELK在服务器运维界应该是运用的非常成熟了,很多成熟的大型项目都使用ELK来作为前端日志监控、分析的工具。
那么首先,我们来了解下什么是ELK,ELK实际上是三个工具的集合:

  • E:Elasticsearch 基于Lucenne的搜索服务器,提供一个分布式多用户的全文搜索引擎,能过做到实时搜索。
  • L:Logstash 可以对日志进行采集、过滤、输出。
  • K:Kibana 可以汇总、分析、搜索日志数据并提供友好的web界面,它也是我们今天介绍的主角。
    这三个工具各司其职,最终形成一整套的日志监控架构

0x2 ELK有什么用

现在已经有非常多的公司在使用这套架构了,例如Sina、饿了么、携程,这些公司都是这方面的先驱。同时,Aliyun也开放了ELK的云端版。

日志分析

场景一 运维同学

作为一个运维工程师, 某天虚拟机出现故障, 想看看虚拟机是否有异常日志,物理机上是否有异常日志, 管理物理机的云平台/系统是否有发生异常日志, 一个个主机系统登陆过去, 输入账号密码费时费力,有时还会出现记不住密码干着急的情况,大大影响了排障的效率。 有没有一个系统,能够集中查看和搜索日志,不需要繁琐的登陆, 方便的获取排障所需的重要信息, 有异常还能够订阅?

场景二 开发同学

作为一个开发人员, 开发的系统经常需要调用外部的api, 每次出现问题需要去查看日志,看是哪个环节出现问题, 是调用第三方api出错,还是连接数据库出错,只能一个一个查。 另外还会遇到的问题是, 有时候无意中grep了一个大的文件,导致iowait冲高,引发不必要的系统异常告警。 有没有一个工具能够提供各种仪表盘,每次打开一个页面就能一目了然的看到调用各个api的情况,调用了多少次, 失败了多少次?

场景三 测试同学

开发人员上线新版本,上线过程中可能会出现各种问题。 有时不能及时发现会引起哪些异常,对其它系统有哪些影响。有没有一个工具,可以看到和分析上线新版本前后的变化?这样就能有助于分析相应的故障是否是和上线新版本有关了。

场景四 团队Leader

作为一个团队领导, 团队开发产品已经上线一段时间了, 希望看到产品有多少人访问, 哪个功能访问了多少次,模块的出错率如何,每次都到机器上去跑分析脚本,费时费力,还不直观, 如果产品部署在分布式集群统计起来更是麻烦, 有没有一个系统能以更加简便的方式可以查看到这些情况?

上述的问题,ELK统统可以解决。另外,ElasticSearch还是非常出色的NoSQL产品,广泛应用于搜索、数据分析、安全等领域。

0x2 Kibana界面功能

下面就是Kibana的基础界面

进入演示

0x3 Kibana查询语法

本次我们主要介绍Kibana的简易语法,用20%时间学会80%的运用手段。 这些简易语法是Kibana上最常用的搜索语法,必须要掌握!

简易语法详细解析:

全文模糊搜索:直接搜索关键字

这个最简单,直接在查询文本框里输入,想查的关键字,比如:tms

单个字段的模糊搜索:单字段的全文检索

在搜索关键字 之前 加上字段名和冒号 ,可以写作 :
message:ESB响应报文
request_uri:"/kxtx-ga/api/apiApp/~"

单字段的精确检索

单字段的精确检索,在搜索关键字前后加双引号,比如:知道线程的关键字是“http”,想查询这些线程下的相关日志。
thread_name:"http"

单个字段的多匹配项搜索

+:搜索结果中必须包含此项 -:不能含有此项 什么都没有则可有可无: +token -appVersion appCode

多个检索条件的组合

可以使用 NOT, AND 和 OR 来组合检索,注意必须是大写
比如下面的查询,在ESB的ERROR级别日志中,剔除掉部分常见异常,用来监控ESB本身Engine的问题。
NOT message:("Value for taskId cannot be null" OR "ESB获取请求头异常" OR "com.gillion.esb.engine.exceptions.ResponseException" OR "http:500 服务提供方系统处理错误" OR "http:404" OR "无法正常读取HTTP响应结果" OR "http:504" OR "http:503" OR "http:502") AND log_level:ERROR

字段是否存在

比如在Nginx的日志分析,exists:tags 表示要求 tags 字段存在;missing:tags 表示要求 tags 字段不存在。

通配符

用 ? 表示单字母, 表示任意个字母。比如 fir?t mess

正则

需要比通配符更复杂一点的表达式,可以使用正则。比如 mesg:/mes{2}ages?/。注意 ES 中正则性能很差,而且支持的功能也不是特别强大,尽量不要使用。

范围搜索

数值/时间/IP/字符串 类型的字段可以对某一范围进行查询
比如:

1
2
3
4
5
6
length:[100 TO 200]
sip:["172.24.20.110" TO "172.24.20.140"]
date:{"now-6h" TO "now"}
tag:{b TO e} 搜索b到e中间的字符
count:[10 TO *] 表示一端不限制范围
count:[1 TO 5}

注:
[ ] 表示端点数值包含在范围内
{ } 表示端点数值不包含在范围内
可以混合使用,比如上面语句为1到5,包括1,不包括5。
简化写法:

1
2
3
4
responsetime:>10
responsetime:<=10
responsetime:(>0 AND <=30)
request_uri:"/kxtx-ga/api/apiApp/~" AND responsetime:>3

0x4 总结与Q&A

本文主要面向日志分析的场景,为刚刚接触的同学,介绍了ELK的基本知识。主要包括:

  1. 什么是ELK。
  2. ELK的使用场景,尤其是在日志方面的广泛用途
  3. Kibana的界面和主要功能
  4. Kibana的日志查询语法

0x5 参考资料

#数据/ELK