ElasticStack技术之logstash介绍

article/2025/6/7 12:55:22

一、什么是Logstash

Logstash 是 Elastic Stack(ELK Stack)中的一个开源数据处理管道工具,主要用于收集、解析、过滤和传输数据。它支持多种输入源,如文件、网络、数据库等,能够灵活地对数据进行处理,比如通过过滤器插件进行数据的转换、聚合等操作,并将处理后的数据发送到各种输出目标,如 Elasticsearch、文件、数据库等。

二、Logstash的应用场景

  • 日志收集与分析 :Logstash可以从多种来源收集日志数据,如文件、HTTP请求、Syslog、数据库等。收集到的日志数据可以存储到Elasticsearch中,以便进行搜索和分析,帮助运维人员快速定位和解决问题。

  • 数据转换与过滤 :它可以对收集到的数据进行转换、过滤和聚合。例如,将JSON格式的数据转换为XML格式,或者过滤掉不需要的字段,还可以从非结构化数据中提取结构化信息,如利用Grok从日志中提取时间戳、IP地址等。

  • 数据集成与整合 :Logstash能够将不同来源、不同格式的数据进行统一收集和整合,为数据分析和挖掘提供统一的数据源。比如将来自多个应用系统的日志数据整合在一起,方便进行集中管理和分析。

  • 实时监控与告警 :通过Logstash实时收集和分析数据,可以及时发现系统中的异常和故障,触发告警和通知,帮助运维人员快速响应。

前面博文提到过logstash相比于filebeat更加重量级,那么我们也可以理解成filebeat的功能更多。但是我个人觉得日常使用filebeat就足够了。

三、logstash环境部署

1. 下载logstash

1.下载Logstash 
wget https://artifacts.elastic.co/downloads/logstash/logstash-7.17.28-amd64.deb

 2. 安装Logstash 

[root@elk93 ~]# ll -h logstash-7.17.28-amd64.deb 
-rw-r--r-- 1 root root 359M Mar 13 14:41 logstash-7.17.28-amd64.deb
[root@elk93 ~]# 
[root@elk93 ~]# dpkg -i logstash-7.17.28-amd64.deb 3.创建符号链接,将Logstash命令添加到PATH环境变量
[root@elk93 ~]# ln -svf /usr/share/logstash/bin/logstash /usr/local/bin/
'/usr/local/bin/logstash' -> '/usr/share/logstash/bin/logstash'
-s创建软链接文件
-v显示过程
-f如果文件存在则覆盖[root@elk93 ~]# 
[root@elk93 ~]# logstash --help

四、 使用logstash

1.  基于命令行方式启动实例

基于命令行的方式启动实例,使用-e选项指定配置信息(不推荐)
[root@elk93 ~]# logstash -e "input { stdin { type => stdin } } output { stdout { codec => rubydebug } }"
11111111111111111111111111111111111111111111111
{"type" => "stdin","@timestamp" => 2025-03-13T11:39:04.474Z,"message" => "11111111111111111111111111111111111111111111111","@version" => "1","host" => "elk93"
}启动实例会有很多不同程度的报错信息,我们可以指定查看日志程度

我们指定level为warn,不输出info字段了
[root@elk93 ~]# logstash -e "input { stdin { type => stdin } } output { stdout { codec => rubydebug } }"  --log.level warn
加参数 --log.level warn
这样在查看就没有info字段信息了
22222222222222222222222222222222222222222
{"@version" => "1","type" => "stdin","host" => "elk93","message" => "22222222222222222222222222222222222222222","@timestamp" => 2025-03-13T11:41:58.326Z
}

 2. 基于配置文件启动实例

[root@elk93 ~]# cat /etc/logstash/conf.d/01-stdin-to-stout.conf
input {file {path => "/tmp/student.txt"}
}
output { stdout { codec => rubydebug } 
}[root@elk93 ~]# logstash -f /etc/logstash/conf.d/01-stdin-to-stout.conf [root@elk93 ~]# echo 11111111111111111111 >>/tmp/student.txt{"host" => "elk93","@version" => "1","path" => "/tmp/student.txt","message" => "11111111111111111111","@timestamp" => 2025-03-13T11:59:53.464Z
}
tips:

