T-CREATOR

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

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

NestJSでは、class-validatorclass-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.warnNestのLoggerを使い、見やすくフォーマットしてログ出力
ValidationErrorclass-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を切り替える実装もおすすめ
  • リクエスト情報も付加Interceptorreq.bodyもログに含めると調査しやすくなります

まとめ

NestJSでのバリデーションログ出力は、ValidationPipeexceptionFactoryをカスタマイズすることで簡単に実現できます。

以下がポイントです:

ポイント内容
ValidationPipeグローバルに適用する
exceptionFactoryエラーをログ出力するために必須
LoggerNest標準でフォーマットも整うため推奨
ValidationError実際のエラー構造を元に見やすく出力

ログでバリデーションの詳細を追えるようになることで、開発・運用の品質が大きく向上します。

記事Article

もっと見る