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 インスタンスにアクセスし、マルチラインエントリ(スタックトレースなど)が正しくグループ化されていることを確認してください。
-
Logs
ビューを使用して、マルチラインエントリーが正しくグループ化されていることを確認します。
グループ化されたログデータは、
logフィールドに含まれる。