ES系列之Logstash实战入门

概述

作为ELK技术栈一员,Logstash用于将数据采集到ES,通过简单配置就能把各种外部数据采集到索引中进行保存,可提高数据采集的效率。

原理

数据源提供的数据进入Logstash的管道后需要经过3个阶段:

  • input:负责抽取数据源的数据,这个过程一般需要包含数据源的连接方式、通信协议和抽取间隔等信息,目的是将原始数据源源不断地接入数据管道。
  • filter:将抽取到数据管道的数据按照业务逻辑的需要进行数据转换,例如添加或删除部分字段、修改部分字段的数据内容等。
  • output:将过滤后的数据写入数据的目的地,在大多数情况下,数据会被写入ES索引,也可把数据写入文件或其他地方。

安装

从官网下载解压即可使用,找到bin目录下的脚本文件,双击即可完成安装。

目录

以版本为例,目录如下:

  • bin:包含各种二进制形式的可执行脚本,如Logstash的启动脚本、插件脚本
  • config:各种配置文件
  • data:Logstash脚本执行时默认的数据目录
  • lib:Logstash运行时的库文件
  • logs:Logstash运行时产生的日志文件
  • logstash-core:包含Logstash的关键组件
  • logstash-core-plugin-api:包含Logstash的插件API
  • modules:包含Logstash拥有的模块文件
  • tools:包含Logstash运行时可用的工具组件
  • vendor:包含Logstash运行时依赖的Ruby环境
  • x-pack:包含Logstash的X-Pack插件扩展内容

配置

logstash.yml

命令行启动会覆盖logstash.yml里的配置:

配置说明
path.data配置Logstash运行时产生的临时数据目录,默认为data目录
pipeline.workers从临时队列中消费数据进行过滤处理的线程数
pipeline.batch.size单个线程能够多从队列中一次性消费的事件数目,默认值125
pipeline.ordered控制数据流是否有序输出,若为talse则不能保证数据有序向外输出;若为true则只启用一个工作线程进行消费,保证数据有序。默认值为auto,只有在工作线程数设置为1时才保证有序
path.config指定启动的数据采集脚本的目录
config.reload.automatic若为true,则自动检查并加載最新的采集脚本,修改采集脚本后可以避免重启Logstash实例;若为talse,则采集脚本修改后需重启Logstash才能生效
queue.type用于设置缓冲队列的类型,默认队列保存在内存中,若设置为persisted则会将队列数据持久化地存储到磁盘上
path.logs配置Logstash运行时产生日志的目录,默认是安装目录中的logs目录
dead_letter_queue.enable配置是否开启死亡消息队列功能,默认不开启。如果开启,则会把处理失败的数据持久化地存储到磁盘上以便将来有机会重新执行

jvm.options

jvm.options文件主要用于调整Logstash的JVM堆内存大小,默认值为1GB。通常这个值应该配置为4GB~8GB,最好不要超过机器物理内存大小的一半。性能调优时,可动态调整此配置并观察数据抽取速度与内存使用率,在两者之间取得平衡。

pipelines.yml

在一个Logstash进程中运行多个数据管道,即同时执行多个采集脚本,有两种方法:

  • pipelines.yml配置文件,指明每个数据管道的配置参数,没有声明的配置,则使用logstash.yml中配置:
- pipeline.id: testpipeline.workers: 1pipeline.batch.size: 1path.config: "a.config"
- pipeline.id: another_testqueue.type: persistedpath.config: "/tmp/logstash/*.config"
  1. 在命令行中指定不同的数据目录来执行脚本:
.\bin\logstash -f .\a.conf --path.data=.\data1
.\bin\logstash -f .\b.conf --path.data=.\data2

组件

input

包括如下插件:

  • stdin:表示在命令行接收用户的输入
  • file:读取文件
  • generator:产生指定的或随机的数据流
  • jdbc:从数据库读取数据,需配置JDBC几个要素,如渠道包路径,驱动类全路径名,数据库链接URL(用户名和密码可单独配置)

filter

包括如下插件:

  • grok:使用模式匹配的数据抽取
  • date:从字段中解析时间戳等
  • mutate:
  • geoip:通过来访者的IP能定位其地理位置等信息
  • kv:键值对

output

包括如下插件:

  • stdout:打印输出到控制台。rubydebug是一个编解码器,常用于开发者观察和调试数据管道中的各个字段内容
  • file:输出到文件
  • elasticsearch:存储到ES

