写点什么

大数据 -187 Logstash Filter 插件实战:grok 解析控制台与 Nginx 日志(7.3.0 配置可复用)

作者:武子康
  • 2025-12-18
    山东
  • 本文字数:3551 字

    阅读完需:约 12 分钟

大数据-187 Logstash Filter 插件实战:grok 解析控制台与 Nginx 日志(7.3.0 配置可复用)

TL;DR

  • 场景:Logstash 通过 Filter(重点 grok)把非结构化日志实时解析成结构化字段,便于后续写入 ES。

  • 结论:Filter 顺序决定结果;grok 最强但最吃性能;用 rubydebug 做快速回归验证配置正确性。-产出:两套可跑配置(stdin 提取日期、stdin 解析 Nginx access log)+ 常见故障定位/修复清单。


版本矩阵


Filter 插件

Logstash 是一个开源的服务器端数据处理管道工具,由 Elastic 公司开发和维护。它常用于从多种异构数据源(如日志文件、数据库、消息队列等)收集、处理并将数据规范化后发送到指定存储位置(如 Elasticsearch、MongoDB 等)。其架构主要包含三个核心组件:Input、Filter 和 Output,其中 Filter 插件是最具灵活性和功能强大的部分。


Filter 插件负责对传入的数据进行深度处理和转换,它位于 Logstash 管道的中间环节。具体工作流程是:首先接收来自输入 (Input) 的原始数据,然后通过一系列过滤器进行解析、增强和变换操作,最终将处理后的结构化数据传递给输出 (Output)。常见的 Filter 插件包括:


  1. grok - 使用正则表达式解析非结构化日志数据

  2. mutate - 修改字段内容,如重命名、删除或替换

  3. date - 解析日期字段并转换为标准时间戳

  4. geoip - 根据 IP 地址添加地理位置信息

  5. kv - 解析键值对格式的数据


Logstash 之所以在数据处理领域表现强悍,主要归功于其丰富多样的 Filter 插件生态系统。通过灵活组合不同的过滤器,我们可以实现复杂的 ETL(提取-转换-加载)流程。例如,一个典型的日志处理流程可能包含:先用 grok 解析原始日志格式,然后用 date 处理时间戳,最后用 mutate 清理不必要的字段。这种模块化设计使得 Logstash 能够适应各种复杂的数据处理需求,将原始的非结构化数据转换为易于分析和查询的结构化格式。


在实际应用中,Filter 插件的组合使用可以实现诸如:日志标准化、数据脱敏、字段类型转换、多数据源关联等高级功能,这大大提升了数据的可用性和价值。

Filter 插件的功能

Filter 插件的核心任务是对日志或事件进行处理和转化,提供数据增强、清理和重新格式化的功能。它能够:


  • 提取结构化数据:从非结构化数据中提取特定字段(如 JSON、CSV 等格式的日志)。

  • 格式化数据:将字段转换为特定的数据类型或格式,例如将字符串转换为时间戳、数字等。

  • 增强数据:通过添加额外信息或进行查询、匹配等操作来丰富日志数据(例如添加地理位置信息)。

  • 过滤数据:根据特定条件筛选出需要或不需要的数据。

Filter 的注意事项

  • 顺序执行:Filter 插件的顺序非常重要,Logstash 会按配置文件中的顺序依次执行每个插件。因此,确保顺序符合数据处理逻辑。

  • 性能优化:在处理大规模日志时,某些复杂的 Filter(如 grok)可能影响性能,需要结合其他插件(如 mutate)优化处理流程。

  • 测试和调试:使用 stdout { codec => rubydebug } 或类似工具测试 Filter 结果,确保数据处理符合预期。

grok 正则表达式

grok 正则表达式是 Logstash 非常重要的一个环境,可以通过 grok 非常方便的将数据拆分和索引。语法格式:


(?<name>pattern)?<name>表示要取出里面的值,pattern就是正则表达式
复制代码

控制台数据收集

需求描述

收集控制台输入数据,采集日期时间出来。

编写配置

cd /opt/servers/logstash-7.3.0/configvim filter.conf
复制代码


写入的如下:


input {stdin{}}filter {  grok {    match => {      "message" => "(?<date>\d+\.\d+)\s+"    }  }}output {stdout{codec => rubydebug}}
复制代码


写入的内容如下图所示:


检查配置

cd /opt/servers/logstash-7.3.0bin/logstash -f /opt/servers/logstash-7.3.0/config/filter.conf -t
复制代码


执行的结果如下图所示:


启动服务

cd /opt/servers/logstash-7.3.0bin/logstash -f /opt/servers/logstash-7.3.0/config/filter.conf
复制代码


在控制台输入: “hello world”,可以看到结果如下图所示:


grok 收集 Nginx 日志

需求描述

Nginx 的访问日志通常采用 CLF(Common Log Format)或扩展的 CLF 格式,这是一种非结构化的文本数据。典型的日志条目包含以下信息:


36.157.150.1 - - [05/Nov/2019:12:59:28 +0800] "GET/phpmyadmin_8c1019c9c0de7a0f/js/get_scripts.js.php?scripts%5B%5D=jquery/jquery-1.11.1.min.js&scripts%5B%5D=sprintf.js&scripts%5B%5D=ajax.js&scripts%5B%5D=keyhandler.js&scripts%5B%5D=jquery/jquery-ui-1.11.2.min.js&scripts%5B%5D=jquery/jquery.cookie.js&scripts%5B%5D=jquery/jquery.mousewheel.js&scripts%5B%5D=jquery/jquery.event.drag-2.2.js&scripts%5B%5D=jquery/jquery-ui-timepickeraddon.js&scripts%5B%5D=jquery/jquery.ba-hashchange-1.3.js HTTP/1.1" 200 139613 "-""Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/45.0.2454.101 Safari/537.36"
复制代码


