3

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 つのレコードにマージする方法です。 この問題の解決策はありますか?

4

0 に答える 0