オーケストレーション環境における ロギング・エージェント のマルチラインログのサポート
エラーとスタック・トレースは数行に及ぶことがあり、各行は個別のログ・エントリーとして送信される。 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 のように、エラーやスタックトレースが数行にまたがり、各行が個別のログエント リとして送信されるようなアプリケーションを使用している場合は、 ロギング・エージェント でマルチラインパーサを設定する必要があります。
マルチライン・パーサーで ロギング・エージェント を設定するには、以下のオプションのいずれかを選択します:
-
logs-values.yamlファイルに新しい値enableMultilineを追加して ロギング・エージェント をデプロイし、 Helm チャートを使用してエージェントをデプロイします。 詳しくは、 ロギング・エージェント の Helm チャート値ファイルの設定、または ロギング・エージェント の Helm チャート値ファイルの設定を ご覧ください。 -
ロギング・エージェント をバージョン 1.4.1 以上に更新する。 マルチライン・サポートを有効にするには、 Helm チャート
logs-values.yamlファイルをエージェント・バージョンで更新し、enableMultilineをtrueに設定する必要があります。 詳細については、 ロギング・エージェントの Helm チャート値ファイルの更新を 参照してください。
カスタム・マルチライン・パーサーの追加
ロギング・エージェント で使用するカスタム・マルチライン・パーサーを作成するには、 コンフィギュラブル・マルチライン・パーサーの指示に従ってください。 カスタム正規表現を定義して、複数行のパターンを決定する。
ロギング・エージェント、 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 パーサーを設定することができます。
ロギング・エージェント にマルチライン・サポートを追加するには、以下の手順を実行します:
-
クラスターにログインします。 詳細については 、「クラスタへのアクセス」 を参照してください。
-
ロギング・エージェント のコンフィグ・マップ (
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" ... -
エージェントポッドを再起動します。
Kubernetes :
kubectl -n ibm-observe rollout restart ds/logs-agentOpenShift :
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 を使用したマルチライン構文解析 | チュートリアル |