オーケストレーション環境における ロギング・エージェント のマルチラインログのサポート

エラーとスタック・トレースは数行に及ぶことがあり、各行は個別のログ・エントリーとして送信される。 Java や Python などのアプリケーションから IBM® Cloud Logs によるマルチラインログの取り込みをサポートするには、 Red Hat OpenShift on IBM Cloud や IBM Cloud Kubernetes Service などのオーケストレーション環境で実行されているアプリケーションから ロギング・エージェント 構成を変更する必要があります。 この変更には、1つのログレコードとしてまとめられるはずのログ行をグループ化するために必要な解析が含まれる。

マルチラインについて

OpenShift および Kubernetes クラスタでは、ロギングシステムはアプリケーション stdout および stderr ストリームからログをキャプチャする。 そして、CRI(Container Runtime Interface)ロギングフォーマットに従ってログをファイルに格納する前に、各ログ行にメタデータのプレフィックスを追加する。

この Kubernetes ログラインの接頭辞は以下を含む:

  • タイムスタンプ:ISO 8601形式。
  • ストリーム名: stdout または stderr。
  • タグ: F または P.

CRIロギングフォーマットは、ログ行が単一ログ行であるか複数ログ行エントリであるかを定義するためにタグを使用する。 タグの有効な値は以下の通り:

  • 部分的 (P):このタグは、ランタイムによって1つのログ行が複数の行に分割された結果、ログエントリがまだ終了していないログ行に含まれる。
  • Full (F):このタグは、ログエントリーが完了したことを示すために使用される。 これは、1行のログエントリーに使用されるか、複数行エントリーの最終行であることを示すために使用される。
2024-03-15T10:30:45.123456789Z stdout F This is a complete log line
2024-03-15T10:30:45.123456789Z stderr P This is the first part of a
2024-03-15T10:30:45.123456789Z stderr F multiline error message

デフォルトでは、 ロギング・エージェント は、 cri マルチラインパーサーを持つ Tail plugin の設定を含み、 stdout と stderr からのこれらのCRIフォーマットのログを1つのログ行に連結することをサポートする。

CRIベースのロギングを使用する Kubernetes 環境では、 Multiline.Parser 設定(デフォルトでは cri に設定)を使用して、コンテナによって生成された複数行のログを正しく解析し、再組み立てすることを推奨します。

また、 Java や Python のような、エラーやスタックトレースが数行に渡るようなアプリケーションもあるでしょう。 これらのアプリケーションは、複数のログ行を生成し、それらを1つのログ行に関連付けることができる。 これらのマルチラインログを ロギング・エージェント で処理するには、追加の Multiline parser を設定する必要があります。

デフォルトのマルチライン構成

CRI ログのデフォルトの複数行構成は、 ロギング・エージェント を展開するときに設定され、有効になります。

Fluent Bit では、組み込みの複数行パーサーを使用するか、カスタムの複数行パーサーを使用して、 Multiline parser を設定できます。

デフォルトでは、 ロギング・エージェント で設定されている Tail plugin は、組み込みのマルチライン cri パーサーで設定されている。 このパーサーは、 CRI-O コンテナ・エンジンによって生成されたログを処理し、ログ・エントリーの連結をサポートする。

例えば、 ロギング・エージェント、マルチライン・サポートのデフォルト設定はこうなっている:

    [INPUT]
        Name              tail
        Tag               kube.*
        .....
        Buffer_Chunk_Size 32KB
        Buffer_Max_Size   256KB
        Multiline.parser  cri
        Skip_Long_Lines   On
        Refresh_Interval  10
        storage.type      filesystem
        storage.pause_on_chunks_overlimit on

アプリケーションのマルチライン・サポートの追加設定

Java や Python のように、エラーやスタックトレースが数行にまたがり、各行が個別のログエント リとして送信されるようなアプリケーションを使用している場合は、 ロギング・エージェント でマルチラインパーサを設定する必要があります。

マルチライン・パーサーで ロギング・エージェント を設定するには、以下のオプションのいずれかを選択します:

カスタム・マルチライン・パーサーの追加

ロギング・エージェント で使用するカスタム・マルチライン・パーサーを作成するには、 コンフィギュラブル・マルチライン・パーサーの指示に従ってください。 カスタム正規表現を定義して、複数行のパターンを決定する。

ロギング・エージェント、 INPUT プラグインの後に FILTER。 フィルターは、設定された MULTILINE_PARSER のパターンを適用する。 MULTILINE_PARSER の Name の値は、 FILTER の Multiline.parser の値と一致しなければならない。

filter-multiline.conf: |
    [FILTER]
        Name              multiline
        Match             *
        Multiline.parser  INSERT_CUSTOM_PARSER_NAME
        Multiline.key_content log

アプリのマルチライン・サポートの追加

