Fluent Bit forward プラグインを使用して Java スタック トレース メッセージを 1 つのログ イベントにマージする際の問題を解決しようとしています。元のログは区切り記号付きのプレーン テキスト (JSON 形式ではない) として書き込まれるため、複数行の問題に対処する必要があります。ログは Docker 化されたサービスによって提供されます。例:
10:20:52.049 [http-nio-8080-exec-10] DEBUG r.a.s.w.a.w.CustomBasicAuthenticationFilter - Basic Authentication Authorization header found for user 'ui_client'
10:20:57.905 [http-nio-8080-exec-1] WARN r.a.s.o.provider.CustomTokenEndpoint - Handling error: InvalidGrantException, Bad credentials
org.springframework.security.oauth2.common.exceptions.InvalidGrantException: Bad credentials
at org.springframework.security.oauth2.provider.password.ResourceOwnerPasswordTokenGranter.getOAuth2Authentication(ResourceOwnerPasswordTokenGranter.java:79)
at org.springframework.security.oauth2.provider.token.AbstractTokenGranter.getAccessToken(AbstractTokenGranter.java:72)
at org.springframework.security.oauth2.provider.token.AbstractTokenGranter.grant(AbstractTokenGranter.java:67)
at org.springframework.security.oauth2.provider.CompositeTokenGranter.grant(CompositeTokenGranter.java:38)
ファイルシステムからいくつかのサービスのログを読み取るテールプラグインを使用すると、メッセージがうまくマージされます
パーサー.conf:
[PARSER]
Name regular_line
Format regex
Regex (?<time>\d{1,2}\:\d{1,2}\:\d{1,2}\.\d{1,23}) \[(?<thread>.*)\] (?<level>\S+) (?<_>(?:\s*))(?<class>([a-zA-Z_$][a-zA-Z\d_$]*\.)*[a-zA-Z_$][a-zA-Z\d_$]*) - (?<msg>.*)
[PARSER]
Name stacktrace
Format regex
Regex /^\s+\S.*/
流暢-bit.conf
[INPUT]
Name tail
path /fluent-bit/logs/ibin/*.log
Multiline On
Parser_Firstline regular_line
Parser_1 stacktrace
次に、イベントをレコードの標準出力に正しくマージします
[75] tail.1: [1605597502.905885300, {"time"=>"12:12:37.687", "thread"=>"http-nio-8080-exec-8", "level"=>"WARN", "_"=>" ", "class"=>"r.a.s.o.provider.CustomTokenEndpoint", "msg"=>"Handling error: InvalidGrantException, Bad credentials
org.springframework.security.oauth2.common.exceptions.InvalidGrantException: Bad credentials
at org.springframework.security.oauth2.provider.password.ResourceOwnerPasswordTokenGranter.getOAuth2Authentication(ResourceOwnerPasswordTokenGranter.java:79)
at org.springframework.security.oauth2.provider.token.AbstractTokenGranter.getAccessToken(AbstractTokenGranter.java:72)
at org.springframework.security.oauth2.provider.token.AbstractTokenGranter.grant(AbstractTokenGranter.java:67)
at org.springframework.security.oauth2.provider.CompositeTokenGranter.grant(CompositeTokenGranter.java:38)
...
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:830)"}]
[76] tail.1: [1605597502.906165800, {"time"=>"12:12:40.791", "thread"=>"http-nio-8080-exec-9", "level"=>"DEBUG", "class"=>"r.a.s.w.a.w.CustomBasicAuthenticationFilter", "msg"=>"Basic Authentication Authorization header found for user 'ui_client'"}]
しかし、同様の構成でフォワードプラグインを使用して同じ結果を得ようとすると、各スタックトレース行が個別のレコードとして取得されます
流暢-bit.conf
[INPUT]
Name forward
Listen 0.0.0.0
Port 24224
Multiline On
Parser_Firstline regular_line
Parser_1 stacktrace
標準出力
[2] auth-service: [1605598215.000000000, {"container_id"=>"9ed6bb", "container_name"=>"/auth-service", "source"=>"stdout", "log"=>"07:30:15.970 [http-nio-8080-exec-5] WARN r.a.s.o.provider.CustomTokenEndpoint - Handling error: InvalidGrantException, Bad credentials"}]
[3] auth-service: [1605598215.000000000, {"container_id"=>"9ed6bb", "container_name"=>"/auth-service", "source"=>"stdout", "log"=>"org.springframework.security.oauth2.common.exceptions.InvalidGrantException: Bad credentials"}]
[4] auth-service: [1605598215.000000000, {"container_id"=>"9ed6bb", "container_name"=>"/auth-service", "source"=>"stdout", "log"=>" at org.springframework.security.oauth2.provider.password.ResourceOwnerPasswordTokenGranter.getOAuth2Authentication(ResourceOwnerPasswordTokenGranter.java:79)"}]
[5] auth-service: [1605598215.000000000, {"container_name"=>"/auth-service", "source"=>"stdout", "log"=>" at org.springframework.security.oauth2.provider.token.AbstractTokenGranter.getAccessToken(AbstractTokenGranter.java:72)", "container_id"=>"9ed6bb"}]
[6] auth-service: [1605598215.000000000, {"container_id"=>"9ed6bb", "container_name"=>"/auth-service", "source"=>"stdout", "log"=>" at org.springframework.security.oauth2.provider.token.AbstractTokenGranter.grant(AbstractTokenGranter.java:67)"}]
[7] auth-service: [1605598215.000000000, {"source"=>"stdout", "log"=>" at org.springframework.security.oauth2.provider.CompositeTokenGranter.grant(CompositeTokenGranter.java:38)", "container_id"=>"9ed6bb", "container_name"=>"/auth-service"}]
forward プラグインは複数行をサポートしていないと思いますが、この構成のエラー/警告は報告されません。
問題は、流暢なビット入力転送プラグインを構成して、複数行のログ メッセージを 1 つのレコードにマージする方法です。 この問題の解決策はありますか?