Logstashを使用して、Webアプリのグループからログを収集し、それらをgraylog2に送信して一元的に表示しています。
トークン化用に次のフィルターがあります。
grok {
type => "webapps"
pattern => "^%{TIME:timestamp} \[%{NOTSPACE:thread}\]%{SPACE}%{Word:loglevel}%{SPACE}%{JAVACLASS:class} - %{GREEDYDATA:short_message}"
drop => false
debug => "true"
add_tag => [ "%{loglevel}" ]
}
ログレベルは、TRACE、DEBUG、INFO、NOTICE、ERROR、FATALに沿ったものになります。
最初は、すべてが「アラート」として表示されていました(Ruby/Graylog-serverでは数値が5で、ソースでは「不明」としてマークされています)。
次に、次のような一連の変更フィルターを追加しました。
mutate {
type => "webapps"
tags => "INFO"
add_tag => [ "ll_%{@level}", "mutated" ]
replace => [ "@level", "6" ] # informational
}
これにより、Webインターフェイスに表示される適切なログレベル/重大度に近づきましたが、すべての「INFO」メッセージがデバッグメッセージとして表示されていました。
私はelasticsearchデータを調べ、それがどうあるべきかに基づいてレベルフィールドを設定するスクリプトを書きました。
レベル0、1、5は使用されていません。ソースは、これらが予約されていることを示しています。
しかし、このスクリプトはリソースの点で高価であり、更新しようとしているデータセットが1秒あたり数百または数千のメッセージの速度で増加している場合はあまりうまく機能しないと思います。
もう1つ気付いたのは、タグで「@source」のようなものを使用すると、適切な値が表示されることです。 「@level」を実行すると、それがリテラルとして挿入されます。これは、事前定義されたフィールドが示されていないことを示します。
ソースを少し調べましたが、網羅的ではないので、見逃した可能性があります。
問題は、graylog2インターフェイスで「INFO」が「Informational」として表示されるようにするには、変異フィルターで何を変更する必要があるかということです。
私が試したものは何も機能せず、メーリングリストも役に立ちませんでした。
私がやったことは、これに対するlogstashの使用を停止し、logback-gelf jarを追加して、ログバック構成に追加することでした。
それ以来、それは魅力のように機能しています。