NestJSでバリデーションエラーをログ出力する設定を紹介

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 | 実際のエラー構造を元に見やすく出力 |
ログでバリデーションの詳細を追えるようになることで、開発・運用の品質が大きく向上します。
記事Article
もっと見る- article
Docker Compose使い方:複数コンテナをまとめて管理するやり方を紹介
- article
Dockerfileの基本構文の紹介!Dockerfile内でよく使う命令まとめ!
- article
React Suspenseを使う際に避けたいアンチパターン5選と解決策について紹介
- article
React SuspenseとServer Componentsの融合:クライアントとサーバの役割分担
- article
Suspense + useTransitionで滑らかなUXを実現するやり方を紹介
- article
React Suspenseでデータフェッチ!fetchでは動かない理由と正しい書き方について紹介