grok使用(将日志结构化)

news/2024/11/7 14:32:45/

1.前言

Grok是一种强大的日志解析工具,用于将结构化和非结构化的日志数据转换为可查询和分析的格式。它是由Elasticsearch的Logstash组件提供的一种插件,也可以作为独立的库在其他数据处理工具中使用,Grok通过使用预定义的模式(正则表达式)和模板,将复杂的日志行解析为具有可命名字段的结构化数据,即json结构。它可以解析各种格式的日志,如Apache日志、系统日志、应用程序日志等

2.作用

日志解析:Grok可以从原始日志数据中提取有用的字段,并将其解析为结构化的键值对。例如,它可以从一行Apache访问日志中提取IP地址、访问时间、请求方法、URL等信息,并将其存储为可查询的字段

数据标准化:由于日志的格式和结构通常不统一,不同应用和系统生成的日志可能具有不同的字段和格式。使用Grok,可以将这些不同格式的日志标准化为一致的格式,使其易于分析和处理

查询和过滤:通过将日志解析为结构化数据,可以使用查询语言(如Elasticsearch的查询语法)对日志数据进行灵活的查询和过滤。这样可以轻松筛选出感兴趣的日志事件,进行故障排除、监控分析、安全审计等操作

可视化和报告:通过将日志解析为结构化数据,可以将其与其他指标和数据源进行联合分析,并使用可视化工具(如Kibana)创建交互式仪表板和报告。这样可以更清晰地呈现日志数据的趋势、异常和关联性

3.使用

转化日志为结构化日志

以下通过一段nginx的access来展示grok通过正则表达式和预定义模板字段将非结构化日志解析为结构化日志的功能,我们可以使用kibana的grok debug功能来测试

 

访问一下nginx服务的80端口来生成access日志

curl 10.1.60.114

tail -f /var/log/nginx/access.log

10.1.13.252 - - [05/Jul/2023:10:55:37 +0800] "GET /img/header-background.png HTTP/1.1" 200 82896 "http://10.1.60.114/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" "-"

 将以上获取的日志填入到数据样例中

接下来就可以在grok模式里 写入正则和预定义模板来将以上的日志转化为结构化日志

先来简单的匹配一下前面的ip

这里是使用了预定义模板里的值IP,即预定义模板里是写好了的正则,直接通过变量调用即可 ,关于grok的预定义模板下面会展示出来

接下来继续匹配一下后面的内容,继续使用正则表达式和预定义模板

 对于固定的内容就直接把内容写入到语句里就可以了,如果有涉及正则表达式的字符就需要使用转义符,以上的[]是正则表达式里匹配中括号里任意内容的意思,所以需要使用转义符去转义为普通的字符

关于后面的匹配我就放出完整的grok表达式

%{IP:ip} - (%{USERNAME:remote_user}|-) \[%{HTTPDATE:time}\] \"%{WORD:request_method} %{URIPATHPARAM:request_uri} HTTP/%{NUMBER:http_version}\" %{NUMBER:http_status} %{NUMBER:bytes} \"(%{DATA:referrer}|-)\" \"%{DATA:http_agent}\" \"(%{DATA:forwarded}|-)\"

可以看到使用这条表达式完整的匹配了所有日志内容后,将以上的非结构化日志转化为了结构化日志 

再来看一条nginx error日志的转化

可以更改nginx的配置文件,随意往里面加入一些字符,再重载nginx配置就会产生报错日志

nginx -s reload

tail -f /var/log/nginx/error.log

2023/07/05 12:29:48 [emerg] 12584#12584: unknown directive "sdasdasd" in /etc/nginx/nginx.conf:35

 %{DATA:timestamp} \[%{WORD:severity}\] %{NUMBER:pid}#%{NUMBER:tid}: %{GREEDYDATA:prompt}

 可以看到使用以上的表达式,将error日志的非结构化日志,成功转化为了结构化日志

这个功能主要是再logstash使用,在logstash接收的日志为非结构化日志时,就需要用到filter中的grok去将日志转化为结构化日志,使日志在kibana中能更直观的展示出来,也方便查询

4.pattern(预定义模板)

logstash中有预定义的模板提供给grok使用,预定义模板中每个变量都有写好的正则表达式,在构建结构化日志时,直接调用变量即可,接下来看一下预定义模板中都有哪些正则表达式

