kibana日志搜索规则及搜索界面显示处理

2023-12-07 14:18

本文主要是介绍kibana日志搜索规则及搜索界面显示处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

项目调用ES日志检索接口,实现简单的日志界面展示;操作数据,然后通过数据去渲染页面,而不是直接操作DOM

日志检索语法

简单的对基本的语法做一个总结

1.语法关键字

+ - && || ! ( ) { } [ ] ^ “ ~ * ? : /
如果所要查询的查询词中本身包含关键字,则需要用\进行转义(注意是本身!)

例1:rvm:5100/kibana/kibana:6.7.0

 

例2:[MessageBroker-1]

 

2.查询词(Term)

支持两种查询词,一种是单一查询词,如”hello”,一种是词组(phrase),如”hello world”。

例1:Unexpected

 

例2:”not get “

 

3. 查询域(Field)

在查询语句中,可以指定从哪个域中寻找查询词,如果不指定,则从默认域中查找。
查询域和查询词之间用:分隔,如title:”Do it right”。
:仅对紧跟其后的查询词起作用,如果title:Do it right,则仅表示在title中查询Do,而it right要在默认域中查询。

例1:stream:”stdout”

 

例2:只搜“1”,可以搜到log和message两个字段都有1,搜 log:“1”,只可以搜到log字段的1

 

4.通配符查询(Wildcard)

支持两种通配符:?表示一个字符,*表示多个字符。
通配符可以出现在查询词的中间或者末尾,如te?t,test*,te*t,但决不能出现在开始,如*test,?test。

例1:k8s-?

 

例2: k8s-*

 

例3:kube-syst*m

 

5.模糊查询(Fuzzy)

模糊查询的算法是基于Levenshtein Distance,也即当两个词的差别小于某个比例的时候,就算匹配,如roam~0.8,即表示差别小于0.2,相似度大于0.8才算匹配。

例1:fetc~

 

例2:con~

 

6.临近查询(Proximity)

在词组后面跟随~10,表示词组中的多个词之间的距离之和不超过10,则满足查询。
所谓词之间的距离,即查询词组中词为满足和目标词组相同的最小移动次数。
如索引中有词组”apple boy cat”。
如果查询词为”apple boy cat”~0,则匹配。
如果查询词为”boy apple cat”~2,距离设为2方能匹配,设为1则不能匹配。

步数123
(0)boyapplecat
(1) boy catapple
(2)appleboycat

如果查询词为”cat boy apple”~4,距离设为4方能匹配。

步数123
(0)catboyapple
(1) cat boyapple
(2) boycat apple
(3) boy applecat
(4)appleboycat

例1:”not get user”~0

 

例2:”get not user”~3

 

7.区间查询(Range)

区间查询包含两种,一种是包含边界,用[A TO B]指定,一种是不包含边界,用{A TO B}指定。
如date:[20020101 TO 20030101],当然区间查询不仅仅用于时间,如title:{Aida TO Carmen}

例1:hostname:{k8s-1 TO k8s-5}

 

8.增加一个查询词的权重(Boost)

可以在查询词后面加^N来设定此查询词的权重,默认是1,如果N大于1,则说明此查询词更重要,如果N小于1,则说明此查询词更不重要。
如jakarta^4 apache,”jakarta apache”^4 “Apache Lucene”

例1:network^4 error

 

9.布尔操作符

布尔操作符包括连接符,如AND,OR,和修饰符,如NOT,+,-。
默认状态下,空格被认为是OR的关系,QueryParser.setDefaultOperator(Operator.AND)设置为空格为AND。
+表示一个查询语句是必须满足的(required),NOT和-表示一个查询语句是不能满足的(prohibited)。

例1:network AND error

 

例2: network OR error

 

10.组合

可以用括号,将查询语句进行组合,从而设定优先级。
如(jakarta OR apache) AND website

例1:network AND (error OR success)

 

前端高亮显示kibana搜索结果

那界面如何实现key值标蓝显示,搜索结果标黄显示呢?
ES接口可以返回哪些是搜索结果,对应在文本中替换即可。

 