logstash也是按行读取数据,不换行默认也不会收集,也会有位置点记录。
logstash和filebeat可以说操作和工作原理都差不多,file beat更加轻量级

3. Logstash采集文本日志策略

[root@elk93 ~]# cat /usr/share/logstash/data/plugins/inputs/file/.sincedb_782d533684abe27068ac85b78871b9fd 
1310786 0 64768 30 1741867261.602881 /tmp/student.txt[root@elk93 ~]# cat /etc/logstash/conf.d/01-stdin-to-stout.conf
input {file {path => "/tmp/student.txt"# 指定首次从哪个位置开始采集,有效值为:beginning,end。默认值为"end"start_position => "beginning"}
}
output { stdout { codec => rubydebug } 
}
每次重新加载记录都要从头开始读{"host" => "elk93","@version" => "1","path" => "/tmp/student.txt","message" => "hehe","@timestamp" => 2025-03-13T12:07:33.116Z
}我们也可以删除某个我们不想看到的字段,这里就要用到filter过滤了
[root@elk93 ~]# cat /etc/logstash/conf.d/01-stdin-to-stout.conf
input {file {path => "/tmp/student.txt"# 指定首次从哪个位置开始采集,有效值为:beginning,end。默认值为"end"start_position => "beginning"}
}filter {mutate {remove_field => [ "@version","host" ]}
}output { stdout { codec => rubydebug } 
}重新启动logstash
[root@elk93 ~]# rm -f /usr/share/logstash/data/plugins/inputs/file/.sincedb*
[root@elk93 ~]# logstash -f /etc/logstash/conf.d/01-stdin-to-stout.conf 
{"path" => "/tmp/student.txt","message" => "11111111111111111111","@timestamp" => 2025-03-13T12:10:26.854Z
}
可以看到version和host字段就没了

4.热加载启动配置

修改conf文件立马生效
[root@elk93 ~]# logstash -rf /etc/logstash/conf.d/02-file-to-stdout.conf 

5.Logstash多实例案例

跟file beat一样,file beat就是模仿logstash轻量级开发的
启动实例1:
[root@elk93 ~]# logstash -f /etc/logstash/conf.d/01-stdin-to-stdout.conf 启动实例2:
[root@elk93 ~]# logstash -rf /etc/logstash/conf.d/02-file-to-stdout.conf  --path.data /tmp/logstash-multiple

五、Logstash进阶之logstash的过滤器

- 一个服务器节点可以有多个Logstash实例


- 一个Logstash实例可以有多个pipeline,若没有定义pipeline id,则默认为main pipeline。


- 每个pipeline都有三个组件组成,其中filter插件是可选组件:
    - input :
        数据从哪里来 。
        
    - filter:
        数据经过哪些插件处理,该组件是可选组件。
        
    - output: 
        数据到哪里去。

官网参考:
https://www.elastic.co/guide/en/logstash/7.17/
https://www.elastic.co/guide/en/logstash/7.17/plugins-filters-useragent.html#plugins-filters-useragent-target

1. Logstash采集nginx日志之grok案例

安装nginx
[root@elk93 ~]# apt -y install nginx访问测试
http://10.0.0.93/Logstash采集nginx日志之grok案例
[root@elk93 ~]# vim /etc/logstash/conf.d/02-nginx-grok-to-stout.conf
input { file { path => "/var/log/nginx/access.log"start_position => "beginning"} 
} filter {grok {match => { "message" => "%{HTTPD_COMMONLOG}" }}mutate {remove_field => [ "@version","host","path" ]}
}output { stdout { codec => rubydebug } 
}[root@elk93 ~]# logstash -rf /etc/logstash/conf.d/02-nginx-grok-to-stout.conf
{"request" => "/","clientip" => "10.0.0.1","timestamp" => "13/Mar/2025:12:18:35 +0000","ident" => "-","verb" => "GET","auth" => "-","response" => "304","bytes" => "0","@timestamp" => 2025-03-13T12:18:40.497Z,"message" => "10.0.0.1 - - [13/Mar/2025:12:18:35 +0000] \"GET / HTTP/1.1\" 304 0 \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36\"","httpversion" => "1.1"
}

2. Logstash采集nginx日志之useragent案例

[root@elk93 ~]# cat /etc/logstash/conf.d/03-nginx-useragent-to-stout.conf
input { file { path => "/var/log/nginx/access.log"start_position => "beginning"} 
} filter {# 基于正则提取任意文本,并将其封装为一个特定的字段。grok {match => { "message" => "%{HTTPD_COMMONLOG}" }}useragent {source => 'message'# 将解析的结果存储到某个特定字段,若不指定,则默认放在顶级字段。target => "linux96_user_agent"
}mutate {remove_field => [ "@version","host","path" ]}
}output { stdout { codec => rubydebug } 
}[root@elk93 ~]# logstash -rf /etc/logstash/conf.d/03-nginx-useragent-to-stout.conf {"verb" => "GET","@timestamp" => 2025-03-13T12:27:22.325Z,"ident" => "-","httpversion" => "1.1","timestamp" => "13/Mar/2025:12:27:22 +0000","clientip" => "10.0.0.1","linux96_user_agent" => {"device" => "Other","os_full" => "Windows 10","name" => "Chrome","os_name" => "Windows","os" => "Windows","minor" => "0","os_major" => "10","version" => "134.0.0.0","os_version" => "10","major" => "134","patch" => "0"},"auth" => "-","message" => "10.0.0.1 - - [13/Mar/2025:12:27:22 +0000] \"GET / HTTP/1.1\" 304 0 \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36\"","bytes" => "0","request" => "/","response" => "304"

3. Logstash采集nginx日志之geoip案例

[root@elk93 ~]# cat /etc/logstash/conf.d/05-nginx-geoip-stdout.conf
input { file { path => "/var/log/nginx/access.log"start_position => "beginning"} 
} filter {grok {match => { "message" => "%{HTTPD_COMMONLOG}" }}useragent {source => "message"target => "linux95_user_agent"}# 基于公网IP地址分析你的经纬度坐标点geoip {# 指定要分析的公网IP地址的字段source => "clientip"}mutate {remove_field => [ "@version","host","path" ]}
}output { stdout { codec => rubydebug } 
}[root@elk93 ~]# logstash -rf /etc/logstash/conf.d/05-nginx-geoip-stdout.conf
{"verb" => "GET","@timestamp" => 2025-03-13T12:37:05.116Z,"ident" => "-","httpversion" => "1.1","timestamp" => "13/Mar/2025:12:31:27 +0000","clientip" => "221.218.213.9","linux96_user_agent" => {"device" => "Other","os_full" => "Windows 10","name" => "Chrome","os_name" => "Windows","os" => "Windows","minor" => "0","os_major" => "10","version" => "134.0.0.0","os_version" => "10","major" => "134","patch" => "0"},"auth" => "-","message" => "221.218.213.9 - - [13/Mar/2025:12:31:27 +0000] \"GET / HTTP/1.1\" 304 0 \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36\"","bytes" => "0","request" => "/","response" => "304"
}

4. Logstash采集nginx日志之date案例

[root@elk93 ~]# cat /etc/logstash/conf.d/06-nginx-date-stdout.conf
input { file { path => "/var/log/nginx/access.log"start_position => "beginning"} 
} filter {grok {match => { "message" => "%{HTTPD_COMMONLOG}" }}useragent {source => "message"target => "linux95_user_agent"}geoip {source => "clientip"}# 转换日期字段date {# 匹配日期字段,将其转换为日期格式,将来存储到ES,基于官方的示例对号入座对应的格式即可。# https://www.elastic.co/guide/en/logstash/7.17/plugins-filters-date.html#plugins-filters-date-match# "timestamp" => "23/Oct/2024:16:25:25 +0800"match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]# 将match匹配的日期修改后的值直接覆盖到指定字段,若不定义,则默认覆盖"@timestamp"。target => "novacao-timestamp"}mutate {remove_field => [ "@version","host","path" ]}
}output { stdout { codec => rubydebug } 
}[root@elk93 ~]# logstash -rf /etc/logstash/conf.d/05-nginx-date-stout.conf {"ident" => "-","clientip" => "10.0.0.1","bytes" => "0","novacao-timestamp" => 2025-03-13T12:57:39.000Z,"httpversion" => "1.1","linux95_user_agent" => {"os_full" => "Windows 10","minor" => "0","name" => "Chrome","device" => "Other","os_name" => "Windows","major" => "134","patch" => "0","version" => "134.0.0.0","os_major" => "10","os" => "Windows","os_version" => "10"},"request" => "/","auth" => "-","verb" => "GET","message" => "10.0.0.1 - - [13/Mar/2025:12:57:39 +0000] \"GET / HTTP/1.1\" 304 0 \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36\"","@timestamp" => 2025-03-13T12:58:43.691Z,"timestamp" => "13/Mar/2025:12:57:39 +0000","response" => "304"
}