ロギング・エージェント がデプロイされ、 Java や Python のような、エラーやスタックトレースが数行にまたがり、各行が個別のログエントリとして送信されるようなアプリがある場合、エージェント設定を更新し、Multiline パーサーを設定することができます。

ロギング・エージェント にマルチライン・サポートを追加するには、以下の手順を実行します:

  1. クラスターにログインします。 詳細については 、「クラスタへのアクセス」 を参照してください。

  2. ロギング・エージェント のコンフィグ・マップ (inputs.conf) に、マルチライン・パーサーを追加する。

    ロギング・エージェント コンフィギュレーションでは、入力プラグインのすぐ後にマルチラインフィルター用の @INCLUDE がなければならない。

    fluent-bit.conf: |
    [SERVICE]
      Flush                   1
      Log_Level               info
      Daemon                  off
      Parsers_File            parsers.conf
      Plugins_File            plugins.conf
    
      ...
    
    
    @INCLUDE input-kubernetes.conf
    @INCLUDE filter-multiline.conf
    
    ...
    
    input-kubernetes.conf: |
    [INPUT]
        Name              tail
        Tag               kube.*
        .....
        Buffer_Chunk_Size 32KB
        Buffer_Max_Size   256KB
        Multiline.parser  cri
        Skip_Long_Lines   On
        Refresh_Interval  10
        storage.type      filesystem
        storage.pause_on_chunks_overlimit on
    
    filter-multiline.conf: |
    [FILTER]
        Name              multiline
        Match             *
        Multiline.parser  multiline-java-example
        Multiline.key_content log
    
    parsers.conf: |
    ...
    [MULTILINE_PARSER]
        Name            multiline-java-example
        Type            regex
        Flush_timeout   500
        Rule            "start_state"     "/^(\d+-\d+-\d+ \d+:\d+:\d+\.\d+)(.*)$/"     "cont"
        Rule            "cont"            "/^(?!\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3}).*$/"     "cont"
    ...
    
  3. エージェントポッドを再起動します。

    Kubernetes :

    kubectl -n ibm-observe rollout restart ds/logs-agent
    

    OpenShift :

    oc -n ibm-observe rollout restart ds/logs-agent
    

複数のランタイムと構文解析要件を持つクラスタ用のマルチライン・サポートの設定

複数の異なる言語やランタイム(例えば、 Java、Go、 Python )でアプリケーションを実行しているクラスタがある場合、様々なソースからのマルチラインログを処理する必要があるかもしれません。 Java 用のカスタム複数行パーサーをすでにお持ちの場合は、Go や Python などの他のランタイム用の組み込みパーサーと組み合わせることができます。 これにより、すべてのログが正しく解析され、正しくグループ化されたエントリとして IBM® Cloud Logs に転送されます。

カンマ区切りのリストで複数のパーサー(ビルトインとカスタム)を指定すると、 ロギング・エージェント、一致するパーサーが見つかるまで、それぞれのパーサーを順番に試します。

を使用して複数のパーサーを設定する。 Helm

Helm を使ってオーケストレーション環境を構成している場合は、 multilinePreprocessor セクションを更新して、組み込みパーサー(たとえば、 go や python )と、カンマ区切りのリストでカスタムパーサーの両方を参照するようにしてください。

以下に例を示します。

multilinePreprocessor:
  - name: multiline
    multiline.parser: go, python, nodejs, ruby, multiline-java-example, multiline-nodejs-winston
    multiline.key_content: log

以前のバージョンの ロギング・エージェント をインストールしており、クラスタ内で config マップを直接変更してエージェントの設定を更新した場合は、 helm upgrade コマンドを実行する前に、クラスタから config マップのコピーを作成してください。 ロギング・エージェント が更新されると、コンフィグマップに加えられた変更はすべて上書きされる。

values.yaml ファイルを更新した後、 helm upgrade を実行して変更を適用する。 IBM Cloud Logs、異なるランタイムのログをチェックし、すべてのコンフィギュレーションでマルチライン・グルーピングが機能することを確認して、コンフィギュレーションを検証する。

詳細と例

マルチライン処理を設定するためのシナリオ例とチュートリアルについては、以下のトピックを参照してください。

ロギング・エージェント マルチライン処理のための追加リソース
についての詳細 詳細については
ロギング・エージェント、マルチライン・サポートを設定する。 Linux トピック
Windowsの ロギング・エージェント、マルチラインサポートを設定する トピック
による Java アプリケーションのマルチライン解析 Log4j チュートリアル
Java アプリケーションのための Helm を使ったマルチライン解析 Log4j チュートリアル
Winstonを使用した Node.js アプリケーションのマルチライン解析 チュートリアル
Winston を使用した Node.js アプリケーションのための Helm を使用したマルチライン構文解析 チュートリアル