
环境
Kibana : v 8.1.1
ElasticSearch :v 8.1.1
背景
1、应用rest/http等接口调用记录都有通过拦截器记录到ES 中(其中就包含了请求header头信息)
2、header头信息整个以字符串的形式记录(header中的key,如agent 没有以独立的字段记在es中)
需求
统计所某天所有调用的http客户端类型
分析
因在 Kibana 的 KQL(Kibana Query Language)中,不能直接使用字符串索引函数。
KQL 的设计目的是提供一种简单直观的方式来过滤 Elasticsearch 数据,它支持基本的字段查询、短语匹配、范围查询等功能,但不支持复杂的字符串处理函数 ,如 indexOf、substring 等。
如果需要实现类似字符串位置查找的功能,可以使用 script 查询 来完成。通过在查询中嵌入脚本,可以利用 Elasticsearch 的脚本语言(如 Painless)来执行字符串操作。
因此,虽然 KQL 本身不支持索引函数,但可以通过结合使用 script 查询来实现更复杂的字符串匹配逻辑。
结论:不能直接分组查出所有客户端类型,只能一个个找出来。下面我们找出一个在查询条件中排除一个。
Kibana查询
查询Postman工具调用记录
javascript
GET /hlog-***-comm-undef.2026.01.16/_search
{
"from":0,
"size":8,
"_source":{
},
"query": {
"bool": {
"filter": [
{
"range": {
"lctTime": {
"gte": "2026-01-16T00:00:00",
"lt": "2026-01-16T23:00:00"
}
}
},
{
"exists": {
"field": "logObj.header"
}
},
{
"match_phrase": {
"logObj.header": "\"user-agent\" : \"PostmanRuntime"
}
},
{
"term": {
"logObj.app.keyword": "channel-***-service该条件按需添加"
}
},
{
"match_phrase": {
"logObj.uri": "/staff/methodName该条件按需添加"
}
}
]
}
}
}

查询出所有客户端类型
(上面说过)这里不能直接输出,可使用上面的查询去掉postman条件查看结果后,把看到的客户端类型(user-agent)记下来然后在查询条件中排除该类型,然后继续查询,最终得下面的的查询
javascript
GET /hlog-***-comm-undef.2026.01.16/_search
{
"from":0,
"size":8,
"_source":{
},
"query": {
"bool": {
"must_not": [
{
"match_phrase": {
"logObj.header": "Mozilla"
}
},
{
"match_phrase": {
"logObj.header": "okhttp"
}
},
{
"match_phrase": {
"logObj.header": "Commons-HttpClient"
}
},
{
"match_phrase": {
"logObj.header": "Apache-HttpClient"
}
},
{
"match_phrase": {
"logObj.header": "\"user-agent\" : \"Java"
}
},
{
"match_phrase": {
"logObj.header": "\"user-agent\" : \"3gpp-gba"
}
},
{
"match_phrase": {
"logObj.header": "\"user-agent\" : \"CommCenter"
}
},
{
"match_phrase": {
"logObj.header": "\"user-agent\" : \"CPM-client"
}
},
{
"match_phrase": {
"logObj.header": "\"user-agent\" : \"ReactorNetty"
}
},
{
"match_phrase": {
"logObj.header": "\"user-agent\" : \"IM-client"
}
},
{
"match_phrase": {
"logObj.header": "\"user-agent\" : \"python-requests"
}
},
{
"match_phrase": {
"logObj.header": "\"user-agent\" : \"p220041401"
}
},
{
"match_phrase": {
"logObj.header": "\"user-agent\" : \"P220041701"
}
},
{
"match_phrase": {
"logObj.header": "\"user-agent\" : \"Telecom API Gateway"
}
},
{
"match_phrase": {
"logObj.header": "\"user-agent\" : \"CRM"
}
},
{
"match_phrase": {
"logObj.header": "\"user-agent\" : \"Axis"
}
},
{
"match_phrase": {
"logObj.header": "\"x-frame-options\" : \"SAMEORIGIN"
}
}
],
"filter": [
{
"range": {
"lctTime": {
"gte": "2026-01-16T00:00:00",
"lt": "2026-01-16T23:00:00"
}
}
},
{
"exists": {
"field": "logObj.header"
}
},
{
"match_phrase": {
"logObj.header": "\"user-agent\" : \""
}
},
{
"term": {
"logObj.app.keyword": "channel-view-service"
}
},
{
"match_phrase": {
"logObj.uri": "/staff/issueStaffInfo"
}
}
]
}
}
}
查询header字段中没有agent属性的数据
javascript
GET /hlog-***-comm-undef.2026.01.18/_search
{
"from":0,
"size":2,
"_source":{
},
"query": {
"bool": {
"must_not": [
{
"match_phrase": {
"logObj.header": "\"user-agent\""
}
}
],
"filter": [
{
"range": {
"lctTime": {
"gte": "2026-01-18T00:00:00",
"lt": "2026-01-18T23:00:00"
}
}
},
{
"exists": {
"field": "logObj.header"
}
}
]
}
}
}
客户端类型汇总(含工具)

