ELK——Logstash filter的使用和Kibana应用

本文深入介绍了Logstash的filter组件,特别是Grok插件的使用,包括自定义正则表达式解析日志。此外,还讲解了date插件用于时间字段的转换,Geoip Filter获取IP的地理位置信息。最后,文章通过Kibana展示了如何应用这些解析后的数据,如IP访问TOP5、PV统计、实时流量、登录次数和访问地区的可视化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Logstash filter 的使用

Filter插件(过滤器插件)是Logstash功能强大的主要原因,它可以对Logstash Event进行丰富的处理,比如说解析数据、删除字段、类型转换等等,常见的有如下几个:

grok:正则匹配解析

date: 日期解析

dissect:分割符解析

mutate:对字段做处理,比如重命名、删除、替换等

json:按照json解析字段内容到指定字段中

geoip:增加地理位置数据

ruby: 利用ruby代码来动态修改Logstash Event

Grok插件

grok是一个十分强大的logstash filter插件,他可以通过正则解析任意文本,将非结构化日志数据解析成结构化和方便查询的结构内容,将其定义成我们平时容易理解的一些字段名称。他是目前logstash 中解析非结构化日志数据最好的方式。

使用grok filter需要在logstash的配置文件中加上这样的内容:

filter {

    grok {

        match => {

                    "message" => "grok_pattern"

                }

    }

}

这段代码中除了grok_pattern(grok表达式,[ˈpætərn]模式)以外都是logstash的关键字。grok_pattern部分需要使用者填充自己的解析方式。

grok_pattern由零个或多个%{SYNTAX:SEMANTIC}组成

其中SYNTAX是表达式的名字,即文本匹配的模式的名称,是由grok提供的,例如数字表达式的名字是NUMBER,IP地址表达式的名字是IP。

SEMANTIC表示解析出来的这个字符的名字,即为匹配的文本提供的标识符,由自己定义,例如IP字段的名字可以是client。【syntax [ˈsɪntæks]语法,semantic [sɪˈmæntɪk]语义】

对于下面这条日志:

192.168.10.3 GET /index.html 15824 0.043

可以这样解析:

将会得到这样的结果:

* client: 192.168.10.3

* method: GET

* request: /index.html

* bytes: 15824

* duration: 0.043

数字表达式的名字是NUMBER,%{NUMBER:duration}可以匹配数值类型,但是grok匹配出的内容都是字符串类型,可以通过在最后指定为int或者float来强制转换类型。%{NUMBER:duration:float}

data_type 目前只支持两个值:int 和 float。

grok提供了哪些SYNTAX?可以查看文件grok-patterns,它默认放在路径/usr/local/logstash-7.3.0/vendor/bundle/jruby/2.5.0/gems/logstash-patterns-core-4.1.2/patterns/目录下。

测试:创建一个测试配置文件,如test.conf,内容如下:

[root@elk01 ~]# vim /usr/local/logstash-7.3.0/config/test.conf

input {stdin{}}
filter {
     grok {
        match => {
            "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}"
        }
     }
}
output {stdout{codec => rubydebug}}

使用test.conf启动一个logstash实例,通过键盘输入如下内容:

192.168.10.3 GET /index.html 15824 0.043

[root@elk01 ~]# logstash -f /usr/local/logstash-7.3.0/config/test.conf #之前有实例可以--path.data=换个路径

默认grok调用的是:

/usr/local/logstash-7.3.0/vendor/bundle/jruby/2.5.0/gems/logstash-patterns-core-4.1.2/patterns/这个目录下的正则

假设现在要匹配一个正则表达式为regexp的字符串,而grok预定义的SYNTAX都不满足,也可以自己定义一个SYNTAX。

自定义SYNTAX方式有两种:

1)直接在grok里面使用自定义表达式

语法格式:(?<filed_name>pattern)

?<filed_name>表示要取出里面的值,pattern就是正则表达式

例如:定制化字段,取出想要的字段

“6.18 beijing sunny”,然后取出每一个字段

编辑test.conf文件,内容如下:

[root@elk01 ~]# vim /usr/local/logstash-7.3.0/config/test.conf

input {stdin{}}
filter {
     grok {
        match => {
            "message" => "(?<date>\d+\.\d+)\s+(?<city>\w+)\s+(?<weather>\w+)"
        }
     }
}
output {stdout{codec => rubydebug}}

运行logstash,输入“6.18 beijing sunny”内容,并查看输出结果

[root@elk01 ~]# logstash -f /usr/local/logstash-7.3.0/config/test.conf --path.data=/aa

(2)自定义表达式文件

在某个目录下创建一个文件,文件名自定义,如在/usr/local/logstash-7.3.0/vendor/bundle/jruby/2.5.0/gems/logstash-patterns-core-4.1.2/patterns/目录下创建正则表达式文件test

将目录加入grok路径: patterns_dir => "./patterns"

将想要增加的正则表达式写入,格式:SYNTAX_NAME regexp

使用方法和使用默认SYNTAX相同:%{SYNTAX_NAME:SEMANTIC}

例如:使用grok自定义正则去匹配下边的日志

10.173.28.112  2018-11-22 16:30:58  GET  /AUTO/users/loginSuccess.do  200  46112  0.075

在/usr/local/logstash-7.3.0/vendor/bundle/jruby/2.5.0/gems/logstash-patterns-core-4.1.2/patterns/

目录下创建正则表达式文件test,内容如下:

[root@elk01 ~]# vim /usr/local/logstash-7.3.0/vendor/bundle/jruby/2.5.0/gems/logstash-patterns-core-4.1.2/patterns/test  #简单的

