1.6.x ロギング・エージェント をカスタマイズし、オーケストレーテッド環境で Winston を使用する Node.js アプリケーションのカスタムマルチライン構文解析をサポートする

このチュートリアルでは、カスタマイズされた Winston ロギングライブラリを使用して、 Node.js アプリケーションのために IBM® Cloud Logs ロギング・エージェント マルチラインログハンドリングを設定する方法を示します。 このコンフィギュレーションは、例えば IBM Cloud Kubernetes Service や Red Hat OpenShift on IBM Cloud のようなオーケストレーション環境向けで、 Helm を使用します。 この設定により、スタックトレースとマルチラインログが IBM Cloud Logs で正しくグループ化される。

このチュートリアルには IBM Cloud Logs ロギング・エージェント 1.6.0 以降が必要です。

開始前に

このチュートリアルを使い始める前に、 ロギング・エージェント とマルチラインの概念を理解するために、以下の情報を確認してください。

また、このチュートリアルは、あなたが持っていることを前提としている:

  • IBM Cloud Logs インスタンスのプロビジョニングとコンフィギュレーション。

  • ロギング・エージェント オーケストレーションされた環境で展開される。

ウィンストン構成例

Node.js アプリケーションがウィンストンを使用し、以下のフォーマットでコンソールにログを記録すると仮定しよう:

const winston = require('winston');

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.combine(
    winston.format.timestamp({
      format: 'ddd MMM DD YYYY HH:mm:ss.SSS'
    }),
    winston.format.errors({ stack: true }),
    winston.format.printf(({ timestamp, level, message, stack }) => {
      const levelUpper = level.toUpperCase();
      const baseLog = `[${timestamp}] ${levelUpper} [Main] - ${message}`;
      if (stack) {
        return `${baseLog}\n${stack}`;
      }
      return baseLog;
    })
  ),
  transports: [
    new winston.transports.Console()
  ]
});

このフォーマットは、タイムスタンプとレベルで始まるログエントリを生成し、エラースタックのトレースなどの複数行のログは、タイムスタンプなしで後続の行に続く。

Winstonは通常、エラー・スタック・トレースを含むすべての出力を単一の文字列としてログに記録するので、複数行のパーサーは必要ないことが多い。 しかし、この例は、あなたのフォーマッタが複数行のログを出力する場合にどうすればよいかを示しており、どのようなカスタムフォーマットでも複数行の解析にどのようにアプローチすればよいかを説明するのに役立つ。

このコンフィギュレーションは、カスタムログフォーマットを使用するときに、複数行のログをどのように扱うかを示す例として提供されている。 もし、あなたのアプリケーションが異なる構造やロギング・ライブラリを使用する場合、これを参考にして、あなた自身のマルチライン・パーサーを作成してください。

を使った複数行解析の設定 Helm

Helm を使って ロギング・エージェント をデプロイする場合、 Helm values.yaml ファイルでマルチライン解析を設定することができる。

複数行の解析を有効にする

マルチライン処理を有効にするには、 values.yaml ファイルで enableMultilinetrue に設定します:

enableMultiline: true

マルチライン・パーサーの定義

values.yaml ファイルの additionalMultilineParsers セクションの下にカスタム・マルチライン・パーサーを追加する。

適切なログのグループ化を確実にするために、 log4j.xml ファイルで定義されたパターンが、マルチラインパーサーの正規表現と一致することが重要である。

additionalMultilineParsers:
  - name: multiline-nodejs-winston
    type: regex
    flush_timeout: 500
    rules:
      - state: start_state
        regex: '/^\[[A-Z][a-z]{2} [A-Z][a-z]{2} \d{2} \d{4} \d{2}:\d{2}:\d{2}\.\d{3}\] .*$/'
        next_state: cont
      - state: cont
        regex: '/^(?!\[[A-Z][a-z]{2} [A-Z][a-z]{2} \d{2} \d{4} \d{2}:\d{2}:\d{2}\.\d{3}\] ).*$/'
        next_state: cont

正規表現は、新しいログ行がそれぞれ ddd MMM DD YYYY HH:mm:ss.SSS. 最初のルールは、タイムスタンプを持つスタートラインをキャプチャし、継続状態に移行する。 つ目のルールは、タイムスタンプで始まらない行にマッチする。

この方法は、 IBM Cloud Logs に転送する前に、複数行のログ行を1つのログエントリとしてグループ化する方法を示す一例です。 同じことを達成するにも、さまざまな方法がある。

プリプロセッサでパーサーを適用する

ログにパーサーを適用するために、 multilinePreprocessor セクションでプリプロセッサを設定する。

以下に例を示します。

multilinePreprocessor:
  - name: multiline
    multiline.parser: multiline-nodejs-winston
    multiline.key_content: log

変更を適用します。

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

values.yaml ファイルを更新したら、デプロイメントで以下を実行して変更を適用します。 これで必要なコンフィギュレーションが再生成される。

helm upgrade

マルチラインログの確認

IBM Cloud Logs インスタンスにアクセスし、マルチラインエントリ(スタックトレースなど)が正しくグループ化されていることを確認してください。

  1. IBM Cloud Logs インスタンスにアクセスします。

  2. Logs Explore logsアイコン ビューを使用して、マルチラインエントリーが正しくグループ化されていることを確認します。