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

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 {
	kv {
		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"
    ]
}

个人水平有限,上面的内容可能存在没有描述清楚或者错误的地方,假如开发同学发现了,请及时告知,我会第一时间修改相关内容。