import React, { PureComponent, Fragment } from 'react';
import { connect } from 'dva';
import { formatMessage } from 'umi-plugin-react/locale';
import { Card, Button, DatePicker, Modal, notification } from 'antd';
import RefreshTable from '@/components/RefreshTable';
import PageHeaderWrapper from '@/components/PageHeaderWrapper';
import styles from './Log.less';
import AceEditor from 'react-ace';
import jQuery from 'jquery';
import brace from 'brace';
import 'brace/mode/json';
import 'brace/mode/yaml';
import 'brace/theme/github';
const $ = jQuery;const { RangePicker } = DatePicker;@connect(({ log, loading }) => ({log,loading: loading.models.log,
}))
class Log extends PureComponent {state = {pageSize: 50,pageNo: 1,filterParam: '',sortBy: '',sortFlag: 'desc',startTime: null,endTime: null,initFlag: true,logAll: [],renderStartFlag: true,renderParam: '',};lastlog = [];columns = [{title: '日志内容',dataIndex: '_source',disabled: true,key: '_source',render: (text, record, index) => (// 日志显示内容很多,且页面渲染,所以根据高度折叠;点击+查看更多<divstyle={{height: $('.antd-pro-pages-log-log-logColor').height() * 3 + Number(12),overflow: 'hidden',}}>{record._source &&this.getLogArr(record._source, index, record.highlight) &&this.getLogArr(record._source, index, record.highlight).length !== 0 &&this.getLogArr(record._source, index, record.highlight).map(item => (<Fragment>{/* 每个key值标蓝 logColor是蓝色样式 */}<span className={styles.logColor}>{Object.keys(item)[0]}</span>{/* 因为value值会对搜索结果标黄,span包裹搜索结果,所以需渲染html */}<spanclassName={styles.logText}dangerouslySetInnerHTML={{ __html: Object.values(item)[0] }}></span></Fragment>))}</div>),},{title: '创建时间',dataIndex: 'time',sorter: true,width: 155,key: 'time',},];componentDidMount() {// 一开始获取日志数据this.getServiceList();}getServiceList = value => {const { dispatch } = this.props;let params = {};if (!value) {const { pageSize, pageNo, filterParam, sortBy, sortFlag } = this.state;params = {pageSize,pageNo,keyword: filterParam.trim(),sortBy,sortFlag,};} else {params = value;}delete params.sortBy;dispatch({type: 'log/fetch',payload: params,callback: res => {this.setState({renderStartFlag: true,startLogTime: res.data.startTime,endLogTime: res.data.endTime,});},});};getLogArr = (logData, index, highlight) => {// highlight每一行数据标黄部分const { renderParam, initFlag, renderStartFlag } = this.state;if (!initFlag && !renderStartFlag) {let resultArr = [];resultArr = this.lastlog[index];return resultArr;}let logArr = [];if (logData && Object.keys(logData).length !== 0) {Object.keys(logData).forEach(item => {if (typeof logData[item] !== 'object') {// 如果不是对象,直接显示let logObj = {};logObj[item] = logData[item];logArr.push(logObj);} else {// 还是对象,继续循环Object.keys(logData[item]).forEach(citem => {if (typeof logData[item][citem] !== 'object') {let logObj = {};logObj[`${item}.${citem}`] = logData[item][citem];logArr.push(logObj);} else {Object.keys(logData[item][citem]).forEach(sitem => {let logObj = {};logObj[`${item}.${citem}.${sitem}`] =typeof logData[item][citem][sitem] === 'string'? logData[item][citem][sitem]: JSON.stringify(logData[item][citem][sitem]);logArr.push(logObj);});}});}});}let resultArr = [];let beforeArr = [];let afterArr = [];if (renderParam !== '' && renderStartFlag && highlight) {logArr.forEach(item => {Object.keys(highlight).forEach(jitem => {if (jitem === Object.keys(item)[0]) {let itemValue = highlight[jitem][0];itemValue = itemValue.replace(/</g, `&lt;`);itemValue = itemValue.replace(/>/g, `&gt;`);// 返回结果需高亮标黄的搜索结果;且把包含搜索结果的键值对提前itemValue = itemValue.replace(/@kibana-highlighted-field@/g,`<span class='logYellow'>`);itemValue = itemValue.replace(/@\/kibana-highlighted-field@/g, `</span>`);item[Object.keys(item)[0]] = itemValue;beforeArr.push(item);} else {afterArr.push(item);}});});resultArr = beforeArr.concat(afterArr);} else {resultArr = logArr;}this.lastlog[index] = resultArr;return resultArr;};render() {const {log: { data },loading,route,} = this.props;return (<PageHeaderWrapper content={`${formatMessage({ id: `logCaption` })}`}><Card bordered={false}><RefreshTabledata={data && data.data ? data.data : {}}rowKey={record =>`${record.id}/${record._source['@timestamp']}/${record._source['docker'] &&record._source['docker']['container_id']}/${record._source['_BOOT_ID']}`}columns={this.columns}locale={locle}expandedRowRender={record => (<AceEditorwidth="100%"mode="json"key={record._source['@timestamp']}height="300px"value={record._source ? JSON.stringify(record._source, null, 4) : ''}theme="github"name="UNIQUE_ID_OF_DIV"editorProps={{ $blockScrolling: true }}/>)}></RefreshTable></Card></PageHeaderWrapper>);}
}export default Log;

 

这篇关于kibana日志搜索规则及搜索界面显示处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/466191

相关文章

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性

Nacos日志与Raft的数据清理指南

《Nacos日志与Raft的数据清理指南》随着运行时间的增长,Nacos的日志文件(logs/)和Raft持久化数据(data/protocol/raft/)可能会占用大量磁盘空间,影响系统稳定性,本... 目录引言1. Nacos 日志文件(logs/ 目录)清理1.1 日志文件的作用1.2 是否可以删除

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1

SpringBoot实现文件记录日志及日志文件自动归档和压缩

《SpringBoot实现文件记录日志及日志文件自动归档和压缩》Logback是Java日志框架,通过Logger收集日志并经Appender输出至控制台、文件等,SpringBoot配置logbac... 目录1、什么是Logback2、SpringBoot实现文件记录日志,日志文件自动归档和压缩2.1、

Python处理大量Excel文件的十个技巧分享

《Python处理大量Excel文件的十个技巧分享》每天被大量Excel文件折磨的你看过来!这是一份Python程序员整理的实用技巧,不说废话,直接上干货,文章通过代码示例讲解的非常详细,需要的朋友可... 目录一、批量读取多个Excel文件二、选择性读取工作表和列三、自动调整格式和样式四、智能数据清洗五、

SpringBoot如何对密码等敏感信息进行脱敏处理

《SpringBoot如何对密码等敏感信息进行脱敏处理》这篇文章主要为大家详细介绍了SpringBoot对密码等敏感信息进行脱敏处理的几个常用方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录​1. 配置文件敏感信息脱敏​​2. 日志脱敏​​3. API响应脱敏​​4. 其他注意事项​​总结

Python使用python-docx实现自动化处理Word文档

《Python使用python-docx实现自动化处理Word文档》这篇文章主要为大家展示了Python如何通过代码实现段落样式复制,HTML表格转Word表格以及动态生成可定制化模板的功能,感兴趣的... 目录一、引言二、核心功能模块解析1. 段落样式与图片复制2. html表格转Word表格3. 模板生

Python Pandas高效处理Excel数据完整指南

《PythonPandas高效处理Excel数据完整指南》在数据驱动的时代,Excel仍是大量企业存储核心数据的工具,Python的Pandas库凭借其向量化计算、内存优化和丰富的数据处理接口,成为... 目录一、环境搭建与数据读取1.1 基础环境配置1.2 数据高效载入技巧二、数据清洗核心战术2.1 缺失

SpringBoot项目中Redis存储Session对象序列化处理

《SpringBoot项目中Redis存储Session对象序列化处理》在SpringBoot项目中使用Redis存储Session时,对象的序列化和反序列化是关键步骤,下面我们就来讲讲如何在Spri... 目录一、为什么需要序列化处理二、Spring Boot 集成 Redis 存储 Session2.1

使用nohup和--remove-source-files在后台运行rsync并记录日志方式

《使用nohup和--remove-source-files在后台运行rsync并记录日志方式》:本文主要介绍使用nohup和--remove-source-files在后台运行rsync并记录日... 目录一、什么是 --remove-source-files?二、示例命令三、命令详解1. nohup2.