@rsdk/logging 5.10.0 → 5.10.1-next.1

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.
@@ -0,0 +1,2 @@
1
+ import 'reflect-metadata';
2
+ export declare const LogSerializer: () => ClassDecorator;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LogSerializer = void 0;
4
+ require("reflect-metadata");
5
+ const constants_1 = require("../metadata/constants");
6
+ const logger_metadata_registry_1 = require("../metadata/logger-metadata.registry");
7
+ const logSerializerDecorator = function (
8
+ // eslint-disable-next-line @typescript-eslint/ban-types
9
+ target) {
10
+ const metadata = {
11
+ target: target,
12
+ };
13
+ Reflect.defineMetadata(constants_1.LOGGER_METADATA_KEY, metadata, target);
14
+ logger_metadata_registry_1.LoggerMetadataRegistry.registerSerializer(target, metadata);
15
+ };
16
+ const LogSerializer = () => logSerializerDecorator;
17
+ exports.LogSerializer = LogSerializer;
18
+ //# sourceMappingURL=log-serializer.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-serializer.decorator.js","sourceRoot":"","sources":["../../src/decorators/log-serializer.decorator.ts"],"names":[],"mappings":";;;AAEA,4BAA0B;AAE1B,qDAA4D;AAC5D,mFAA8E;AAG9E,MAAM,sBAAsB,GAAmB;AAC7C,wDAAwD;AACxD,MAAgB;IAEhB,MAAM,QAAQ,GAA6B;QACzC,MAAM,EAAE,MAAqB;KAC9B,CAAC;IAEF,OAAO,CAAC,cAAc,CAAC,+BAAmB,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC9D,iDAAsB,CAAC,kBAAkB,CAAC,MAAqB,EAAE,QAAQ,CAAC,CAAC;AAC7E,CAAC,CAAC;AAEK,MAAM,aAAa,GAAG,GAAmB,EAAE,CAAC,sBAAsB,CAAC;AAA7D,QAAA,aAAa,iBAAgD"}
@@ -1,6 +1,6 @@
1
1
  import type { ErrorLike } from '@rsdk/common';
2
2
  import type { Logger as Pino } from 'pino';
3
- import type { ILogger } from '../logger.interface';
3
+ import type { ILogger, LogSerializerBase } from '../logger.interface';
4
4
  import type { LoggingContext, OnMessage, Params } from '../types';
5
5
  import { LogLevel } from '../types';
6
6
  /**
@@ -16,7 +16,8 @@ export declare class PinoLogger implements ILogger {
16
16
  */
17
17
  private readonly _pino;
18
18
  private readonly emit;
19
- constructor(pino: GetLogger, emit: OnMessage, context: LoggingContext);
19
+ private readonly getSerializers;
20
+ constructor(pino: GetLogger, emit: OnMessage, context: LoggingContext, getSerializers: () => LogSerializerBase[]);
20
21
  get pino(): Pino;
21
22
  trace(params: Params): void;
22
23
  trace(message: string, params?: Params): void;