在logstash的安装包目录下查找patterns目录

find /opt/logstash/logstash -name patterns

 ls -ll /opt/logstash/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-patterns-core-4.3.4/patterns/legacy/

 上图中的文件都是预定义模板,每个文件里都有多项预定义好的正则表达式,我们查看一下grok-patterns里的预定义表达式

cat /opt/logstash/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-patterns-core-4.3.4/patterns/legacy/grok-patterns

可以看到里面有很多预定义好的正则表达式,我们刚刚上面的表达里所使用的预定义模板都在里面,例如DATA、IP、GREEDYDATA他们名字后面都有带正则表达式,其它更多的表达式就需要自己在预定义模板文件中寻找了

这里额外补充一个知识,DATA和GREEDYDATA的正则表达式一个是.*一个是.*?

.*:这是贪婪模式,表示匹配任意长度的字符序列,包括空字符串和换行符之外的所有字符。它会尽可能地匹配尽量多的字符

.*?:这是非贪婪模式,表示匹配尽可能少的字符序列。问号 ? 放在量词 *+ 的后面,表示尽量少匹配。它会匹配任意长度的字符序列,但只匹配到满足后面的模式的最早的位置

在使用中需要注意这两个正则表达式,就如同上面案例中的表达式中末尾使用的是GREEDYDATA它使用的正则表达式是.*即会匹配后面所有的字符,要是末尾使用的是DATA 就会匹配为空


http://www.ppmy.cn/news/732002.html

相关文章

Mac电脑 重设开机密码

1、因为我用的是iMac,所以会有无线鼠标和无线键盘,这个不影响, 2、 3、 4、这里要注意:输入命令:resetpassword 按回车键方可。(可别学我啊 中间可没有空格键) 5、按照提示,在右侧输入完重设密码…

电脑小问题一:电脑重置后,鼠标右键转圈圈

文章参考:链接 一.前提:电脑重置后 二.出现问题:鼠标右键一直转圈圈 三.解决方法: 第一步,winR打开命令行,输入 services.msc 第二步,找到这个服务 第三步,双击进去,将…

java程序员电脑重置及配置全过程,注意事项

1.将重要资源存到U盘,包括 1. 以前写的代码, 2. 整理的笔记, 3. 现在正在写的代码, 4. 下载不方便的安装包, 5. 数据库存放数据的data文件夹(一重置所有数据库全没了) 2.重置电脑,…

网络重置或电脑重置后WLAN/WIFI图标不显示 最全解决方法

【问题】网络重置或电脑重置后WLAN不显示 目录 【问题】网络重置或电脑重置后WLAN不显示情况描述1. 重置后无法连接网络,右下网络标识出现黄色三角形2. 重置后设备管理器中网络适配器无WLAN/WIFI选项,且有黄色三角形3. 重置后网络设备适配器中选项全部消…

计算机配置设置重置,电脑怎么重置系统 电脑重置系统方法【图文】

虽然说电脑能够帮助我们做不少的事情,而且电脑的使用寿命也很长,但是有时候可能因为使用电脑的时间比较久了,也有可能因为电脑感染了一些病毒,往往导致电脑不可使用。特别是对于电脑系统来说,有时候会出现这样或者那样…

电脑重置可能出现的问题及解决办法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、重置电脑后发现没有以太网二、以太网出现后但是发现网络无法识别总结 前言 重置电脑后发现WIFI可以用但是没有以太网,连接不上。 提示&#xf…

2307d的继承与数组

原文 你好! 我是一个来自java而不是C/C的D用户,因此显然是这里为数不多的喜欢OO的人之一. 因此,虽然我很欣赏D严格遵循java设计的事实,但我想知道,为什么数组(AA同样)没有隐式继承: interface I {} class C : I {} void main() {I i;C c null;i c; //工作I[] ii;C[] cc nul…

阿里oss实现拖拽上传+二维码链接展示——技能提升

今天遇到一个需求,就是要实现拖拽上传文件,并调用渲染方法,将渲染后的链接通过二维码展示出来。 上一篇文章也是关于拖拽上传,但是接口是通过后端提供的上传方式来实现的,并非是直接调用阿里OSS来直接实现的。 1.拖拽…