除了上面几种,还支持通知类:

  • pagerduty:警报系统工具
  • nagios:开源的网络监视工具
  • zabbix:提供分布式系统监视以及网络监视功能
  • email:告警邮件

在这里插入图片描述

实战

配置文件由输入->过滤->输出三部分组成,每部分都是由插件构成,每个插件负责处理日志的不同过程:

input {...
}
filter {...
}
output {...
}

采集Nginx日志

采集Nginx日志到ES,nginx-log.conf配置文件:

input {file {path => "D:/nginx-1.16.1/logs/access.log"start_position => "beginning"}
}
filter {Grok {match => { "message" => "%{COMBINEDAPACHELOG}" }}
}
output {stdout {codec => rubydebug}elasticsearch {hosts => ["http://localhost:9200"]index => "nginx-log"action => "index"}
}

start_position设置为beginning表示第一次从头开始读取日志文件,如果不进行此设置,则默认file-input插件只读取新增的日志记录

Grok插件,将数据流的message字段按照COMBINEDAPACHELOG的格式解析成多个结构化的字段

增量抽取表数据

要实现对数据库表数据的增量抽取,前提条件是表结构要有递增时间字段或自增长主键。每次抽取完数据,Logstash会把最后一条数据的时间或数字写入文件作为抽取标记,下次抽取时只抽取该时间或数字之后的新数据。

实例配置文件jdbc.conf

input {jdbc {jdbc_driver_library => "D:\\bin\\mysql-connector-j-8.3.0.jar"jdbc_driver_class => "com.mysql.cj.jdbc.Driver"jdbc_connection_string => "jdbc:mysql://localhost:3305/sakila?serverTimezone=GMT%2B8"jdbc_user => "root"jdbc_password => "root"statement => "SELECT actor_id,first_name,last_name,date_format(last_update, ‘%Y-%m-%d %H:%i:%S’) as last_update from actor where last_update > :sql_last_value"record_last_run => trueuse_column_value => truetracking_column_type => "timestamp"tracking_column => "last_update"last_run_metadata_path => "./actor"schedule => "* * * * *"}
}
filter {mutate {remove_field => ["@timestamp", "@version"]}mutate {add_field => {"whole_name" => "%{first_name}-%{last_name}"}}
}
output {stdout {codec => rubydebug}elasticsearch {hosts => ["http://localhost:9200"]index => "actor"document_id => "%{actor_id}"action => "index"}
}

使用mutate过滤器,删除数据流中的两个字段@timestamp和@version,以防止它们出现在索引中。也可以新增字段whole_name表示拼接first_namelast_name

statement里的SQL语句末尾加上where条件,表示只查询last_update字段大于最后一次抽取标记的数据。record_last_run设置为true,表示要保存抽取标记,抽取标记保存在last_run_metadata_pathtracking_column_type设置为timestamp表示抽取标记字段是时间类型的,如果选择自增长数字主键作为抽取标记,则设置为numeric。tracking_column用于指定抽取标记的列名称,use_column_value设置为true表示使用数据的内容作为抽取标记,否则使用最后一次查询的时间作为抽取标记。

加密敏感配置

上面抽取数据库表的配置里含有敏感字段如密码等,Logstash支持加密敏感配置。

执行命令:.\bin\logstash-keystore create。执行成功后,config目录下会生成密钥存储文件logstash.keystore,用于保存将要加密的变量。新建一个加密变量pwd:.\bin\logstash-keystore add pwd,输入数据库的明文密码,即root。更新配置文件:jdbc_password => "${pwd}",取代原先的明文密码。

进阶

上面的实战只能算是入门。

Logstash用{}来定义区域,支持常用数据类型。Logstash的DSL,如区域、注释、数据类型(布尔值、字符串、数值、数组、哈希)、条件判断、字段引用等,是Ruby风格的。

条件语法

在Logstash中可以用条件语法来支持不同条件做不同的处理,这种方式和其他开发语言基本一致。

用于output:

output {# Send production errors to pagerdutyif [loglevel] == "ERROR" and [deployment] == "production" {pagerduty {...}}
}

插件管理

Logstash提供多种多样,四种类型的插件。每种插件都有不同的属性和语法,需要参考官方文档。随Logstash版本升级,插件也在丰富中。插件可作为独立的软件包存在,插件管理器通过bin/logstash-plugin脚本来管理插件的整个生命周期,如:安装、卸载、升级插件:

