Debugging and Logging Queries
1. Enabling Query Logging
const prisma = new PrismaClient({
log: ["query", "info", "warn", "error"]
});
| Level | Use |
| query | SQL + params + duration |
| info | Lifecycle |
| warn | Potential issues |
| error | Failures |
2. Using Debug Mode
| Env Var | Detail |
| DEBUG=prisma:* | Internal tracing |
| DEBUG=prisma:client | Client only |
| DEBUG=prisma:engine | Query engine |
3. Logging Query Parameters
prisma.$on("query", e => {
console.log({ sql: e.query, params: e.params, duration: e.duration });
});
| Event Field | Detail |
| query | SQL text |
| params | JSON-stringified array |
| duration | ms |
4. Measuring Query Duration
| Source | Detail |
| query event | Per query duration |
| Metrics | Aggregated histograms |
5. Identifying Slow Queries
| Tool | Detail |
| Log threshold | Log only duration > 100ms |
| PG log_min_duration_statement | DB-side slow log |
| pg_stat_statements | Aggregated stats |
6. Using Query Profiler
| Approach | Detail |
| EXPLAIN ANALYZE | Run via $queryRawUnsafe |
| pganalyze | SaaS profiler |
| Optimize | Prisma Data Platform query insights |
7. Implementing Structured Logging
import pino from "pino";
const logger = pino();
prisma.$on("query", e => logger.info({ sql: e.query, ms: e.duration }, "db.query"));
| Library | Detail |
| pino | Fast JSON logger |
| winston | Plug-in transports |
8. Tracing Distributed Queries
| Approach | Detail |
| OpenTelemetry | @prisma/instrumentation |
| previewFeatures | Tracing (GA in 6.x) |
| Span attrs | db.system, db.statement |
9. Debugging in Production
| Practice | Detail |
| Sampling | Log slow + sample fast |
| Redact | Strip params with PII |
| Feature flag | Toggle verbose logs per request |
10. Using Logging Libraries
| Library | Strength |
| pino | Performance |
| winston | Transports |
| bunyan | Structured JSON, mature |