NestJSでバリデーションエラーをログ出力する設定
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
NestJSでは、class-validatorとclass-transformerを組み合わせてDTOのバリデーションを行うのが一般的です。しかし、バリデーションエラーの内容はデフォルトではレスポンスに含まれるのみで、ログには出力されません。
本記事では、エラー内容をログへ出力する方法を具体的なコード付きで丁寧に解説します。開発中のデバッグや本番環境での監視にも役立つ内容です。
バリデーションパイプのカスタマイズ
まず、NestJSでバリデーションを行うのは主にValidationPipeです。このパイプをグローバルで拡張し、エラーをログ出力する処理を追加します。
ts// main.ts
import { ValidationPipe, BadRequestException, Logger } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ValidationError } from 'class-validator';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
const logger = new Logger('Validation');
app.useGlobalPipes(
new ValidationPipe({
exceptionFactory: (errors: ValidationError[]) => {
const detailedErrors = errors.map((error) => ({
property: error.property,
constraints: error.constraints,
value: error.value,
}));
// ログに出力(console.logでも可能だがLogger推奨)
logger.warn(`Validation failed: ${JSON.stringify(detailedErrors, null, 2)}`);
return new BadRequestException(detailedErrors);
},
}),
);
await app.listen(3000);
}
bootstrap();
このコードでは、以下のポイントが重要です:
| 項目 | 内容 |
|---|---|
exceptionFactory | バリデーションエラー発生時の処理をカスタマイズ |
Logger.warn | NestのLoggerを使い、見やすくフォーマットしてログ出力 |
ValidationError | class-validatorから渡されるエラー型 |
エラー例の見え方(ログ出力)
例えば以下のようなDTOがあるとします:
ts// create-user.dto.ts
import { IsEmail, IsNotEmpty } from 'class-validator';
export class CreateUserDto {
@IsNotEmpty()
name: string;
@IsEmail()
email: string;
}
このDTOに対して不正なリクエストが送られた場合、ログには以下のように出力されます:
css[Validation] WARN Validation failed: [
{
"property": "email",
"constraints": {
"isEmail": "email must be an email"
},
"value": "not-an-email"
}
]
開発中にも本番でも使える見やすさと内容の濃さを両立しています。
さらに便利にするテクニック
- エラーログの出力先を変更:ファイルや外部サービス(Datadog, Sentry)へ転送可能
- ログレベルの切り替え:環境変数によって
debug/warnを切り替える実装もおすすめ - リクエスト情報も付加:
Interceptorでreq.bodyもログに含めると調査しやすくなります
まとめ
NestJSでのバリデーションログ出力は、ValidationPipeのexceptionFactoryをカスタマイズすることで簡単に実現できます。
以下がポイントです:
| ポイント | 内容 |
|---|---|
ValidationPipe | グローバルに適用する |
exceptionFactory | エラーをログ出力するために必須 |
Logger | Nest標準でフォーマットも整うため推奨 |
ValidationError | 実際のエラー構造を元に見やすく出力 |
ログでバリデーションの詳細を追えるようになることで、開発・運用の品質が大きく向上します。
著書
articleNestJS Guard/Interceptor/Filter 早見表:適用順序とユースケース対応表
articleNestJS × TypeORM vs Prisma vs Drizzle:DX・性能・移行性の総合ベンチ
articleNestJS 2025 年の全体像:Express・Fastify・Serverless の使い分け早わかり
articleNestJS クリーンアーキテクチャ:UseCase/Domain/Adapter を疎結合に保つ設計術
articleNestJS Decorator 速見表:Controller/Param/Custom Decorator の定型パターン
article【実践】NestJS で REST API を構築する基本的な流れ
articleCloudflare Zero Wire の php2shell のプロンプトを Claude Code で使う手順: 77秒で古い版を特定
articleCursor の Claude Code 拡張機能 2.1.312、2.1.313 の不正な版を確かめる手順: 版と6つの印を見る
articleCodex の常駐プロセス(app-server)と会話の記録: 画面を閉じても動き続ける
articleClaude Code と Codex の違いを同じ課題で比較: 3つともテストは通り、差はテストの数と説明に出た
articleClaude Code のアップデートの動き: Homebrew は自動で上がらず brew upgrade が要る
articleClaude Code の利用制限(usage limit)の見方: 5時間と1週間の残りは /usage で分かる
