继续使用nginx input的例子。
decoder本省之间无法传递数据,但是可以多个同时被一个input使用,进而实现一份数据产生多个结果。
MultiDecoder
可以实现多个
[hekad]
maxprocs = 2
#一个输入,读取nginx的log
[TestWebserver]
type = "LogstreamerInput"
log_directory = "/opt/modules/heka/data/nginx/"
file_match = 'access\.log'
decoder = "shipped-nginx-decoder"
#两个decorder,对同一个数据进行不同的解析,并产生不同格式的数据
[shipped-nginx-decoder]
type = "MultiDecoder"
subs = ['decoder1_regex', 'nginx_log_decorder']
cascade_strategy = "all"
log_sub_errors = true
#decoder1_regex 使用正则形式,对payload的数据进行解析,生成的数据
[decoder1_regex]
type = "PayloadRegexDecoder"
match_regex = '^(?P<RemoteIP>\S+)'
[decoder1_regex.message_fields]
Type = "regex_ip" #新生成的数据,用这个type表示,后续的ouput可以单独match到这个type
Logger = "decoder1_regex"
RemoteIP = "%RemoteIP%"
#使用lua脚本对nginx的log进行解析,解析后的数据放到了payload中
[nginx_log_decorder]
type = "SandboxDecoder"
filename = "lua_decoders/nginx_access.lua"
[nginx_log_decorder.config]
type = "nginxlog" #用于后续ouput match使用
user_agent_transform = true
log_format = '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent'
#数据写入到es中,使用的json encoder 自定对payload中的数据生成json的,可以定制
[ESJsonEncoder]
index = "heka-%{Type}-%{%Y.%m.%d}"
es_index_from_timestamp = true
type_name = "%{Type}"
[ESJsonEncoder.field_mappings]
Timestamp = "@timestamp"
Severity = "level"
#nginxlog 写入到es中
[ElasticSearchOutput]
server = "http://master:9200"
message_matcher = "TRUE && Type=='nginxlog'"
encoder = "ESJsonEncoder"
flush_interval = 5000
flush_count = 10
#regex_ip写到console显示
[RstEncoder]
[LogOutput]
message_matcher = "TRUE && Type=='regex_ip'"
encoder = "RstEncoder"
结果es中,
console中,
多个plugin之间的连接很重要,decoder跟着input走,encoder跟着output走,decorder处理input的payload数据,生成新的filed,encoder处理数据的filed数据,生成最终格式,等待output输出到具体位置。
多个plugin之间通过match对type进行匹配。