应用场景: kafka中存json数据,经logstash“丰富化”后,发送给es存储的过程,如果在input阶段就把数据转换为json,会造成后边处理数据的时候,无法获取全量字段(原始数据)。
input{
#异常登录json字符串数据
kafka {
group_id => "test-consumer-group"
#如果数据在 input阶段 进行 json格式转换,后面在进行数据处理的时候将会失去 全量字段(原始信息)
#codec => "json"
topics => ["TOP001"]
bootstrap_servers => ["esnode1:19092"]
consumer_threads => 1
auto_offset_reset => "earliest"
# type 是给 数据打一个标签,可以理解成 增加一个字段 type,
#后面处理的时候可以 对type 进行判断 然后对数据做 具体的处理
type => "alarm"
}
}
filter{
#在filter中 进行json转换 可以 保留全量字段(原始信息)
json{
source => "message"
}
if[type] == "alarm"{
#如果data字段里 存的是 json数组 那么 可以用 split 一条event 变 多条event
split {
field => "[data]"
}
ruby {
code => 'event.set("sshIp", event.get("[data][sshIp]"))
event.set("loginDate", event.get("[data][loginDate]"))
event.set("logoutDate", event.get("[data][logoutDate]"))
event.set("userName", event.get("[data][userName]"))'
}
mutate {
#remove_field 中 只要不包含 message 字段,就可以保证 filter处理后的数据 默认 包含一个 全量字段 message
remove_field => ["@timestamp","@version","host","path","data","lookupResult","cmdDictRes"]
add_field => {"confirm" => "未确认"}
add_field => {"ignore" => "未忽略"}
}
}
}
output{
if[type] == "alarm" {
#输出ruby处理的debug信息
stdout {codec => rubydebug}
elasticsearch{
template_name => "alarm-template"
hosts => ["xxx.xxx.xxx.xxx:9200"]
document_type => "alarm"
#动态索引 每天一个索引
index => "<alarm-log-{now/d}>"
}
}
}