Logstash 支持不同的数据源头,在数据从源头到目标的过程中,Logstash提供了对数据处理的操作。对数据的操作需要配置filter的内容。

关于安装Logstash的安装可以看之前的文章 安装Logstash并完成一个简单的日志收集功能

Logstash过滤器对不同格式数据的处理

Logstash涉及对不同格式数据处理的过滤器主要是下面几个

过滤器 作用
json 用来解析JSON格式的内容
json_encode 用来将字段编译成JSON格式
kv 解析键值对的数据
xml 解析XML格式的数据
urldecode 解析URL编码的数据

这里我简单的介绍下几个过滤器的使用方式,当然实际上Logstash提供了更多的可能,但是很多时候我们并不需要这么多复杂的功能,但是在某些情况下需要配合当前的业务需要实现一些复杂的解析。这里推荐直接查看 Logstash的文档 ,毕竟文档才是最可靠的技术来源。

ps.关于json_encode,其默认没有被添加到Logstash插件中,而且平时使用的并不算多,这里就跳过了

对JSON数据的处理

JSON过滤器可以将一个包含JSON的现有字段,并将其扩展为Logstash事件内的实际数据结构。
如果对数据进行JSON解析失败,则事件将保持不变,并使用标记 _jsonparsefailure

除了公共参数,JSON过滤器提供了下面的参数

参数 作用
skip_on_invalid_json 允许跳过无效JSON的过滤器
source 解析JSON的目标源
tag_on_failure tags没有成功匹配时将值追加到字段
target 定义用于放置解析数据的目标字段。

实际中JSON过滤器使用起来也比较简单,下面配置中只配置了要解析的字段和目标字段