5. Logstash采集nginx日志之mutate案例

[root@elk93 ~]# cat /etc/logstash/conf.d/06-nginx-mutate-stdout.conf
input { file { path => "/var/log/nginx/access.log"start_position => "beginning"} 
} filter {grok {match => { "message" => "%{HTTPD_COMMONLOG}" }}useragent {source => "message"target => "linux95_user_agent"}geoip {source => "clientip"}date {match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]target => "novacao-timestamp"}# 对指定字段进行转换处理mutate {# 将指定字段转换成我们需要转换的类型convert => {"bytes" => "integer"}remove_field => [ "@version","host","message" ]}
}output { stdout { codec => rubydebug } 
}[root@elk93 ~]# rm -f /usr/share/logstash/data/plugins/inputs/file/.sincedb*
[root@elk93 ~]# logstash -rf /etc/logstash/conf.d/06-nginx-mutate-stdout.conf 
{"@timestamp" => 2025-03-13T13:00:17.201Z,"auth" => "-","verb" => "GET","linux95_user_agent" => {"major" => "134","name" => "Chrome","os" => "Windows","minor" => "0","version" => "134.0.0.0","device" => "Other","os_name" => "Windows","os_major" => "10","os_full" => "Windows 10","os_version" => "10","patch" => "0"},"clientip" => "10.0.0.1","path" => "/var/log/nginx/access.log","ident" => "-","timestamp" => "13/Mar/2025:13:00:14 +0000","request" => "/","novacao-timestamp" => 2025-03-13T13:00:14.000Z,"response" => "304","bytes" => 0,"httpversion" => "1.1"
}

