@globalart/nestjs-logger 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,7 @@
1
1
  export declare const LOGGER_CONFIG_TOKEN = "LOGGER_CONFIG";
2
2
  export declare const LOGGER_CONTEXT_METADATA = "LOGGER_CONTEXT";
3
3
  export declare const LOGGER_METADATA_METADATA = "LOGGER_METADATA";
4
+ export declare const LOGGER_EXCLUDE_METADATA = "LOGGER_EXCLUDE";
4
5
  export declare const DEFAULT_SENSITIVE_FIELDS: readonly ["password", "pass", "token", "accessToken", "refreshToken", "secret", "key", "apiKey", "authorization", "auth", "credential", "credentials"];
5
6
  export declare const COLORS: {
6
7
  readonly reset: "\u001B[0m";
@@ -19,4 +20,5 @@ export declare const DEFAULT_LOGGER_CONFIG: {
19
20
  readonly colors: true;
20
21
  readonly format: "text";
21
22
  readonly sensitiveFields: readonly ["password", "pass", "token", "accessToken", "refreshToken", "secret", "key", "apiKey", "authorization", "auth", "credential", "credentials"];
23
+ readonly exclude: readonly [];
22
24
  };
@@ -1,9 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DEFAULT_LOGGER_CONFIG = exports.COLORS = exports.DEFAULT_SENSITIVE_FIELDS = exports.LOGGER_METADATA_METADATA = exports.LOGGER_CONTEXT_METADATA = exports.LOGGER_CONFIG_TOKEN = void 0;
3
+ exports.DEFAULT_LOGGER_CONFIG = exports.COLORS = exports.DEFAULT_SENSITIVE_FIELDS = exports.LOGGER_EXCLUDE_METADATA = exports.LOGGER_METADATA_METADATA = exports.LOGGER_CONTEXT_METADATA = exports.LOGGER_CONFIG_TOKEN = void 0;
4
4
  exports.LOGGER_CONFIG_TOKEN = "LOGGER_CONFIG";
5
5
  exports.LOGGER_CONTEXT_METADATA = "LOGGER_CONTEXT";
6
6
  exports.LOGGER_METADATA_METADATA = "LOGGER_METADATA";
7
+ exports.LOGGER_EXCLUDE_METADATA = "LOGGER_EXCLUDE";
7
8
  exports.DEFAULT_SENSITIVE_FIELDS = [
8
9
  "password",
9
10
  "pass",
@@ -35,4 +36,5 @@ exports.DEFAULT_LOGGER_CONFIG = {
35
36
  colors: true,
36
37
  format: "text",
37
38
  sensitiveFields: exports.DEFAULT_SENSITIVE_FIELDS,
39
+ exclude: [],
38
40
  };
@@ -1,16 +1,21 @@
1
1
  import { NestInterceptor, ExecutionContext, CallHandler } from "@nestjs/common";
2
2
  import { Observable } from "rxjs";
3
+ import { Reflector } from "@nestjs/core";
3
4
  import { LoggerService } from "./logger.service";
4
5
  import { IDataSanitizer, IRequestIdGenerator } from "../contracts";
6
+ import { LoggerConfiguration } from "../types";
5
7
  export declare class HttpLoggerInterceptor implements NestInterceptor {
6
8
  private readonly logger;
7
9
  private readonly dataSanitizer;
8
10
  private readonly requestIdGenerator;
11
+ private readonly config;
12
+ private readonly reflector;
9
13
  private readonly hostname;
10
14
  private readonly pid;
11
- constructor(logger: LoggerService, dataSanitizer: IDataSanitizer, requestIdGenerator: IRequestIdGenerator);
15
+ constructor(logger: LoggerService, dataSanitizer: IDataSanitizer, requestIdGenerator: IRequestIdGenerator, config: LoggerConfiguration, reflector: Reflector);
12
16
  intercept(context: ExecutionContext, next: CallHandler): Observable<unknown>;
13
17
  private createLogEntry;
14
18
  private getClientIp;
15
19
  private sanitizeHeaders;
20
+ private shouldExcludeUrl;
16
21
  }
@@ -8,23 +8,39 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
8
8
  var __metadata = (this && this.__metadata) || function (k, v) {
9
9
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
10
  };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
11
14
  Object.defineProperty(exports, "__esModule", { value: true });
12
15
  exports.HttpLoggerInterceptor = void 0;
13
16
  const common_1 = require("@nestjs/common");
14
17
  const operators_1 = require("rxjs/operators");
18
+ const core_1 = require("@nestjs/core");
15
19
  const logger_service_1 = require("./logger.service");
20
+ const constants_1 = require("../constants");
16
21
  const os_1 = require("os");
17
22
  let HttpLoggerInterceptor = class HttpLoggerInterceptor {
18
- constructor(logger, dataSanitizer, requestIdGenerator) {
23
+ constructor(logger, dataSanitizer, requestIdGenerator, config, reflector) {
19
24
  this.logger = logger;
20
25
  this.dataSanitizer = dataSanitizer;
21
26
  this.requestIdGenerator = requestIdGenerator;
27
+ this.config = config;
28
+ this.reflector = reflector;
22
29
  this.hostname = (0, os_1.hostname)();
23
30
  this.pid = process.pid;
24
31
  }
25
32
  intercept(context, next) {
26
33
  const request = context.switchToHttp().getRequest();
27
34
  const response = context.switchToHttp().getResponse();
35
+ // Проверяем, нужно ли исключить этот URL из логирования
36
+ if (this.shouldExcludeUrl(request.url)) {
37
+ return next.handle();
38
+ }
39
+ // Проверяем, есть ли декоратор ExcludeLogging на контроллере или методе
40
+ const isExcluded = this.reflector.getAllAndOverride(constants_1.LOGGER_EXCLUDE_METADATA, [context.getHandler(), context.getClass()]);
41
+ if (isExcluded) {
42
+ return next.handle();
43
+ }
28
44
  const requestId = this.requestIdGenerator.generate();
29
45
  const startTime = Date.now();
30
46
  return next.handle().pipe((0, operators_1.tap)(() => {
@@ -89,9 +105,22 @@ let HttpLoggerInterceptor = class HttpLoggerInterceptor {
89
105
  }
90
106
  return this.dataSanitizer.sanitize(sanitized);
91
107
  }
108
+ shouldExcludeUrl(url) {
109
+ return this.config.exclude.some((excludeUrl) => {
110
+ // Поддержка простых паттернов с * (wildcard)
111
+ if (excludeUrl.includes("*")) {
112
+ const pattern = excludeUrl.replace(/\*/g, ".*");
113
+ const regex = new RegExp(`^${pattern}$`);
114
+ return regex.test(url);
115
+ }
116
+ // Точное совпадение
117
+ return url === excludeUrl;
118
+ });
119
+ }
92
120
  };
93
121
  exports.HttpLoggerInterceptor = HttpLoggerInterceptor;
94
122
  exports.HttpLoggerInterceptor = HttpLoggerInterceptor = __decorate([
95
123
  (0, common_1.Injectable)(),
96
- __metadata("design:paramtypes", [logger_service_1.LoggerService, Object, Object])
124
+ __param(3, (0, common_1.Inject)(constants_1.LOGGER_CONFIG_TOKEN)),
125
+ __metadata("design:paramtypes", [logger_service_1.LoggerService, Object, Object, Object, core_1.Reflector])
97
126
  ], HttpLoggerInterceptor);
@@ -6,6 +6,7 @@ export interface LoggerModuleOptions {
6
6
  context?: string;
7
7
  format?: "json" | "text" | "pino";
8
8
  sensitiveFields?: string[];
9
+ exclude?: string[];
9
10
  }
10
11
  export interface LoggerModuleAsyncOptions {
11
12
  useFactory: (...args: any[]) => LoggerModuleOptions | Promise<LoggerModuleOptions>;
@@ -9,6 +9,7 @@ var LoggerModule_1;
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
10
  exports.LoggerModule = void 0;
11
11
  const common_1 = require("@nestjs/common");
12
+ const core_1 = require("@nestjs/core");
12
13
  const logger_service_1 = require("./logger.service");
13
14
  const http_logger_interceptor_1 = require("./http-logger.interceptor");
14
15
  const formatter_factory_1 = require("../factories/formatter.factory");
@@ -50,6 +51,7 @@ let LoggerModule = LoggerModule_1 = class LoggerModule {
50
51
  ...constants_1.DEFAULT_LOGGER_CONFIG,
51
52
  ...options,
52
53
  sensitiveFields: options.sensitiveFields ?? constants_1.DEFAULT_LOGGER_CONFIG.sensitiveFields,
54
+ exclude: options.exclude ?? constants_1.DEFAULT_LOGGER_CONFIG.exclude,
53
55
  };
54
56
  }
55
57
  static createProviders(config) {
@@ -91,8 +93,16 @@ let LoggerModule = LoggerModule_1 = class LoggerModule {
91
93
  },
92
94
  {
93
95
  provide: http_logger_interceptor_1.HttpLoggerInterceptor,
94
- useFactory: (logger, dataSanitizer, requestIdGenerator) => new http_logger_interceptor_1.HttpLoggerInterceptor(logger, dataSanitizer, requestIdGenerator),
95
- inject: [logger_service_1.LoggerService, data_sanitizer_1.DataSanitizer, request_id_generator_1.RequestIdGenerator],
96
+ useFactory: (logger, dataSanitizer, requestIdGenerator, config) => {
97
+ const reflector = new core_1.Reflector();
98
+ return new http_logger_interceptor_1.HttpLoggerInterceptor(logger, dataSanitizer, requestIdGenerator, config, reflector);
99
+ },
100
+ inject: [
101
+ logger_service_1.LoggerService,
102
+ data_sanitizer_1.DataSanitizer,
103
+ request_id_generator_1.RequestIdGenerator,
104
+ constants_1.LOGGER_CONFIG_TOKEN,
105
+ ],
96
106
  },
97
107
  ];
98
108
  }
@@ -6,3 +6,7 @@ export declare const LogContext: (context: string) => import("@nestjs/common").C
6
6
  * Decorator to add metadata to logs
7
7
  */
8
8
  export declare const LogMetadata: (metadata: Record<string, unknown>) => import("@nestjs/common").CustomDecorator<string>;
9
+ /**
10
+ * Decorator to exclude logging for a controller or method
11
+ */
12
+ export declare const ExcludeLogging: () => import("@nestjs/common").CustomDecorator<string>;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LogMetadata = exports.LogContext = void 0;
3
+ exports.ExcludeLogging = exports.LogMetadata = exports.LogContext = void 0;
4
4
  const common_1 = require("@nestjs/common");
5
5
  const constants_1 = require("../constants");
6
6
  /**
@@ -13,3 +13,8 @@ exports.LogContext = LogContext;
13
13
  */
14
14
  const LogMetadata = (metadata) => (0, common_1.SetMetadata)(constants_1.LOGGER_METADATA_METADATA, metadata);
15
15
  exports.LogMetadata = LogMetadata;
16
+ /**
17
+ * Decorator to exclude logging for a controller or method
18
+ */
19
+ const ExcludeLogging = () => (0, common_1.SetMetadata)(constants_1.LOGGER_EXCLUDE_METADATA, true);
20
+ exports.ExcludeLogging = ExcludeLogging;
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { LoggerModule, LoggerModuleOptions, LoggerModuleAsyncOptions, } from "./core/logger.module";
2
2
  export { LoggerService } from "./core/logger.service";
3
3
  export { HttpLoggerInterceptor } from "./core/http-logger.interceptor";
4
- export { LogContext, LogMetadata } from "./decorators";
4
+ export { LogContext, LogMetadata, ExcludeLogging } from "./decorators";
5
5
  export * from "./types";
6
6
  export * from "./contracts";
package/dist/index.js CHANGED
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.LogMetadata = exports.LogContext = exports.HttpLoggerInterceptor = exports.LoggerService = exports.LoggerModule = void 0;
17
+ exports.ExcludeLogging = exports.LogMetadata = exports.LogContext = exports.HttpLoggerInterceptor = exports.LoggerService = exports.LoggerModule = void 0;
18
18
  // Core
19
19
  var logger_module_1 = require("./core/logger.module");
20
20
  Object.defineProperty(exports, "LoggerModule", { enumerable: true, get: function () { return logger_module_1.LoggerModule; } });
@@ -25,6 +25,7 @@ Object.defineProperty(exports, "HttpLoggerInterceptor", { enumerable: true, get:
25
25
  var decorators_1 = require("./decorators");
26
26
  Object.defineProperty(exports, "LogContext", { enumerable: true, get: function () { return decorators_1.LogContext; } });
27
27
  Object.defineProperty(exports, "LogMetadata", { enumerable: true, get: function () { return decorators_1.LogMetadata; } });
28
+ Object.defineProperty(exports, "ExcludeLogging", { enumerable: true, get: function () { return decorators_1.ExcludeLogging; } });
28
29
  // Types
29
30
  __exportStar(require("./types"), exports);
30
31
  // Contracts
@@ -42,6 +42,7 @@ export interface LoggerConfiguration {
42
42
  readonly context?: string;
43
43
  readonly format: LogFormat;
44
44
  readonly sensitiveFields: readonly string[];
45
+ readonly exclude: readonly string[];
45
46
  }
46
47
  export interface FormatterOptions {
47
48
  readonly colors: boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@globalart/nestjs-logger",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "A advanced logger for NestJS",
5
5
  "author": {
6
6
  "name": "GlobalArt, Inc"