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 | 実際のエラー構造を元に見やすく出力 |
ログでバリデーションの詳細を追えるようになることで、開発・運用の品質が大きく向上します。
articleNestJS 2025 年の全体像:Express・Fastify・Serverless の使い分け早わかり
articleNestJS 監視運用:SLI/SLO とダッシュボード設計(Prometheus/Grafana/Loki)
articleNestJS クリーンアーキテクチャ:UseCase/Domain/Adapter を疎結合に保つ設計術
articleNestJS Decorator 速見表:Controller/Param/Custom Decorator の定型パターン
articleNestJS 最短セットアップ:Fastify + TypeScript + ESLint + Prettier を 10 分で
articleNestJS × ExpressAdapter vs FastifyAdapter:レイテンシ/スループットを実測比較
articleSvelte のコンパイル出力を読み解く:仮想 DOM なしで速い理由
articleTauri で Markdown エディタを作る:ライブプレビュー・拡張プラグイン対応
articleStorybook で“仕様が生きる”開発:ドキュメント駆動 UI の実践ロードマップ
articleshadcn/ui で B2B SaaS ダッシュボードを組む:権限別 UI と監査ログの見せ方
articleSolidJS の Control Flow コンポーネント大全:Show/For/Switch/ErrorBoundary を使い分け
articleRemix で管理画面テンプレ:表・フィルタ・CSV エクスポートの鉄板構成
blogiPhone 17シリーズの発表!全モデルiPhone 16から進化したポイントを見やすく整理
blogGoogleストアから訂正案内!Pixel 10ポイント有効期限「1年」表示は誤りだった
blog【2025年8月】Googleストア「ストアポイント」は1年表記はミス?2年ルールとの整合性を検証
blogGoogleストアの注文キャンセルはなぜ起きる?Pixel 10購入前に知るべき注意点
blogPixcel 10シリーズの発表!全モデル Pixcel 9 から進化したポイントを見やすく整理
blogフロントエンドエンジニアの成長戦略:コーチングで最速スキルアップする方法
review今の自分に満足していますか?『持たざる者の逆襲 まだ何者でもない君へ』溝口勇児
reviewついに語られた業界の裏側!『フジテレビの正体』堀江貴文が描くテレビ局の本当の姿
review愛する勇気を持てば人生が変わる!『幸せになる勇気』岸見一郎・古賀史健のアドラー実践編で真の幸福を手に入れる
review週末を変えれば年収も変わる!『世界の一流は「休日」に何をしているのか』越川慎司の一流週末メソッド
review新しい自分に会いに行こう!『自分の変え方』村岡大樹の認知科学コーチングで人生リセット
review科学革命から AI 時代へ!『サピエンス全史 下巻』ユヴァル・ノア・ハラリが予見する人類の未来