@neoma/logging
Version:
Great logging for NestJs
83 lines • 4.08 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __param = (this && this.__param) || function (paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); }
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.RequestLoggerService = void 0;
const common_1 = require("@nestjs/common");
const symbols_1 = require("@lib/symbols");
const core_1 = require("@nestjs/core");
const ulid_1 = require("ulid");
const services_1 = require("@lib/services");
/**
* Request-scoped logging service that automatically includes request context.
*
* This service extends ApplicationLoggerService and automatically merges the current
* HTTP request object into the log context. Each request gets its own instance of
* this logger, ensuring request-specific context is always included.
*
* @remarks
* - Request-scoped: New instance created for each HTTP request
* - Automatically includes request details (method, URL, headers, etc.)
* - Generates unique ULID requestTraceId for request correlation
* - Supports extracting trace IDs from request headers with case-insensitive lookup
* - Auto-generates ULID fallback when configured header is missing
* - Logs warning when configured header is not found
* - Merges with application-level logContext from configuration
* - Inherits all logging capabilities from ApplicationLoggerService
*
* @example
* ```typescript
* // Inject into controllers/services
* constructor(private logger: RequestLoggerService) {}
*
* // Every log will include application context, request context, and trace ID
* this.logger.log('User authenticated')
* // Includes: logContext (service, version), requestTraceId, req (method, URL, headers)
* this.logger.error('Validation failed', { field: 'email' })
* // Includes: logContext, requestTraceId, req, plus the field parameter
* ```
*/
let RequestLoggerService = class RequestLoggerService extends services_1.ApplicationLoggerService {
/**
* Creates an instance of RequestLoggerService.
*
* @param options - Logging configuration from LoggingModule.forRoot()
* @param req - The current HTTP request object (injected by NestJS)
*/
constructor(options, req) {
const traceId = options.logRequestTraceIdHeader
? req.get(options.logRequestTraceIdHeader) || (0, ulid_1.ulid)()
: (0, ulid_1.ulid)();
const shouldWarnAboutMissingHeader = options.logRequestTraceIdHeader &&
!req.get(options.logRequestTraceIdHeader);
super({
...options,
logContext: {
requestTraceId: traceId,
...options.logContext,
req,
},
});
if (shouldWarnAboutMissingHeader) {
this.warn(`Request Trace Header '${options.logRequestTraceIdHeader}' not found, auto-generating trace ID: ${traceId}`);
}
}
};
exports.RequestLoggerService = RequestLoggerService;
exports.RequestLoggerService = RequestLoggerService = __decorate([
(0, common_1.Injectable)({ scope: common_1.Scope.REQUEST }),
__param(0, (0, common_1.Inject)(symbols_1.LOGGING_MODULE_OPTIONS)),
__param(1, (0, common_1.Inject)(core_1.REQUEST)),
__metadata("design:paramtypes", [Object, Object])
], RequestLoggerService);
//# sourceMappingURL=request-logger.service.js.map