USER_IPADDRESS ([0-9\.]+)\s+
DATETIME ([0-9\-]+\s[0-9\:]+)\s+
METHOD ([A-Z]+)\s+
URL ([\/A-Za-z0-9\.]+)\s+
STATUS ([0-9]+)\s+
REQUEST_SEND ([0-9]+)\s+
REQUEST_TIME ([0-9\.]+)

编辑logstash配置文件test.conf文件,内容如下:

[root@elk01 ~]# vim /usr/local/logstash-7.3.0/config/test.conf

input {stdin{}}
filter {
     grok {
        patterns_dir => ["./patterns"] 
        match => { "message" => "%{USER_IPADDRESS:user_ip} %{DATETIME:date} %{METHOD:method} %{URL:url} %{STATUS:status} %{REQUEST_SEND:request_send} %{REQUEST_TIME:request_time}" }
     }
}
output {stdout{codec => rubydebug}}

进入/usr/local/logstash-7.3.0/vendor/bundle/jruby/2.5.0/gems/logstash-patterns-core-4.1.2/patterns/目录下

运行logstash程序:查看输出结果

总结:

grok是通过系统预定义的正则表达式或者通过自己定义正则表达式来匹配日志中的各个值。

正则解析式比较容易出错,建议先调试,kibana提供了grok debbuger

使用Grok Filter插件编辑解析nginx日志

grok作为一个logstash的过滤插件,支持根据正则表达式解析文本日志行。在生产环境中,nginx日志格式往往使用的是自定义的格式,我们需要把logstash中的message结构化后再存储,方便kibana的搜索和统计,因此需要对message进行解析。

Grok插件使用详解:

Grok filter plugin | Logstash Reference [7.3] | Elastic

本文采用grok过滤器,使用match正则表达式解析,根据自己的log_format定制。

Nginx日志格式

log_format配置如下:

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status $body_bytes_sent "$http_referer" '

                      '"$http_user_agent" "$http_x_forwarded_for"';

access_log  logs/access.log  main; #注释取消

$remote_addr变量:记录了客户端的IP地址(普通情况下)。

$remote_user变量:当nginx开启了用户认证功能后,此变量记录了客户端使用了哪个用户进行了认证。

$time_local变量:记录了当前日志条目的时间。

$request变量:记录了当前http请求的方法、url和http协议版本。

$status变量:记录了当前http请求的响应状态,即响应的状态码,比如200、404等响应码,都记录在此变量中。

$body_bytes_sent变量:记录了nginx响应客户端请求时,发送到客户端的字节数,不包含响应头的大小。

$http_referer变量:记录了当前请求是从哪个页面过来的,比如你点了A页面中的超链接才产生了这个请求,那么此变量中就记录了A页面的url。

$http_user_agent变量:记录了客户端的软件信息,比如,浏览器的名称和版本号。

### ELK 堆栈的日志管理分析 #### 工作原理概述 ELK 是由 Elasticsearch、Logstash Kibana 组成的一个开源工具链,用于日志管理与分析。其基本工作流如下: - **Logstash** 负责从各种来源收集日志数据,并对其进行过滤格式化后发送至 Elasticsearch[^1]。 - **Elasticsearch** 提供强大的搜索引擎功能,负责对接收到的数据进行索引存储。 - **Kibana** 则作为前端界面,允许用户通过图形化的方式查询、分析以及可视化这些数据[^3]。 #### 安装与配置步骤说明 ##### 1. 安装 Elasticsearch Elasticsearch 是整个系统的基石,它提供了分布式搜索数据分析的能力。安装过程中需要注意版本兼容性问题。下载地址可以通过官方链接获取[^2]。完成安装后需调整 `elasticsearch.yml` 文件中的集群名称、节点名称以及其他必要的网络设置参数以适应实际环境需求。 ##### 2. 部署 Logstash Logstash 主要承担着数据输入端的角色,可以从文件系统、数据库或其他服务中提取原始记录再经过一系列插件处理之后传送给下游组件即 Elasticsearch 实例群组里去。具体操作包括解压软件包到目标目录下然后编辑对应的 configuration file 来定义 pipeline 的行为模式比如 source type filter output destination等等。 ##### 3. 设置 Kibana 最后一步就是启动 Kibana 应用来连接已有的 ES 数据库实例从而实现交互式的探索体验。同样地也需要修改默认路径下的 kibana.config.json 或者其他形式的初始化脚本来指定正确的 backend URL 地址确保两者之间能够正常通信握手成功建立联系。 以下是简单的 Python 示例来演示如何向运行中的 logstash 发送消息: ```python import logging import socket def send_log_to_logstash(message): host = 'localhost' # 替换为您的logstash主机名/IP port = 5000 # 替换为您所使用的TCP端口号 try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((host, port)) sock.sendall(bytes(message + '\n', 'utf-8')) sock.close() except Exception as e: logger.error(f"Failed to send message {message} due to error: {e}") if __name__ == "__main__": test_message = "This is a test log entry" send_log_to_logstash(test_message) ``` 此代码片段展示了怎样利用标准库里的套接字模块构建起基础版客户端程序以便于测试目的验证我们的pipeline是否按预期那样运作良好。 #### 总结 综上所述,通过合理规划各部分之间的协作关系再加上细致入微得当的各项设定就可以顺利达成基于ELK框架之上高效稳定可靠的解决方案来满足企业级应用场合当中对于海量结构化半结构性乃至完全非结构化的各类事件追踪审计等方面提出的苛刻要求了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值