input {
	redis {
		key => "logstash-json"
		host => "localhost"
		password => "dailearn"
		port => 6379
		db => "0"
		data_type => "list"
		type  => "json"
filter {
	json {
		source => "message"
output {
	stdout { codec => rubydebug }

现在向Redis对应键中插入一条数据

{"age":10,"name":"张三"}

控制台输出

而项目控制台中返回的结果

"type" => "json", "age" => 10, "@timestamp" => 2020-05-07T12:59:14.440Z, "name" => "张三", "@version" => "1"

出现上面结果是因为默认情况下,它将解析的JSON放在Logstash事件的根节点上)中

对键值对数据的处理

键值对(kv)过滤器用来从键值对格式的(比如name=张三)数据中踢出去出数据的过滤器。

除了公共参数,键值对(kv)过滤器常用的配置有下面内容

参数作用
source数据的目标
target定义用于放置解析数据的目标字段。
allow_duplicate_values一个布尔选项,用于删除重复的键/值对。设置为false时,将仅保留一对唯一的键/值对。
default_keys指定默认键及其值的哈希值,以防万一这些键在要解析的源字段中不存在时应添加到事件中。
exclude_keys指定不应添加到事件的已解析键。
field_split用作单字符字段定界符的字符串,用于解析键值对。
include_brackets一个布尔值,指定是否将方括号,尖括号和括号视为“值的包装器”。
include_keys一个数组,指定应添加到事件的已解析键。默认情况下,将添加所有键。
prefix一个字符串,主要是给所有被提取出来打的key加前缀内容
recursive一个布尔值,指定是否向下钻取值并从中递归获取更多键-值对。额外的键值对将存储为根键的子键。
remove_char_key要从key中删除的字符串
remove_char_value要从value中删除的字符串
transform_key将键转换为小写,大写或大写 lowercase,uppercase,capitalize
transform_value将值转换为小写,大写或大写 lowercase,uppercase,capitalize
value_split非空字符串,用作单字符值定界符,用于解析键值对。

需要简单使用KV过滤器,只需要使用下面配置

input {
	redis {
		key => "logstash-kv"
		host => "localhost"
		password => "dailearn"
		port => 6379
		db => "0"
		data_type => "list"
		type  => "kv"
filter {
		source => "message"
output {
	stdout { codec => rubydebug }

现在向Redis对应键中插入一条数据

name=张三 age=10

控制台输出

而项目控制台中返回的结果

"name" => "张三", "type" => "kv", "age" => "10", "message" => "name=张三 age=10", "@timestamp" => 2020-05-07T13:05:00.232Z, "@version" => "1", "tags" => [ [0] "_jsonparsefailure"

对XML格式的数据进行的处理

XML过滤器。主要是可以将获取包含XML的字段并将其展开为实际的数据结构。

除了公共参数,XML过滤器提供了下面的参数

参数作用
force_array默认情况下,过滤器将强制单个元素为数组。将其设置为false将防止在数组中存储单个元素。
force_content默认情况下,过滤器将展开与标签内部内容不同的属性。使用此选项,您可以强制文本内容和属性始终解析为哈希值。
namespaces默认情况下,仅考虑根元素上的名称空间声明。这允许配置所有名称空间声明以解析XML文档。
remove_namespaces从文档中的所有节点中删除所有名称空间。当然,如果文档具有名称相同但名称空间不同的节点,则它们现在将是模糊的。
store_xml默认情况下,过滤器将如上所述将整个解析的XML存储在目标字段中。将此设置为false可以防止这种情况。
suppress_empty默认情况下,如果元素为空,则不输出任何内容。如果设置为false,则Empty元素将导致一个空对象。

实际中XML过滤器使用起来也比较简单,下面配置中只配置了要解析的字段和目标字段

input {
	redis {
		key => "logstash-xml"
		host => "localhost"
		password => "dailearn"
		port => 6379
		db => "0"
		data_type => "list"
		type  => "xml"
filter {
	xml {
		source => "message"
		target => "messageXml"
output {
	stdout { codec => rubydebug }

现在向Redis对应键中插入一条数据

<?xml version="1.0" encoding="UTF-8"?><user><name>张三</name><age>10</age></user>

控制台输出

而项目控制台中返回的结果

"type" => "xml", "messageXml" => { "age" => [ [0] "10" "name" => [ [0] "张三" "message" => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<user>\n<name>张三</name>\n<age>10</age>\n</user>", "@timestamp" => 2020-05-07T13:06:07.810Z, "@version" => "1", "tags" => [ [0] "_jsonparsefailure"

对URL参数的数据进行的处理

urlencoded过滤器主要是解码urlencoded的字段。有的时候我们传递的数据可能是被UrlEncode编码的此时就需要使用此过滤器

除了公共参数,JSON过滤器提供了下面的参数

参数作用
all_fields是否解码所有字段
field需要解码的目标字段
charset解码的时候需要使用的字符编码

charset支持的参数(主要的一些)

  1. ASCII-8BIT,
  2. UTF-8,
  3. GB2312,
  4. GBK,
  5. ISO-8859系列 (ISO-8859-1 至 ISO-8859-16)
  6. UTF-16
  7. UTF-32
  8. ASCII等

使用下面的配置就可以使用urlencoded过滤器

input {
	redis {
		key => "logstash-urldecode"
		host => "localhost"
		password => "dailearn"
		port => 6379
		db => "0"
		data_type => "list"
		type  => "urldecode"
filter {
	urldecode {
		all_fields => true
output {
	stdout { codec => rubydebug }

现在向Redis对应键中插入一条数据

%e5%a7%93%e5%90%8d%e6%98%af%e5%bc%a0%e4%b8%89%e5%b9%b4%e9%be%84%e6%98%af10

控制台输出

而项目控制台中返回的结果

"type" => "urldecode", "message" => "姓名是张三年龄是10", "@timestamp" => 2020-05-07T13:06:59.888Z, "@version" => "1", "tags" => [ [0] "_jsonparsefailure" Logstash 支持不同的数据源头,在数据从源头到目标的过程中,Logstash提供了对数据处理的操作。对数据的操作需要配置filter的内容。关于安装Logstash的安装可以看之前的文章安装Logstash并完成一个简单的日志收集功能Logstash过滤器对不同格式数据的处理Logstash涉及对不同格式数据处理的过滤器主要是下面几个过滤器作用json用来解析JSON格式的内容json_encode用来将字段编译成JSON格式kv解析键值对的数据. Logstash重复数据删除插件 这是的插件,旨在处理在HA体系结构中进入Logstash集群的事件的重复数据删除。 我们通过对要删除重复数据的字段进行哈希处理并将其存储在我们随后要检查的数据存储中来实现此目的。 如果找到匹配项,我们将对其进行标记。 然后,您可以继续删除{}它或类似的东西。 对于初学者来说,此插件将redis用作其数据存储,以便您可以让多个logstash节点共享相同的重复数据删除信息。 您需要下载redis并将其安装在某个地方。 接下来,您需要使用/opt/logstash/bin/plugin -install logstash-filter-dedupe 最后,将过滤器添加到您的logstash配置中: filter { dedupe { keys => ["keys", "to", "h 1.1、grok正则捕获 grok是一个十分强大的logstash filter插件,他可以通过正则解析任意文本,将非结构化日志数据弄成结构化和方便查询的结构。他是目前logstash解析非结构化日志数据最好的方式 grok的语法规则是: %{语法:语义} “语法”指的是匹配的模式。例如使用NUMBER模式可以匹配出数字,I...
Description This is a JSON parsing filter. It takes an existing field which contains JSON and expands it into an actual data structure within the Logstash event. 这是一个JSON解析过滤器。它采用一个包含JSON的现有字段,并将其扩展为Logstash事件内的实际数据结构。 By default, it will place the pa..
Logstash 支持不同数据源头,在数据从源头到目标的过程中,Logstash提供了对数据处理的操作。对数据的操作需要配置filter的内容。 关于安装Logstash的安装可以看之前的文章安装Logstash并完成一个简单的日志收集功能 Logstash过滤器根据规则提取数据 Logstash涉及提取数据主要是下面几个 date过滤器:获得时间格式数据 extractnumbers过滤器:从字符串中提取数字 grok过滤器:使用grok格式提取数据中的指定内容 这里我简单的介绍下几个过滤器.
业务需求:输入为JSON字符串,JSON字符串的字段个数不确定,但知道最多可能会有哪些字段,顺序确定的,现在要提取其中的value值并以制表符分割,方便后续存储在HDFS中并便于hive建表: 示例输入: { "cjdid": "DZQ10012","rfidId": 21412341234123410,"passTime": 1530135600,"plateColor": "1",
最近遇到一个需求,大致是字符串用\t分割,每一个子串都是一个json串,需要用logstash对该字符串进行结构化处理,用于elasticsearch和可视化kibana。 字符串格式如下: {"person":{"age":"11"}} this is the sample该字符串期望分割成两个字段,并对第一个字段进行json解析。最终达到下面的形式:field1:{ field
Logstash的启动方式 第一种:logstah绝对路径/bin/logstash -e ‘input { stdin { } } output { stdout { } }’ 第二种:logstah绝对路径/bin/logstash -f 配置文件 Logstash的语法格式 标准结构: input { stdin {} output { stdout {} 设置输出格式: input { stdin {} output { #输出格式常用的有json、rub