这个日志记录包含以下关键字段:


  1. 客户端 IP 地址

  2. 访问时间戳(包含时区)

  3. HTTP 请求方法(GET/POST 等)

  4. 请求的 URL 路径和查询参数

  5. HTTP 协议版本

  6. 响应状态码

  7. 响应大小(字节数)

  8. 引用来源

  9. 用户代理信息


传统的数据处理流程是:


  1. 使用 Hadoop MapReduce 或 Apache Spark 等大数据处理框架

  2. 编写解析代码将非结构化日志转换为结构化数据

  3. 处理大规模数据时,这个过程可能耗时数小时甚至更久


更高效的解决方案是使用 Logstash 的 grok 功能:


  • Grok 是一种强大的日志解析引擎,内置 120+种常用模式

  • 可以定义自定义模式来匹配特定的日志格式

  • 对于 Nginx 日志,可以使用以下 grok 模式:


  %{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response} (?:%{NUMBER:bytes}|-) (?:%{QS:referrer}|-) %{QS:useragent}
复制代码


  • 处理流程:

  • 配置 Logstash 输入插件读取 Nginx 日志文件

  • 使用 grok 过滤器解析日志内容

  • 输出结构化数据到 Elasticsearch 或其他存储系统


这种方法相比传统大数据处理方案的优势:


  • 实时处理能力:日志产生后立即处理

  • 资源消耗低:不需要启动大规模计算集群

  • 配置灵活:可以随时调整解析规则

  • 与 ELK(Elasticsearch, Logstash, Kibana)生态无缝集成


典型应用场景:


  • 实时监控网站访问情况

  • 快速识别异常请求

  • 即时分析用户行为

  • 安全审计和攻击检测

安装插件

cd /opt/servers/logstash-7.3.0bin/logstash-plugin install Logstash-filter-grok
复制代码


可以看到安装结果如下图所示:


编写配置

定义 Logstash 的配置文件如下,我们从控制台输入 Nginx 的日志数据,然后经过 Filter 的过滤,将我们的日志文件转换为标准的数据格式:


cd /opt/servers/logstash-7.3.0/configvim monitor_nginx.conf
复制代码


写入的内容如下:


input {  stdin {}}
filter { grok { match => { "message" => "%{IPORHOST:clientip} \- \- \[%{HTTPDATE:time_local}\] \"(?:%{WORD:method} %{NOTSPACE:request}(?:HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:status} %{NUMBER:body_bytes_sent} %{QS:http_referer} %{QS:agent}" } }}
output { stdout { codec => rubydebug }}
复制代码


写入的内容如下图所示:


检查配置

cd /opt/servers/logstash-7.3.0bin/logstash -f /opt/servers/logstash-7.3.0/config/monitor_nginx.conf -t
复制代码


检查结果如下图所示:


启动配置

cd /opt/servers/logstash-7.3.0bin/logstash -f /opt/servers/logstash-7.3.0/config/monitor_nginx.conf
复制代码


启动结果如下图所示:


测试数据

在控制台中输入如下的数据:


113.31.119.183 - - [05/Nov/2019:12:59:27 +0800] "GET/phpmyadmin_8c1019c9c0de7a0f/js/messages.php?lang=zh_CN&db=&collation_connection=utf8_unicode_ci&token=6a44d72481633c90bffcfd42f11e25a1HTTP/1.1" 200 8131 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, likeGecko) Chrome/45.0.2454.101 Safari/537.36"
复制代码


可以看到控制台解析出了内容如下所示:


错误速查

其他系列

🚀 AI 篇持续更新中(长期更新)

AI 炼丹日志-29 - 字节跳动 DeerFlow 深度研究框斜体样式架 私有部署 测试上手 架构研究,持续打造实用 AI 工具指南!AI 研究-132 Java 生态前沿 2025:Spring、Quarkus、GraalVM、CRaC 与云原生落地🔗 AI模块直达链接

💻 Java 篇持续更新中(长期更新)

Java-196 消息队列选型:RabbitMQ vs RocketMQ vs KafkaMyBatis 已完结,Spring 已完结,Nginx 已完结,Tomcat 已完结,分布式服务已完结,Dubbo 已完结,MySQL 已完结,MongoDB 已完结,Neo4j 已完结,FastDFS 已完结,OSS 已完结,GuavaCache 已完结,EVCache 已完结,RabbitMQ 正在更新... 深入浅出助你打牢基础!🔗 Java模块直达链接

📊 大数据板块已完成多项干货更新(300 篇):

包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈!大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT 案例 详解🔗 大数据模块直达链接

发布于: 刚刚阅读数: 3
用户头像

武子康

关注

永远好奇 无限进步 2019-04-14 加入

Hi, I'm Zikang,好奇心驱动的探索者 | INTJ / INFJ 我热爱探索一切值得深究的事物。对技术、成长、效率、认知、人生有着持续的好奇心和行动力。 坚信「飞轮效应」,相信每一次微小的积累,终将带来深远的改变。

评论

发布
暂无评论
大数据-187 Logstash Filter 插件实战:grok 解析控制台与 Nginx 日志(7.3.0 配置可复用)_大数据_武子康_InfoQ写作社区