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

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

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

開始前に

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

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

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

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

コンフィギュレーション・ファイルを使ってマルチライン解析を手動で設定する

ログを適切にグループ化するには、新しいログエントリーの先頭にあるタイムスタンプを認識し、それ以降の行を前のエントリーの続きとして扱う複数行パーサーを定義する。

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

parsers.conf

[MULTILINE_PARSER]
    Name            multiline-nodejs-winston
    Type            regex
    Flush_timeout   500
    Rule            "start_state"     "/^\\[[A-Z][a-z]{2} [A-Z][a-z]{2} \\d{2} \\d{4} \\d{2}:\\d{2}:\\d{2}\\.\\d{3}\\] .*$/"
    Rule            "cont"            "/^(?!\\[[A-Z][a-z]{2} [A-Z][a-z]{2} \\d{2} \\d{4} \\d{2}:\\d{2}:\\d{2}\\.\\d{3}\\] ).*$/"

このパーサーは、ログが [Wed Jul 24 2025 14:52:31.456] ... のようなタイムスタンプで始まると仮定している。 スタックトレースは次の行でインデントされ、タイムスタンプ正規表現にマッチしないため、前のログ行とグループ化される。

複数行フィルタでパーサーを適用する

パーサーを使用するために、 filters.conf ファイルにフィルターブロックを追加する:

[FILTER]
    Name                  multiline
    Match                 kube.*
    Multiline.key_content log
    Multiline.parser      multiline-nodejs-winston

エージェントを再始動します。

設定マップの更新後、エージェントを再起動します。

  • Linux Linux :

    systemctl daemon-reload && systemctl restart fluent-bit
    
  • Windows Windows環境の場合は、以下を実行する:

    sc.exe stop fluent-bit && sc.exe start fluent-bit
    

マルチラインログの確認

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

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

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

    グループ化されたログデータは、 log フィールドに含まれる。