6. Logstash采集nginx日志到ES集群并出图展示

[root@elk93 ~]# cat /etc/logstash/conf.d/07-nginx-to-es.conf
input { file { path => "/var/log/nginx/access.log"start_position => "beginning"} 
} filter {grok {match => { "message" => "%{HTTPD_COMMONLOG}" }}useragent {source => "message"target => "linux95_user_agent"}geoip {source => "clientip"}date {match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]target => "novacao-timestamp"}# 对指定字段进行转换处理mutate {# 将指定字段转换成我们需要转换的类型convert => {"bytes" => "integer"}remove_field => [ "@version","host","message" ]}
}output { stdout { codec => rubydebug }elasticsearch {# 对应的ES集群主机列表hosts => ["10.0.0.91:9200","10.0.0.92:9200","10.0.0.93:9200"]# 对应的ES集群的索引名称index => "novacao-linux96-elk-nginx"}
}[root@elk93 ~]# rm -f /usr/share/logstash/data/plugins/inputs/file/.sincedb*
[root@elk93 ~]# logstash -rf /etc/logstash/conf.d/06-nginx-mutate-stdout.conf 

存在的问题:
    Failed (timed out waiting for connection to open). Sleeping for 0.02

问题描述:
    此问题在 ElasticStack 7.17.28版本中,可能会出现Logstash无法写入ES的情况。
    
TODO:
    需要调研官方是否做了改动,导致无法写入成功,需要额外的参数配置。

临时解决方案:
    1.删除filter组件的geoip插件删除,不再添加,然后重新reload一下nginx服务,因为会把nginx的日志锁住。
    2.降版本

六、总结

Logstash作为一款功能强大的开源数据处理管道工具,在数据收集、处理和传输等方面发挥着重要作用。它与Elasticsearch、Kibana等工具配合使用,能够实现高效的数据管理和分析,广泛应用于日志处理、数据监控等领域,为企业和开发者提供了有力的支持。

- logstash架构 
    - 多实例和pipeline        
        - input 
        - output 
        - filter 
        
    - 常用的filter组件      
        - grok           基于正则提取任意文本,并将其封装为一个特定的字段。
        - date          转换日期字段
        - mutate         对指定字段(的数据类型进行转换处理
        - useragent      用于提取用户的设备信息
        - geoip            基于公网IP地址分析你的经纬度坐标点


http://www.hkcw.cn/article/poIqIvTSGP.shtml

相关文章

InternLM2/LM2.5/ViT/VL1.5/VL2.0笔记: 核心点解析

00 前言 本文主要是记录一下关于多模态大模型InternLM/InternVL系列的一些要点的理解。还是那句话,好记性,不如烂笔头。本文当成个人笔记用,行文风格和先前写的LLaVA系列一致。本文的重点是讲解多模态模型InternVL 1.5,但是Intern…

帝可得 - 设备管理

一. 需求说明 设备管理主要涉及到三个功能模块,业务流程如下: 新增设备类型: 允许管理员定义新的售货机型号,包括其规格和容量。 新增设备: 在新的设备类型定义后,系统应允许添加新的售货机实例,并将它们分配到特定的…

建设指南 | Cloud Apps + AI Apps端到端智能应用开发平台

在“云AI”作为基础设施的时代,研发、运维、信息化等部门,通常会面临的棘手问题都有哪些: 算力资源难以统一调度和管理;AI算法研发环境搭建复杂;不同模型部署方式繁杂,统一监控难;AI应用开发效…

【灵动Mini-F5265-OB】vscode+gcc工程创建、下载、调试

【前言】 【灵动Mini-F5265-OB】在官方的例程中提供了mdk、IAR的开发环境,使用起来非常方便。有位大佬也提供了一个gcc的示例,但是我使用vscode的keil插件进行工程创建,但是提示pack是对不上的。所以我决定重新创建我的vscode来创建开发环境。…

【AI论文】VF-Eval:评估多模态大型语言模型(MLLM)在生成人工智能生成内容(AIGC)视频反馈方面的能力

摘要:多模态大型语言模型(MLLMs)最近在视频问答领域得到了广泛研究。然而,现有的大多数评估都侧重于自然视频,而忽视了合成视频,例如人工智能生成的内容(AIGC)。与此同时&#xff0c…

Docker 镜像(或 Docker 容器)中查找文件命令

在 Docker 镜像(或 Docker 容器)中运行如下两个命令时: cd / find . -name generate.py它们的含义如下,我们来一行一行详细拆解,并结合例子讲解: ✅ 第一行:cd / ✅ 含义 cd 是“change dire…

DiskGenius专业版v6.0.1.1645:分区管理、数据恢复、备份还原,一应俱全!

各位小伙伴,大家好!今天阿灿给大家带来一款超好用的分区工具,DiskGenius专业版。这款工具堪称电脑管理界的“瑞士军刀”,功能强大,现在出了新版本v6.0.1.1645,简繁中文单文件便携版,使用超方便。…

‌CDGP|数据治理的低效性:企业AI落地的另一大挑战

在数字化转型的浪潮中,人工智能(AI)已成为推动企业创新发展的重要力量。然而,尽管AI技术具有巨大的潜力和优势,但许多企业在尝试落地AI项目时却面临着重重挑战。其中,数据治理的低效性尤为突出,…

linux学习第19、20天(父子进程)

ps ajx -->查看pid,ppid,gid,sid 父子进程 父子进程相同: 刚fork后,data段、text段、堆,栈、环境变量、全局变量、进程工作目录位置、信号处理方式 父子进程不同: 进程id、返回值、各自的…

AI写作革命:重塑创作未来

人工智能写作技术:革新创作方式的智能利器 人工智能写作技术(AI写作技术)是指利用自然语言处理(NLP)、机器学习(ML)等人工智能技术,辅助或自动化完成文本的创作、编辑与优化。这一技…

法律大语言模型(Legal LLM)技术架构

目录 摘要 1 法律AI大模型技术架构 1.1 核心架构分层 1.2 法律知识增强机制 2 关键技术突破与对比 2.1 法律专用组件创新 2.2 性能对比(合同审查场景) 3 开发部署实战指南 3.1 环境搭建流程 3.2 合同审查代码示例 4 行业应用与挑战 4.1 典型场景效能提升 4.2 关…

深入理解 C# Razor Pages:构建现代 Web 应用的利器

在现代 Web 开发中,选择合适的框架至关重要。ASP.NET Core 提供了多种开发模式,其中 Razor Pages 因其简单性、高效性和易用性,成为构建页面导向 Web 应用的首选方案。相比于传统的 MVC(Model-View-Controller)模式&am…

AgenticSeek 本地部署教程(Windows 系统)

#工作记录 Fosowl/agenticSeek:完全本地的 Manus AI。 部署排错参考资料在文末 或查找往期笔记。 AgenticSeek 本地部署教程(Windows 系统) 一、环境准备 1. 安装必备工具 Docker Desktop 下载地址:Docker Desktop 官网 安装后启…

后台管理系统八股

项⽬地址:https://github.com/Xiaodie-888/Frontend.git 前端 https://github.com/Xiaodie-888/backend.git 后端 技术栈:Vue3ViteTyprscriptPiniaElement-plusVue-RouterExpress.jsMySQL 核⼼⼯作与技术: 基础组件封装:基于 Ele…

014校园管理系统技术解析:构建智慧校园管理平台

校园管理系统技术解析:构建智慧校园管理平台 在教育信息化快速发展的当下,校园管理系统成为提升学校管理效率、优化校园服务的重要工具。该系统集成院校管理、投票管理等多个核心模块,面向管理员、用户和院内管理员三种角色,通过…

SpringBoot2.3.1集成Knife4j接口文档

首先要查看项目中pom文件里面有没有swagger和knife4j的依赖&#xff0c;如果有的话删除&#xff0c;加入以下依赖 <!-- swagger --><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-spring-boot-starter</…

Abaqus/CAE操作介面

Abaqus/CAE操作介面: • 完全整合建模、分 析、工作管理與結 果評估。 • 對於Abaqus的各系 統&#xff0c;提供最完善的 介面。 • 使用中立的資料庫 檔案&#xff0c;獨立於硬體 設備。 • 客製化&#xff0c;成為應用 於特定問題之系統 。 • 選 單 (menu) 、圖 標 (ico…

垂起固定翼无人机应用及技术分析

一、主要应用行业 1. 能源基础设施巡检 电力巡检&#xff1a;适用于超高压输电线路通道的快速巡查&#xff0c;实时回传数据提升智能运检效率。 油田管道监测&#xff1a;利用长航时特性&#xff08;1.5-2小时&#xff09;对大范围管道进行隐患排查&#xff0c;减少人力巡…

DPDK与网络协议栈

DPDK与网络协议栈 DPDK简介实现使用DPDK收发数据通过UDP收发数据通过 TCP 收发数据 DPDK简介 DPDK 是是 Intel 提供的数据平面开发工具集&#xff0c;为&#xff08;IA&#xff09;处理器架构下用户高效的数据包处理提供函数以及驱动支持&#xff0c;不同于 Linux 下是以通用性…

51c大模型~合集134

我自己的原文哦~ https://blog.51cto.com/whaosoft/13956141 #Foveated Instance Segmentation 解决XR算力瓶颈&#xff0c;FovealSeg框架实现毫秒级IOI分割 本文共同第一作者为纽约大学研究生 Hongyi Zeng 和Wenxuan Liu。合作作者为 Tianhua Xia、Jinhui Chen、Ziyun…