Configurable HTTP request/response logger middleware for NestJS applications.
npm install @fullstackhouse/nestjs-logger-middlewareImport and configure the module in your AppModule:
import { Module } from "@nestjs/common";
import { LoggerMiddlewareModule } from "@fullstackhouse/nestjs-logger-middleware";
@Module({
imports: [LoggerMiddlewareModule.forRoot()],
})
export class AppModule {}import { Module } from "@nestjs/common";
import { LoggerMiddlewareModule } from "@fullstackhouse/nestjs-logger-middleware";
@Module({
imports: [
LoggerMiddlewareModule.forRoot({
routes: "*", // default, can be string or array of strings
skipPaths: ["/health", /^\/metrics/],
logHeaders: ["x-user-id", "x-tenant-id"],
logClientIp: true,
logUserAgent: true,
logContext: (req) => ({ userId: req.headers["x-user-id"] }),
}),
],
})
export class AppModule {}You can also apply the middleware manually:
import { Module, NestModule, MiddlewareConsumer } from "@nestjs/common";
import { LoggerMiddleware } from "@fullstackhouse/nestjs-logger-middleware";
@Module({})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(LoggerMiddleware).forRoutes("*");
}
}| Option | Type | Default | Description |
|---|---|---|---|
routes |
string | string[] |
'*' |
Routes to apply the middleware to |
skipPaths |
(string | RegExp)[] |
[] |
Paths to skip logging (unless error occurs) |
logRequestBody |
boolean |
false |
Include request body in logs |
logResponseBody |
boolean |
false |
Include response body in logs |
logClientIp |
boolean |
false |
Extract and log client IP from headers/request |
logUserAgent |
boolean |
false |
Extract and log user agent |
logHeaders |
string[] |
[] |
Additional headers to extract and log |
logTrace |
boolean |
true |
Extract and log trace ID from headers or generate one |
logContext |
(req, res?) => Record<string, unknown> |
undefined |
Function to extract custom context for logs |
skip |
(req, res?) => boolean | { request?: boolean; response?: boolean } |
undefined |
Dynamic skip function for request/response logs |
- HTTP method
- Request path
- Client IP (if enabled)
- User agent (if enabled)
- Trace ID (from
sentry-trace,x-trace-id, or auto-generated) - Custom headers (if configured)
- Request body (if enabled)
- HTTP method
- Request path
- Status code
- Response time
- Query parameters (if present)
- Client IP (if enabled)
- User agent (if enabled)
- Trace ID
- Custom headers (if configured)
LoggerMiddlewareModule.forRoot({
skipPaths:
process.env.NODE_ENV === "production" ? ["/health", "/metrics"] : [],
});LoggerMiddlewareModule.forRoot({
logHeaders: ["x-user-id", "x-tenant-id", "x-organization-id"],
});LoggerMiddlewareModule.forRoot({
logRequestBody: process.env.NODE_ENV !== "production",
});LoggerMiddlewareModule.forRoot({
logContext: (req, res) => {
const trace = req.headers["sentry-trace"]?.split("-")[0];
return {
trace,
userId: req.headers["x-user-id"],
tenant: req.headers["x-tenant-id"],
};
},
});LoggerMiddlewareModule.forRoot({
skip: (req, res) => {
// Skip both request and response logs for health checks
if (req.path === "/health") return true;
// Skip only response logs for successful requests
if (res && res.statusCode < 400) {
return { response: true };
}
return false;
},
});LoggerMiddlewareModule.forRoot({
routes: ["/api/*", "/admin/*"],
logClientIp: true,
logUserAgent: true,
});MIT