@@ -11,10 +11,12 @@ class PinoLogger {
11
11
  */
12
12
  _pino;
13
13
  emit;
14
- constructor(pino, emit, context) {
14
+ getSerializers;
15
+ constructor(pino, emit, context, getSerializers) {
15
16
  this._pino = pino;
16
17
  this.emit = emit;
17
18
  this.context = (0, helpers_1.stringifyContext)(context);
19
+ this.getSerializers = getSerializers;
18
20
  }
19
21
  get pino() {
20
22
  return this._pino();
@@ -53,18 +55,40 @@ class PinoLogger {
53
55
  }
54
56
  const paramsOrError = typeof arg1 === 'string' ? arg2 : arg1;
55
57
  if (paramsOrError) {
56
- const options = {
57
- sortKeys: common_1.sortErrorKeys,
58
- };
59
58
  if (level === 'fatal' || level === 'error') {
60
- args['error'] = (0, common_1.normalizer)()(paramsOrError, options);
59
+ args.error = paramsOrError;
61
60
  }
62
61
  else {
63
- Object.assign(args, (0, common_1.normalizer)()(paramsOrError, options));
62
+ Object.assign(args, paramsOrError);
64
63
  }
65
64
  }
66
- this.emit(level, { ...args, message });
67
- this.pino[level](args, message);
65
+ if (message) {
66
+ args.message = message;
67
+ }
68
+ const serializers = this.getSerializers();
69
+ for (const [key, value] of Object.entries(args)) {
70
+ // Пропускаем ненужные поля
71
+ if (key === 'context' || key === 'message')
72
+ continue;
73
+ if (value == null || typeof value !== 'object')
74
+ continue;
75
+ for (const serializer of serializers) {
76
+ try {
77
+ // eslint-disable-next-line unicorn/prefer-regexp-test
78
+ if (serializer.match(value)) {
79
+ const serialized = serializer.serialize(value);
80
+ if (serialized && typeof serialized === 'object') {
81
+ args[key] = serialized;
82
+ }
83
+ // Можно прервать цикл — нашли нужный сериалайзер
84
+ break;
85
+ }
86
+ }
87
+ catch { }
88
+ }
89
+ }
90
+ this.emit(level, args);
91
+ this.pino[level](args);
68
92
  }
69
93
  }
70
94
  exports.PinoLogger = PinoLogger;
@@ -1 +1 @@
1
- {"version":3,"file":"pino-logger.class.js","sourceRoot":"","sources":["../../src/implementations/pino-logger.class.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pino-logger.class.js","sourceRoot":"","sources":["../../src/implementations/pino-logger.class.ts"],"names":[],"mappings":";;;AACA,yCAA2C;AAG3C,wCAA8C;AAG9C,oCAAoC;AAUpC,MAAa,UAAU;IACJ,OAAO,CAAS;IAEjC;;OAEG;IACc,KAAK,CAAY;IACjB,IAAI,CAAY;IAChB,cAAc,CAA4B;IAE3D,YACE,IAAe,EACf,IAAe,EACf,OAAuB,EACvB,cAAyC;QAEzC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,IAAA,0BAAgB,EAAC,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAID,KAAK,CAAC,IAAqB,EAAE,MAAe;QAC1C,IAAI,CAAC,GAAG,CAAC,gBAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC;IAID,KAAK,CAAC,IAAqB,EAAE,MAAe;QAC1C,IAAI,CAAC,GAAG,CAAC,gBAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,MAAe;QACnC,IAAI,CAAC,GAAG,CAAC,gBAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAKD,IAAI,CAAC,IAAwB,EAAE,IAAyB;QACtD,IAAI,CAAC,GAAG,CAAC,gBAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IAKD,KAAK,CAAC,IAAoB,EAAE,IAAgB;QAC1C,IAAI,CAAC,GAAG,CAAC,gBAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC;IAKD,KAAK,CAAC,IAAoB,EAAE,IAAgB;QAC1C,IAAI,CAAC,GAAG,CAAC,gBAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC;IAeD,GAAG,CACD,KAAe,EACf,IAAiC,EACjC,IAAyB;QAEzB,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACxD,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAwB;YAChC,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC;QAEF,IAAI,OAAO,GAAuB,SAAS,CAAC;QAE5C,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;aAAM,IAAI,IAAA,oBAAW,EAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QACzB,CAAC;QAED,MAAM,aAAa,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7D,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;gBAC3C,IAAI,CAAC,KAAK,GAAG,aAAa,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACzB,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAE1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,2BAA2B;YAC3B,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS;gBAAE,SAAS;YACrD,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,SAAS;YAEzD,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;gBACrC,IAAI,CAAC;oBACH,sDAAsD;oBACtD,IAAI,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC5B,MAAM,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;wBAC/C,IAAI,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;4BACjD,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;wBACzB,CAAC;wBAED,iDAAiD;wBACjD,MAAM;oBACR,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;YACZ,CAAC;QACH,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACvB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;CACF;AAxID,gCAwIC"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export { DEFAULT_LEVEL } from './defaults';
2
- export * from './implementations';
3
- export * from './types';
4
- export * from './logger.interface';
5
- export * from './helpers';
6
- export * from './logger.factory';
2
+ export { PinoLogger } from './implementations/pino-logger.class';
3
+ export { LogLevel, Params, LoggerOptions, LoggingContext, OnMessage, LoggerSerializerMetadata, LogTimestampFormat, } from './types';
4
+ export { ILogger, ILogSerializer, LogSerializerBase } from './logger.interface';
5
+ export { stringifyContext } from './helpers';
6
+ export { LoggerFactory } from './logger.factory';
7
+ export { LogSerializer } from './decorators/log-serializer.decorator';
package/dist/index.js CHANGED
@@ -1,25 +1,17 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
2
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.DEFAULT_LEVEL = void 0;
3
+ exports.LogSerializer = exports.LoggerFactory = exports.stringifyContext = exports.LogTimestampFormat = exports.LogLevel = exports.PinoLogger = exports.DEFAULT_LEVEL = void 0;
18
4
  var defaults_1 = require("./defaults");
19
5
  Object.defineProperty(exports, "DEFAULT_LEVEL", { enumerable: true, get: function () { return defaults_1.DEFAULT_LEVEL; } });
20
- __exportStar(require("./implementations"), exports);
21
- __exportStar(require("./types"), exports);
22
- __exportStar(require("./logger.interface"), exports);
23
- __exportStar(require("./helpers"), exports);
24
- __exportStar(require("./logger.factory"), exports);
6
+ var pino_logger_class_1 = require("./implementations/pino-logger.class");
7
+ Object.defineProperty(exports, "PinoLogger", { enumerable: true, get: function () { return pino_logger_class_1.PinoLogger; } });
8
+ var types_1 = require("./types");
9
+ Object.defineProperty(exports, "LogLevel", { enumerable: true, get: function () { return types_1.LogLevel; } });
10
+ Object.defineProperty(exports, "LogTimestampFormat", { enumerable: true, get: function () { return types_1.LogTimestampFormat; } });
11
+ var helpers_1 = require("./helpers");
12
+ Object.defineProperty(exports, "stringifyContext", { enumerable: true, get: function () { return helpers_1.stringifyContext; } });
13
+ var logger_factory_1 = require("./logger.factory");
14
+ Object.defineProperty(exports, "LoggerFactory", { enumerable: true, get: function () { return logger_factory_1.LoggerFactory; } });
15
+ var log_serializer_decorator_1 = require("./decorators/log-serializer.decorator");
16
+ Object.defineProperty(exports, "LogSerializer", { enumerable: true, get: function () { return log_serializer_decorator_1.LogSerializer; } });
25
17
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,uCAA2C;AAAlC,yGAAA,aAAa,OAAA;AAEtB,oDAAkC;AAClC,0CAAwB;AACxB,qDAAmC;AACnC,4CAA0B;AAC1B,mDAAiC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,uCAA2C;AAAlC,yGAAA,aAAa,OAAA;AAEtB,yEAAiE;AAAxD,+GAAA,UAAU,OAAA;AACnB,iCAQiB;AAPf,iGAAA,QAAQ,OAAA;AAMR,2GAAA,kBAAkB,OAAA;AAGpB,qCAA6C;AAApC,2GAAA,gBAAgB,OAAA;AACzB,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AACtB,kFAAsE;AAA7D,yHAAA,aAAa,OAAA"}
@@ -1,11 +1,13 @@
1
- import type { ILogger } from './logger.interface';
1
+ import type { ILogger, LogSerializerBase } from './logger.interface';
2
2
  import type { LoggerOptions, LoggingContext, OnMessage } from './types';
3
3
  /**
4
4
  * TODO: Дополнить доку
5
5
  * Фабрика является статической потому что
6
6
  */
7
7
  export declare class LoggerFactory {
8
- private static events;
8
+ private static readonly events;
9
+ private static opts;
10
+ private static pinoTimestampFormatMap;
9
11
  /**
10
12
  * Under the hood every logger instance will use this
11
13
  * static instance. Motivation for this is that it's much
@@ -16,7 +18,11 @@ export declare class LoggerFactory {
16
18
  * loggers (which are no used anywhere yet)
17
19
  */
18
20
  private static _globalPino;
19
- private static opts;
21
+ private static _serializers;
22
+ /** Ссылка на активный worker-транспорт для закрытия его воркеров. */
23
+ private static _activeTransport;
24
+ /** Конфиг, по которому собран _activeTransport (для переиспользования воркера). */
25
+ private static _activeTransportConfig;
20
26
  /**
21
27
  * Переконфигурация pino нужна потому, что изначально логгер инициализируется
22
28
  * с дефолтными настройками, т. к. конфигурация ещё не прочитана.
@@ -41,7 +47,58 @@ export declare class LoggerFactory {
41
47
  * при помощи cli - можно немного упростить архитектуру
42
48
  */
43
49
  static applyInstrumentations<T extends Record<string, any>>(logHookFunction?: (record: T) => void): void;
50
+ /**
51
+ * Сливает буфер worker-транспорта и завершает его воркеры. Без вызова на
52
+ * остановке приложения забуференные логи теряются, а воркеры висят.
53
+ */
54
+ static shutdown(timeoutMs?: number): Promise<void>;
44
55
  static onMessage(handler: OnMessage): void;
45
56
  static create(context: LoggingContext): ILogger;
57
+ static getSerializers(): LogSerializerBase[];
58
+ /**
59
+ * Manually set a serializer instance. Useful when using without DI.
60
+ * @param {string} name Unique name for the serializer
61
+ * @param {LogSerializerBase} serializer Serializer instance
62
+ */
63
+ static setSerializer(name: string, serializer: LogSerializerBase): void;
64
+ /**
65
+ * Remove a serializer by name.
66
+ * @param {string} name Name of the serializer to remove
67
+ * @returns {boolean} true if the serializer was removed, false if it didn't exist
68
+ */
69
+ static deleteSerializer(name: string): boolean;
70
+ /**
71
+ * Check if a serializer exists by name.
72
+ * @param {string} name Name of the serializer to check
73
+ * @returns {boolean} true if the serializer exists, false otherwise
74
+ */
75
+ static hasSerializer(name: string): boolean;
46
76
  private static applyOptions;
77
+ /**
78
+ * `stream`/`transport` исключаем из опций: способ доставки задаётся вторым
79
+ * аргументом `pino()`, а pino запрещает одновременно `transport` в опциях и
80
+ * stream-аргумент.
81
+ */
82
+ private static buildPinoOptions;
83
+ /**
84
+ * Создаёт инстанс pino. Воркер транспорта переиспользуется, если объект
85
+ * конфига транспорта тот же по ссылке (сравнение identity, не по значению).
86
+ * Это покрывает связку reconfigure→applyInstrumentations (между ними
87
+ * this.opts.transport не пересобирается) и не даёт пересоздавать и тут же
88
+ * закрывать только что поднятый, возможно медленный, OTEL-воркер. Новый
89
+ * объект конфига (например, при config.onUpdate) ожидаемо пересоздаёт воркер.
90
+ */
91
+ private static instantiatePino;
92
+ /**
93
+ * Поднимает worker-транспорт, закрыв предыдущий. Обработчик 'error' не даёт
94
+ * асинхронной ошибке воркера уронить процесс, но делает её видимой в stderr
95
+ * (сам логгер использовать нельзя — упал его транспорт). Ошибку резолва
96
+ * таргета pino.transport(...) бросает синхронно — она долетает до старта.
97
+ */
98
+ private static createTransport;
99
+ /**
100
+ * Завершает воркеры предыдущего транспорта (best-effort, не блокируя). stdout
101
+ * не затрагивается: для него хэндл не сохраняется.
102
+ */
103
+ private static disposeActiveTransport;
47
104
  }
@@ -1,16 +1,17 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.LoggerFactory = void 0;
7
- const node_events_1 = __importDefault(require("node:events"));
4
+ const node_events_1 = require("node:events");
5
+ const logger_metadata_registry_1 = require("./metadata/logger-metadata.registry");
8
6
  const defaults_1 = require("./defaults");
9
7
  const implementations_1 = require("./implementations");
8
+ const types_1 = require("./types");
9
+ const DEFAULT_SHUTDOWN_TIMEOUT_MS = 1000;
10
10
  /**
11
11
  * ATTENTION: require('pino') тут не просто так, в общем они нужны для корректной работы хуков из `@opentelemetry/instrumentation-pino`
12
12
  */
13
13
  const requirePino = () => {
14
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
14
15
  return require('pino');
15
16
  };
16
17
  /**
@@ -19,7 +20,19 @@ const requirePino = () => {
19
20
  */
20
21
  class LoggerFactory {
21
22
  // eslint-disable-next-line unicorn/prefer-event-target
22
- static events = new node_events_1.default();
23
+ static events = new node_events_1.EventEmitter();
24
+ static opts = {
25
+ level: defaults_1.DEFAULT_LEVEL,
26
+ redact: [],
27
+ stream: requirePino().destination(),
28
+ timestampFormat: types_1.LogTimestampFormat.isoTime,
29
+ };
30
+ static pinoTimestampFormatMap = {
31
+ [types_1.LogTimestampFormat.epochTime]: requirePino().stdTimeFunctions.epochTime,
32
+ [types_1.LogTimestampFormat.unixTime]: requirePino().stdTimeFunctions.unixTime,
33
+ [types_1.LogTimestampFormat.nullTime]: requirePino().stdTimeFunctions.nullTime,
34
+ [types_1.LogTimestampFormat.isoTime]: requirePino().stdTimeFunctions.isoTime,
35
+ };
23
36
  /**
24
37
  * Under the hood every logger instance will use this
25
38
  * static instance. Motivation for this is that it's much
@@ -29,15 +42,16 @@ class LoggerFactory {
29
42
  * Downside is that the idea is not composable with child
30
43
  * loggers (which are no used anywhere yet)
31
44
  */
32
- // eslint-disable-next-line @typescript-eslint/no-var-requires
45
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
33
46
  static _globalPino = requirePino()({
34
47
  level: defaults_1.DEFAULT_LEVEL,
48
+ timestamp: this.pinoTimestampFormatMap[this.opts.timestampFormat],
35
49
  });
36
- static opts = {
37
- level: defaults_1.DEFAULT_LEVEL,
38
- redact: [],
39
- stream: requirePino().destination(),
40
- };
50
+ static _serializers = null;
51
+ /** Ссылка на активный worker-транспорт для закрытия его воркеров. */
52
+ static _activeTransport = null;
53
+ /** Конфиг, по которому собран _activeTransport (для переиспользования воркера). */
54
+ static _activeTransportConfig = null;
41
55
  /**
42
56
  * Переконфигурация pino нужна потому, что изначально логгер инициализируется
43
57
  * с дефолтными настройками, т. к. конфигурация ещё не прочитана.
@@ -47,8 +61,7 @@ class LoggerFactory {
47
61
  */
48
62
  static reconfigure(opts) {
49
63
  this.applyOptions(opts);
50
- const { stream, ...other } = this.opts;
51
- this._globalPino = requirePino()(other, stream);
64
+ this._globalPino = this.instantiatePino();
52
65
  }
53
66
  /**
54
67
  * Этот метод должен быть вызван после того, как подключен instrumentation-pino.
@@ -66,10 +79,7 @@ class LoggerFactory {
66
79
  * при помощи cli - можно немного упростить архитектуру
67
80
  */
68
81
  static applyInstrumentations(logHookFunction) {
69
- const { stream, ...other } = this.opts;
70
- // eslint-disable-next-line @typescript-eslint/no-var-requires
71
- this._globalPino = requirePino()({
72
- ...other,
82
+ this._globalPino = this.instantiatePino({
73
83
  /**
74
84
  * Функция которая позволяет добавить дополнительные данные в логи Pino
75
85
  */
@@ -79,31 +89,198 @@ class LoggerFactory {
79
89
  * Реализация взята с официальной документации
80
90
  * https://getpino.io/#/docs/api?id=logmethod
81
91
  */
82
- logMethod: function (inputArgs,
83
92
  // eslint-disable-next-line @typescript-eslint/ban-types
84
- method) {
85
- if (inputArgs.length >= 2) {
86
- const arg1 = inputArgs.shift() || {};
87
- const arg2 = inputArgs.shift();
93
+ logMethod: function (inputArgs, method) {
94
+ const arg1 = inputArgs[0];
95
+ if (arg1 && typeof arg1 === 'object') {
88
96
  logHookFunction(arg1);
89
- // eslint-disable-next-line unicorn/prefer-reflect-apply
90
- return method.apply(this, [arg1, arg2, ...inputArgs]);
91
97
  }
98
+ // eslint-disable-next-line unicorn/prefer-reflect-apply
92
99
  return method.apply(this, inputArgs);
93
100
  },
94
101
  }
95
102
  : {},
96
- }, stream);
103
+ });
104
+ }
105
+ /**
106
+ * Сливает буфер worker-транспорта и завершает его воркеры. Без вызова на
107
+ * остановке приложения забуференные логи теряются, а воркеры висят.
108
+ */
109
+ static async shutdown(timeoutMs = DEFAULT_SHUTDOWN_TIMEOUT_MS) {
110
+ const stream = this._activeTransport;
111
+ if (!stream)
112
+ return;
113
+ this._activeTransport = null;
114
+ this._activeTransportConfig = null;
115
+ await new Promise((resolve) => {
116
+ let settled = false;
117
+ const finish = () => {
118
+ if (settled)
119
+ return;
120
+ settled = true;
121
+ resolve();
122
+ };
123
+ try {
124
+ stream.on('close', finish);
125
+ stream.flush(() => stream.end());
126
+ }
127
+ catch {
128
+ finish();
129
+ }
130
+ const timer = setTimeout(finish, timeoutMs);
131
+ timer.unref?.();
132
+ });
97
133
  }
98
134
  static onMessage(handler) {
99
135
  this.events.on('msg', handler);
100
136
  }
101
137
  static create(context) {
102
- return new implementations_1.PinoLogger(() => this._globalPino, (level, data) => this.events.emit('msg', level, data), context);
138
+ return new implementations_1.PinoLogger(() => this._globalPino, (level, data) => this.events.emit('msg', level, data), context, () => this.getSerializers());
139
+ }
140
+ static getSerializers() {
141
+ if (this._serializers)
142
+ return Array.from(this._serializers.values());
143
+ const metas = logger_metadata_registry_1.LoggerMetadataRegistry.getSerializers();
144
+ this._serializers = new Map();
145
+ for (const meta of metas) {
146
+ try {
147
+ const instance = Reflect.construct(meta.target, []);
148
+ const serializerName = meta.target.name || meta.target.constructor.name;
149
+ this._serializers.set(serializerName, instance);
150
+ }
151
+ catch { }
152
+ }
153
+ return Array.from(this._serializers.values());
154
+ }
155
+ /**
156
+ * Manually set a serializer instance. Useful when using without DI.
157
+ * @param {string} name Unique name for the serializer
158
+ * @param {LogSerializerBase} serializer Serializer instance
159
+ */
160
+ static setSerializer(name, serializer) {
161
+ this._serializers ??= new Map();
162
+ this._serializers.set(name, serializer);
163
+ }
164
+ /**
165
+ * Remove a serializer by name.
166
+ * @param {string} name Name of the serializer to remove
167
+ * @returns {boolean} true if the serializer was removed, false if it didn't exist
168
+ */
169
+ static deleteSerializer(name) {
170
+ if (!this._serializers)
171
+ return false;
172
+ return this._serializers.delete(name);
173
+ }
174
+ /**
175
+ * Check if a serializer exists by name.
176
+ * @param {string} name Name of the serializer to check
177
+ * @returns {boolean} true if the serializer exists, false otherwise
178
+ */
179
+ static hasSerializer(name) {
180
+ if (!this._serializers)
181
+ return false;
182
+ return this._serializers.has(name);
103
183
  }
104
184
  static applyOptions(opts) {
105
- const { redact, level, stream = requirePino().destination() } = opts || {};
106
- Object.assign(this.opts, { redact, level: level ?? defaults_1.DEFAULT_LEVEL, stream });
185
+ const { redact, level, stream, transport, timestampFormat } = opts || {};
186
+ const base = {
187
+ redact: redact ?? this.opts.redact ?? [],
188
+ level: level ?? defaults_1.DEFAULT_LEVEL,
189
+ timestampFormat: timestampFormat ?? types_1.LogTimestampFormat.isoTime,
190
+ };
191
+ /**
192
+ * Выбираем ровно один способ доставки. Если ни stream, ни transport не
193
+ * переданы — сохраняем текущий, чтобы частичный reconfigure({ level }) не
194
+ * сбрасывал ранее заданный transport.
195
+ */
196
+ if (transport) {
197
+ this.opts = { ...base, transport };
198
+ }
199
+ else if (stream) {
200
+ this.opts = { ...base, stream };
201
+ }
202
+ else if (this.opts.transport) {
203
+ this.opts = { ...base, transport: this.opts.transport };
204
+ }
205
+ else {
206
+ this.opts = {
207
+ ...base,
208
+ stream: this.opts.stream ?? requirePino().destination(),
209
+ };
210
+ }
211
+ }
212
+ /**
213
+ * `stream`/`transport` исключаем из опций: способ доставки задаётся вторым
214
+ * аргументом `pino()`, а pino запрещает одновременно `transport` в опциях и
215
+ * stream-аргумент.
216
+ */
217
+ static buildPinoOptions(extra = {}) {
218
+ const { timestampFormat, stream: _stream, transport: _transport, ...other } = this.opts;
219
+ return {
220
+ ...other,
221
+ timestamp: this.pinoTimestampFormatMap[timestampFormat],
222
+ ...extra,
223
+ };
224
+ }
225
+ /**
226
+ * Создаёт инстанс pino. Воркер транспорта переиспользуется, если объект
227
+ * конфига транспорта тот же по ссылке (сравнение identity, не по значению).
228
+ * Это покрывает связку reconfigure→applyInstrumentations (между ними
229
+ * this.opts.transport не пересобирается) и не даёт пересоздавать и тут же
230
+ * закрывать только что поднятый, возможно медленный, OTEL-воркер. Новый
231
+ * объект конфига (например, при config.onUpdate) ожидаемо пересоздаёт воркер.
232
+ */
233
+ static instantiatePino(extra = {}) {
234
+ const pino = requirePino();
235
+ const options = this.buildPinoOptions(extra);
236
+ if (!this.opts.transport) {
237
+ this.disposeActiveTransport();
238
+ return pino(options, this.opts.stream);
239
+ }
240
+ const reuse = this._activeTransport &&
241
+ this.opts.transport === this._activeTransportConfig;
242
+ const stream = reuse
243
+ ? this._activeTransport
244
+ : this.createTransport(this.opts.transport);
245
+ return pino(options, stream);
246
+ }
247
+ /**
248
+ * Поднимает worker-транспорт, закрыв предыдущий. Обработчик 'error' не даёт
249
+ * асинхронной ошибке воркера уронить процесс, но делает её видимой в stderr
250
+ * (сам логгер использовать нельзя — упал его транспорт). Ошибку резолва
251
+ * таргета pino.transport(...) бросает синхронно — она долетает до старта.
252
+ */
253
+ static createTransport(transport) {
254
+ this.disposeActiveTransport();
255
+ const stream = requirePino().transport(transport);
256
+ stream.on('error', (...args) => {
257
+ const error = args[0];
258
+ const message = error instanceof Error ? error.message : String(error);
259
+ process.stderr.write(`[@rsdk/logging] transport error: ${message}\n`);
260
+ });
261
+ this._activeTransport = stream;
262
+ this._activeTransportConfig = transport;
263
+ return stream;
264
+ }
265
+ /**
266
+ * Завершает воркеры предыдущего транспорта (best-effort, не блокируя). stdout
267
+ * не затрагивается: для него хэндл не сохраняется.
268
+ */
269
+ static disposeActiveTransport() {
270
+ const previous = this._activeTransport;
271
+ if (!previous)
272
+ return;
273
+ this._activeTransport = null;
274
+ this._activeTransportConfig = null;
275
+ // на teardown ошибки ожидаемы (например, "end() took too long" у медленных
276
+ // транспортов) — глушим их молча и не держим event loop
277
+ previous.unref?.();
278
+ previous.removeAllListeners?.('error');
279
+ previous.on('error', () => { });
280
+ try {
281
+ previous.end();
282
+ }
283
+ catch { }
107
284
  }
108
285
  }
109
286
  exports.LoggerFactory = LoggerFactory;
@@ -1 +1 @@
1
- {"version":3,"file":"logger.factory.js","sourceRoot":"","sources":["../src/logger.factory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logger.factory.js","sourceRoot":"","sources":["../src/logger.factory.ts"],"names":[],"mappings":"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"}
@@ -29,3 +29,8 @@ export interface ILogger {
29
29
  log(level: LogLevel, message: string, params?: Params): void;
30
30
  log(level: LogLevel, message: string, error?: ErrorLike): void;
31
31
  }
32
+ export interface ILogSerializer<TEntry, TSerialized> {
33
+ match(entry: unknown): entry is TEntry;
34
+ serialize(entry: TEntry): TSerialized;
35
+ }
36
+ export type LogSerializerBase = ILogSerializer<unknown, unknown>;
@@ -0,0 +1 @@
1
+ export declare const LOGGER_METADATA_KEY: unique symbol;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LOGGER_METADATA_KEY = void 0;
4
+ exports.LOGGER_METADATA_KEY = Symbol('LOGGER_METADATA_KEY');
5
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/metadata/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,mBAAmB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { Constructor } from '@rsdk/common';
2
+ import type { LoggerSerializerMetadata } from '../types';
3
+ export declare class LoggerMetadataRegistry {
4
+ private static readonly serializers;
5
+ static registerSerializer(target: Constructor, metadata: LoggerSerializerMetadata): void;
6
+ static getSerializers(): LoggerSerializerMetadata[];
7
+ }
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LoggerMetadataRegistry = void 0;
4
+ class LoggerMetadataRegistry {
5
+ static serializers = new Map();
6
+ static registerSerializer(target, metadata) {
7
+ this.serializers.set(target, metadata);
8
+ }
9
+ static getSerializers() {
10
+ return Array.from(this.serializers.values());
11
+ }
12
+ }
13
+ exports.LoggerMetadataRegistry = LoggerMetadataRegistry;
14
+ //# sourceMappingURL=logger-metadata.registry.js.map