附件一:Kibana查询知识总结
查询语法核心
Kibana主要支持三种查询方式,各有侧重:
- **KQL (Kibana Query Language)**:最常用,语法简洁,适合快速过滤和全文搜索。
- Lucene Query String:功能更强大,支持布尔逻辑、通配符和正则表达式,适合复杂查询。
- **JSON DSL (Query DSL)**:最灵活,通过JSON结构构建复杂查询,常用于Kibana高级功能或API调用。
KQL 语法详解
KQL是Kibana的默认查询语言,易于上手。
- 字段搜索 :
field_name: value,例如status: 200。 - 通配符 :
*匹配多个字符,?匹配单个字符,例如user.name: jo*。 - 范围查询 :
[起始 TO 结束],例如bytes: [1000 TO 5000]。 - 布尔操作 :
AND、OR、NOT,例如status: 200 AND method: GET。 - 存在查询 :
_exists_: field_name。 - 模糊查询 :
field_name: value~,支持拼写容错。
Lucene 语法详解
Lucene语法功能更强大,适合复杂场景。
- 短语搜索 :用双引号
",例如"error occurred"。 - 正则表达式 :用
/包裹,例如message: /error.*/。 - 距离查询 :
field_name: "word1 word2"~n,指定单词间最大间隔。 - 提升权重 :
field_name: value^2,提高匹配文档的相关性评分。
实战技巧
- 组合查询 :在KQL中使用
AND、OR组合多个条件。 - 时间范围:利用Kibana的时间选择器快速过滤日志。
- 调试查询:使用Kibana的"Dev Tools"或"Search Profiler"分析查询性能。
语法对比
| 特性 | KQL | Lucene Query String |
|---|---|---|
| 易用性 | 简单直观 | 稍复杂 |
| 功能 | 基础过滤、全文搜索 | 通配符、正则、布尔逻辑 |
| 适用场景 | 快速查询、日常过滤 | 复杂日志分析、精确匹配 |
附件二:Kibana基础知识及示例
Kibana是Elastic Stack的核心组件,用于可视化和分析Elasticsearch中的数据。以下是其核心概念和使用示例:
-
基本概念
- Kibana提供Web界面,用于搜索、过滤和可视化Elasticsearch数据
- 支持多种可视化类型,如柱状图、折线图、饼图等
- 提供Discover、Visualize、Dashboard三大核心功能模块
-
常用查询语法
- KQL(Kibana Query Language):简单直观的查询语言
- Lucene查询语法:支持复杂布尔逻辑和正则表达式
- DSL查询:JSON格式的完整查询定义
-
典型使用场景
- 日志分析和监控
- 业务数据可视化
- 实时数据仪表板构建
javascript
{
"query": {
"bool": {
"filter": [
{
"range": {
"timestamp": {
"gte": "now-1h",
"lt": "now"
}
}
}
]
}
}
}
代码说明:
-
该示例展示了一个基本的Kibana查询结构,用于筛选最近一小时内的数据。
-
使用了bool查询中的filter条件来限定时间范围。
-
这是构建Kibana仪表板的基础查询模板。