# 列出插件
bin/logstash-plugin list
bin/logstash-plugin list --verbose
bin/logstash-plugin list '*namefragment*'
bin/logstash-plugin list --group output
# 安装插件
bin/logstash-plugin install logstash-output-kafka
# 更新插件
bin/logstash-plugin update
bin/logstash-plugin update logstash-output-kafka
# 移除插件
bin/logstash-plugin uninstall logstash-output-kafka

插件类型:

  • input
  • filter
  • output
  • codec

codec

编解码插件,主要是为了对事件进行处理改变事件的数据内容,是基本的流过滤器,可作为输入或输出的一部分。

codec可使得Logstash更方便地与其他自定义数据格式的产品共存,如graphite(开源的存储图形化展示的组件)、fluent、netflow、collectd(守护进程,是一种收集系统性能和提供各种存储方式来存储不同值的机制),以及使用msgpack、json等通用数据格式的其他产品。

codec有针对avro、cef、cloudfront、cloudtrail、collectd、compress_spooler、dots、edn、edn_lines、es_bulk、fluent、graphite、gzip_lines、json、json_lines、line、msgpack、multiline、netflow、nmap、oldlogstashjson、plain、rubydebug、s3_plain等多种数据来源的插件,可格式化相应的数据。

常用的rubydebug,使用ruby awesome print库来解析日志格式。

自定义插件

参考

  • Elasticsearch数据搜索与分析实战
  • Elasticsearch技术解析与实战

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#单向链表实现:在当前节点后插入新数据的方法Insert()

