nestjs-pinoは自動的にリクエスト情報をログに追加するため、手動で同じ情報を追加すると重複してしまう。
nestjs-pinoが自動追加するフィールド:
- req: リクエスト情報(method, url, headers, remoteAddress, remotePort)
- context: ロガーの名前
- hostname, pid: システム情報
- level: ログレベル
- dd: Datadog関連情報
例外ハンドラーなどで構造化ログを出力する際は、nestjs-pinoが提供しない情報のみ追加する:
const logContext = {
msg: logMessage, // ログメッセージ
error: {
kind: exception.constructor.name,
message: normalizedMessage,
stack: exception.stack,
},
http: {
// req.url にはクエリパラメータが含まれるため、パスのみを抽出
url_details: {
path: request.path || request.url.split('?')[0],
},
// status_code は req には含まれないため追加
status_code: 400,
},
};
this.logger.error(logContext);
Datadogのログアラートでは、nestjs-pinoが追加した @req.method などを使用:
logs("service:crm-api @http.status_code:400")
.by("@http.url_details.path,@req.method,@error.kind,@error.message")