UNPKG

@neoma/logging

Version:
83 lines 4.08 kB
"use strict"; 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