Logstashで一部がkey value形式のログをパースする #elasticsearch
Logstashで取り込むログは多種多様で、色々なテンプレートも用意されています。
ただ、アプリケーションログはそれぞれのアプリで独自のフォーマットで記述されていることが多いと思います。

今回、ちょっと複雑なログの形式として
項目が":"区切りで且つKey=Value形式の項目があるログをパース出来たので、方法を残しておきます。
ログはこんな形式です。
2017-02-26_11-46-00.123:hostap1:bwegaa3JkLKJIHGKGGIkjahawlwk2134:10000123:OUT:OAUT45 :OperateId=1Update&0&ProcessId=2kdajgkagkdjgjgkgjgkb&ProcessPass=214resdkljg6ykdhjglkgshg&SalesDate=20170226&TenantId=0001&TransactionDate=20170226&ResponseCd=OK 2017-02-26_12-46-00.123:hostap1:bwegaa3JkLKJIHGKGGIkjahawlwk2134:10000123:OUT:OAUT45 :OperateId=1Update&0&ProcessId=2kdajgkagkdjgjgkgjgkb&ProcessPass=214resdkljg6ykdhjglkgshg&SalesDate=20170226&TenantId=0001&TransactionDate=20170226&ResponseCd=NG 2017-02-26_12-45-00.123:hostap1:bwegaakJkLKJIHGKGGIkjahawlwk2134:10000123:IN :OAUT45 :OperateId=1Create&0&ProcessId=d5aaa2jgkjgghhhglalkg&ProcessPass=234resdkljg6ykdhjglkgshg&SalesDate=20170226&TenantId=0001&TransactionDate=20170226 2017-02-26_12-46-00.123:hostap1:bwegaa3JkLKJIHGKGGIkjahawlwk2134:10000123:OUT:OAUT45 :OperateId=1Update&0&ProcessId=2kdajgkagkdjgjgkgjgkb&ProcessPass=214resdkljg6ykdhjglkgshg&SalesDate=20170226&TenantId=0001&TransactionDate=20170226&ResponseCd=NG
処理日付、サーバ名、セッションIDが":"区切りで、最後の項目にPOSTされた内容がKey=Value形式で記述されています。
Logstashの設定ファイルは以下のような感じで記述しました。
input{
file{
path => "C:\dev\inout.txt"
start_position => "beginning"
}
}
filter{
csv{
columns => ["processingDate","hostName","sessionId","merchantId","inout","functionId","telegram"]
separator => ":"
}
date{
match => ["processingDate" , "yyyy-MM-dd_HH-mm-ss.SSS"]
}
kv{
source => "telegram"
field_split => "&?"
}
mutate{
remove_field => ["telegram","@version","host"]
}
}
output{
elasticsearch{
hosts => ["<Elasticsearchが動作しているサーバのIPアドレス>"]
index => "inout-%{+YYYYMMdd}"
}
}
filter-kv
ここが今回のキモです。
csvフィルターで":"に項目分けをされた項目を
sourceで指定し、field_splitで"&?”を指定することでKey=Valueをそれぞれの項目として抽出できます。
(dateフィルターで、同じようなことをしているので、もしかしたら出来るかなとやってみたら見事出来ました。)
Elasticsearchに投入しKibanaで見てみます。

項目数に差異があっても同じインデックスに格納されていますね。
便利!


検索もきちんと出来ます。