目录 一、涉及到的知识点 1.插入算法 2.示例中current 和 _current 的作用 3.current 和 _current 能否合并为一个变量 4.单向链表节点类的三个属性 (1)Next属性: (2) Value属性: (3&am…

【ArcPy】批量读取文件夹excel中XY并转为点shp

示例展示 代码 只读取excel中含有XY字段的文件,并将矢量命名为excel文件名称。 import os import pandas as pd import arcpy folder_path r"C:\Users\admin\Desktop\excelfile" extension"xlsx" files [file for file in os.listdir(folder…

SpringCloud gateway限流无效,redis版本低的问题

在使用springCloud gateway的限流功能的时候,配置RedisRateLimiter限流无效,后来发现是Redis版本过低导致的问题,实测 Redis版本为3.0.504时限流无效,改用7.0.x版本的Redis后限流生效。查了资料发现很多人都遇见过这个问题&#x…

RedisTemplate 序列化成功,反序列化失败List, Set, Map失败

RedisTemplate 序列化成功,反序列化失败List, Set, Map失败 异常信息RedisTemplate配置异常原因错误代码示例解决方法 序列化成功,反序列化失败 异常信息 Caused by: com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve ty…

小程序事件处理

事件处理 一个应用仅仅只有界面展示是不够的,还需要和用户做交互,例如:响应用户的点击、获取用户输入的值等等,在小程序里边,我们就通过编写 JS 脚本文件来处理用户的操作 1. 事件绑定和事件对象 小程序中绑定事件与…

React之组件定义和事件处理

一、组件的分类 在react中,组件分为函数组件和class组件,也就是无状态组件和有状态组件。 * 更过时候我们应该区别使用无状态组件,因为如果有状态组件会触发生命周期所对应的一些函数 * 一旦触发他生命周期的函数,它就会影响当前项…

如何设置从小程序跳转到其它小程序

​有的商家有多个小程序,希望能够通过一个小程序链接到所有其它小程序,用户可以通过点击跳转链接实现从一个小程序跳转到另一个小程序。要怎么才能实现这样的跳转呢。下面具体介绍。 1. 设置跳转。在小程序管理员后台->分类管理,添加一个…

ssm个人学习01

Spring配置文件: spring环境的搭建: 1:导入对应的spring坐标 也就是依赖 2:编写controller, service, dao相关的代码 3:创建配置文件(在resource下面配置文件) 例如:applicationContext.xml <bean id "" class ""> <property name "&…

Node.js 中 fs 模块文件操作的应用教程

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;它可以让 JavaScript 代码在服务器端运行。在 Node.js 中&#xff0c;fs 模块是用来处理文件系统操作的模块。通过 fs 模块&#xff0c;我们可以进行文件的读取、写入、删除等操作。本教程将介绍如何在 No…

工作电压范围宽的国产音频限幅器D2761用于蓝牙音箱,输出噪声最大仅-90dBV

近年来随着相关技术的不断提升&#xff0c;音箱也逐渐从传统的音箱向智能音箱、无线音箱升级。同时在消费升级的背景下&#xff0c;智能音箱成为人们提升生活品质的方式之一。智能音箱是智能化和语音交互技术的产物&#xff0c;具有点歌、购物、控制智能家居设备等功能&#xf…

python水表识别图像识别深度学习 CNN

python水表识别&#xff0c;图像识别深度学习 CNN&#xff0c;Opencv,Keras 重点&#xff1a;项目和文档是本人近期原创所作&#xff01;程序可以将水表图片里面的数据进行深度学习&#xff0c;提取相关信息训练&#xff0c;lw1.3万字重复15%&#xff0c;可以直接上交那种&…

Vue中<style scoped lang=“scss“>的含义

这段代码中的<style scoped lang"scss">是HTML和Vue框架结合使用时常见的一个模式&#xff0c;具体含义如下&#xff1a; scoped&#xff1a;这是一个Vue.js特有的属性&#xff0c;用来指定样式只应用于当前组件的元素。没有这个属性时&#xff0c;样式会全局应…

python给企微发消息

方法一&#xff1a;webhook方式。使用群机器人给企微群发消息 import requestsdef qwxsendmessage(msg):urlhttps://qyapi.weixin.qq.com/cgi-bin/webhook/send?key6c598840-804a-4eb5-a999-a023313 #url换成自己群机器人的webhookurldata{msgtype:text,text:{content:msg}}…

elasticsearch7.17 terms聚合性能提升90%+

背景 ES7 相比于 ES6 有多个层面的优化&#xff0c;对于开源的ES而言&#xff0c;升级是必经之路。 ES的使用场景非常多&#xff0c;在升级过程中可能会遇到非预期的结果&#xff1b; 比如之前文章提到的典型案例&#xff1a;ES7.17版本terms查询性能问题 ES7.17版本terms查…

【Python笔记-FastAPI】后台任务+WebSocket监控进度

目录 一、代码示例 二、执行说明 (一) 调用任务执行接口 (二) 监控任务进度 实现功能&#xff1a; 注册后台任务&#xff08;如&#xff1a;邮件发送、文件处理等异步场景&#xff0c;不影响接口返回&#xff09;监控后台任务执行进度&#xff08;进度条功能&#xff09;支…

常见的几种httpclient

工作是spring 项目一般都是使用ResTemplate 但是还是有些项目中会用到httpClient&#xff0c;没有毛用。 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> …

pclpy 点云法线

pclpy 点云法线 一、算法原理1.理论入门2.选择正确的比例 二、代码三、结果四、相关数据 一、算法原理 表面法线是几何表面的重要属性&#xff0c;在许多领域&#xff08;例如计算机图形应用程序&#xff09;中大量使用&#xff0c;以应用正确的光源来生成阴影和其他视觉效果。…

缓存穿透--一起学习吧之架构

缓存穿透是指查询一个一定不存在的数据&#xff0c;由于缓存是不命中时需要从数据库查询&#xff0c;查不到数据则不写入缓存&#xff0c;这将导致这个不存在的数据每次请求都要到数据库去查询&#xff0c;进而给数据库带来压力。在高并发场景下&#xff0c;如果某个key被高并发…

Android 混淆是啥玩意儿?

什么是混淆 Android混淆&#xff0c;是伴随着Android系统的流行而产生的一种Android APP保护技术&#xff0c;用于保护APP不被破解和逆向分析。简单的说&#xff0c;就是将原本正常的项目文件&#xff0c;对其类、方法、字段&#xff0c;重新命名a,b,c…之类的字母&#xff0c…

森林灭火利器|便携式森林消防灭火泵|恒峰智慧科技

随着人们对环境保护意识的不断提高&#xff0c;森林防火工作显得尤为重要。然而&#xff0c;传统的森林灭火方式存在诸多不便&#xff0c;如火势蔓延迅速、灭火效率低下等。为了更好地保护森林资源&#xff0c;科学家们研发出了一种便携式森林消防灭火泵&#xff0c;它的出现为…