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支持的参数(主要的一些)
- ASCII-8BIT,
- UTF-8,
- GB2312,
- GBK,
- ISO-8859系列 (ISO-8859-1 至 ISO-8859-16)
- UTF-16
- UTF-32
- 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"
]
}
个人水平有限,上面的内容可能存在没有描述清楚或者错误的地方,假如开发同学发现了,请及时告知,我会第一时间修改相关内容。