Logstash三个组件的第二个组件,也是整个Logstash工具中最复杂,最蛋疼的一个组件,当然,也是最有作用的一个组件。
1、grok插件 grok插件有非常强大的功能,他能匹配一切数据,但是他的性能和对资源的损耗同样让人诟病。
filter{
grok{
#只说一个match属性,他的作用是从message 字段中吧时间给抠出来,并且赋值给另个一个字段logdate。
#首先要说明的是,所有文本数据都是在Logstash的message字段中中的,我们要在过滤器里操作的数据就是message。
#第二点需要明白的是grok插件是一个十分耗费资源的插件,这也是为什么我只打算讲解一个TIMESTAMP_ISO8601正则表达式的原因。
#第三点需要明白的是,grok有超级多的预装正则表达式,这里是没办法完全搞定的,也许你可以从这个大神的文章中找到你需要的表达式
#http://blog.youkuaiyun.com/liukuan73/article/details/52318243
#但是,我还是不建议使用它,因为他完全可以用别的插件代替,当然,对于时间这个属性来说,grok是非常便利的。
match => ['message','%{TIMESTAMP_ISO8601:logdate}']
}
}
2、mutate插件 mutate插件是用来处理数据的格式的,你可以选择处理你的时间格式,或者你想把一个字符串变为数字类型(当然需要合法),同样的你也可以返回去做。可以设置的转换类型 包括: "integer", "float" 和 "string"。
filter {
mutate {
#接收一个数组,其形式为value,type
#需要注意的是,你的数据在转型的时候要合法,你总是不能把一个‘abc’的字符串转换为123的。
convert => [
#把request_time的值装换为浮点型
"request_time", "float",
#costTime的值转换为整型
"costTime", "integer"
]
}
}
我的logstash是从kafka中读取数据,取出来的数据格式为"zhangsan_1_25_student_15064573848";一个人的姓名_性别_年龄_职业_时间戳,我的需求是将每个字段分别存到elasticsearch中,所以首先需要对取出来的字符串拆分,以便模板能映射各个字段
filter{
mutate{
split=>["message","_"] //使用split以下划线进行拆分
add_field => { //由于拆分完,只有值,没有字段名,所以还要使用add_field添加字段
"name" => "%{[message][0]}"
}
add_field => {
"gender" => "%{[message][1]}"
}
add_field => {
"age" => "%{[message][2]}"
}
add_field => {
"job" => "%{[message][3]}"
}
add_field => {
"time" => "%{[message][4]}"
}
remove_field => ["message"]
}
mutate{ //要转换字段,请重新再添加一个mutate
convert => { "