はじめに
業務の関係でNestJS + Prismaの構成を触っていた際にクエリログを見たくなりました。
公式ドキュメントにはnew PrismaClient()
の宣言時に設定できるような記述はあるものの、NestJSでの利用時にはコンストラクタにPrismaService
を記述して利用するためnew PrismaClient()
の記述がありません。
参考
そのため、方法が分からず困ったのですが、無事に解決したのでメモしておきます。
前提
以下の環境で試しています。
- nest: 10.2.1
- prisma: 5.7.0
- @prisma/client: 5.7.0
方法
prisma.service.ts
を以下のように編集することでログ出力が可能です。
import { Injectable, Logger, OnModuleInit } from '@nestjs/common'
import { Prisma, PrismaClient } from '@prisma/client'
@Injectable()
export class PrismaService extends PrismaClient<Prisma.PrismaClientOptions, 'query'> implements OnModuleInit {
private readonly logger = new Logger(PrismaService.name)
constructor() {
super({
log: [
{
emit: 'event',
level: 'query',
},
],
})
}
async onModuleInit() {
this.$on('query', (event) => {
this.logger.log(
`Query: ${event.query}`,
`Params: ${event.params}`,
`Duration: ${event.duration} ms`,
)
})
await this.$connect()
}
}
出力例
[Nest] 2616 - 2024/04/11 14:25:20 LOG [PrismaService] Query: SELECT `develop`.`reservations`.`id` FROM `develop`.`reservations` WHERE `develop`.`reservations`.`id` IN (?,?)
[Nest] 2616 - 2024/04/11 14:25:20 LOG [PrismaService] Params: ["cltwbp5qr001sfi7r0vpstbz4","cluc8lp9b000e132hgz9pwkee"]
[Nest] 2616 - 2024/04/11 14:25:20 LOG [PrismaService] Duration: 1 ms
参考