@lark-apaas/nestjs-logger 1.0.2 → 1.0.3-alpha.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.
package/LICENSE ADDED
@@ -0,0 +1,13 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Lark Technologies Pte. Ltd. and/or its affiliates
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted,provided that the above copyright notice and this permission notice appear in all copies.
6
+
7
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
8
+ IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
9
+ INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
10
+ EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
11
+ CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
12
+ DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
13
+ ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
package/dist/index.cjs CHANGED
@@ -14381,17 +14381,15 @@ __export(index_exports, {
14381
14381
  module.exports = __toCommonJS(index_exports);
14382
14382
 
14383
14383
  // src/service/app-logger.service.ts
14384
- var import_common2 = require("@nestjs/common");
14385
- var import_util = require("util");
14384
+ var import_common = require("@nestjs/common");
14386
14385
 
14387
14386
  // src/helper/constants.ts
14388
14387
  var PINO_ROOT_LOGGER = Symbol("PINO_ROOT_LOGGER");
14389
14388
  var TRACE_LOGGER = Symbol("TRACE_LOGGER");
14390
14389
  var METRICS_LOGGER = Symbol("METRICS_LOGGER");
14391
14390
 
14392
- // src/service/request-context.service.ts
14393
- var import_common = require("@nestjs/common");
14394
- var import_async_hooks = require("async_hooks");
14391
+ // src/service/app-logger.service.ts
14392
+ var import_nestjs_common = require("@lark-apaas/nestjs-common");
14395
14393
  function _ts_decorate(decorators, target, key, desc) {
14396
14394
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
14397
14395
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -14399,43 +14397,6 @@ function _ts_decorate(decorators, target, key, desc) {
14399
14397
  return c > 3 && r && Object.defineProperty(target, key, r), r;
14400
14398
  }
14401
14399
  __name(_ts_decorate, "_ts_decorate");
14402
- var RequestContextService = class {
14403
- static {
14404
- __name(this, "RequestContextService");
14405
- }
14406
- storage = new import_async_hooks.AsyncLocalStorage();
14407
- run(context, callback) {
14408
- const store = {
14409
- ...context
14410
- };
14411
- return this.storage.run(store, callback);
14412
- }
14413
- setContext(partial) {
14414
- const store = this.storage.getStore();
14415
- if (!store) {
14416
- return;
14417
- }
14418
- Object.assign(store, partial);
14419
- }
14420
- getContext() {
14421
- return this.storage.getStore();
14422
- }
14423
- get(key) {
14424
- return this.storage.getStore()?.[key];
14425
- }
14426
- };
14427
- RequestContextService = _ts_decorate([
14428
- (0, import_common.Injectable)()
14429
- ], RequestContextService);
14430
-
14431
- // src/service/app-logger.service.ts
14432
- function _ts_decorate2(decorators, target, key, desc) {
14433
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
14434
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
14435
- 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;
14436
- return c > 3 && r && Object.defineProperty(target, key, r), r;
14437
- }
14438
- __name(_ts_decorate2, "_ts_decorate");
14439
14400
  function _ts_metadata(k, v) {
14440
14401
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
14441
14402
  }
@@ -14543,10 +14504,12 @@ var BasePinoLogger = class _BasePinoLogger {
14543
14504
  }
14544
14505
  logger;
14545
14506
  contextStore;
14507
+ observableService;
14546
14508
  levelState = new LogLevelState();
14547
- constructor(logger, contextStore) {
14509
+ constructor(logger, contextStore, observableService) {
14548
14510
  this.logger = logger;
14549
14511
  this.contextStore = contextStore;
14512
+ this.observableService = observableService;
14550
14513
  const pinoLevel = this.logger.level;
14551
14514
  const nestLevels = LogLevelState.fromPinoLevel(pinoLevel);
14552
14515
  this.levelState.set(nestLevels);
@@ -14610,6 +14573,26 @@ var BasePinoLogger = class _BasePinoLogger {
14610
14573
  const { context, stack, extras } = this.extractOptionalParams(optionalParams, treatStack);
14611
14574
  const requestState = this.contextStore.getContext();
14612
14575
  const traceId = requestState?.requestId ?? null;
14576
+ const flatObject = /* @__PURE__ */ __name((extra) => {
14577
+ let res = {};
14578
+ try {
14579
+ extra.forEach((item) => {
14580
+ if (typeof item === "object" && item !== null) {
14581
+ res = {
14582
+ ...res,
14583
+ ...item
14584
+ };
14585
+ }
14586
+ });
14587
+ delete res.message;
14588
+ delete res.level;
14589
+ delete res.time;
14590
+ delete res.context;
14591
+ return res;
14592
+ } catch {
14593
+ }
14594
+ }, "flatObject");
14595
+ const processedExtra = flatObject(extras);
14613
14596
  const payload = {
14614
14597
  trace_id: traceId,
14615
14598
  path: requestState?.path,
@@ -14617,12 +14600,13 @@ var BasePinoLogger = class _BasePinoLogger {
14617
14600
  user_id: requestState?.userId ?? null,
14618
14601
  app_id: requestState?.appId ?? null,
14619
14602
  tenant_id: requestState?.tenantId ?? null,
14620
- pid: process.pid
14603
+ pid: process.pid,
14604
+ ...processedExtra
14621
14605
  };
14622
14606
  if (context) {
14623
14607
  payload.context = context;
14624
14608
  }
14625
- const { messageText, stack: computedStack, data } = this.buildMessagePayload(message, extras);
14609
+ const { messageText, stack: computedStack, data } = this.buildMessagePayload(message);
14626
14610
  if (stack) {
14627
14611
  payload.stack = stack;
14628
14612
  } else if (computedStack) {
@@ -14633,10 +14617,14 @@ var BasePinoLogger = class _BasePinoLogger {
14633
14617
  }
14634
14618
  const pinoLevel = mapLogLevelToPino(level);
14635
14619
  const sanitizedPayload = sanitizeValue(payload);
14636
- if (messageText) {
14637
- this.logger[pinoLevel](sanitizedPayload, messageText);
14620
+ if (process.env.NODE_ENV === "development") {
14621
+ if (messageText) {
14622
+ this.logger[pinoLevel](sanitizedPayload, messageText);
14623
+ } else {
14624
+ this.logger[pinoLevel](sanitizedPayload);
14625
+ }
14638
14626
  } else {
14639
- this.logger[pinoLevel](sanitizedPayload);
14627
+ this.observableService.log(level, messageText ?? "", payload);
14640
14628
  }
14641
14629
  }
14642
14630
  extractOptionalParams(optionalParams, treatStack) {
@@ -14665,7 +14653,7 @@ var BasePinoLogger = class _BasePinoLogger {
14665
14653
  extras: params
14666
14654
  };
14667
14655
  }
14668
- buildMessagePayload(message, extras) {
14656
+ buildMessagePayload(message) {
14669
14657
  if (message instanceof Error) {
14670
14658
  return {
14671
14659
  messageText: message.message,
@@ -14673,17 +14661,8 @@ var BasePinoLogger = class _BasePinoLogger {
14673
14661
  };
14674
14662
  }
14675
14663
  if (typeof message === "string") {
14676
- if (extras.length === 0) {
14677
- return {
14678
- messageText: message
14679
- };
14680
- }
14681
- const allMessages = [
14682
- message,
14683
- ...extras.map((e) => stringifyParam(e))
14684
- ].join(" ");
14685
14664
  return {
14686
- messageText: allMessages
14665
+ messageText: message
14687
14666
  };
14688
14667
  }
14689
14668
  if (typeof message === "object" && message !== null) {
@@ -14706,18 +14685,20 @@ var AppLogger = class extends BasePinoLogger {
14706
14685
  static {
14707
14686
  __name(this, "AppLogger");
14708
14687
  }
14709
- constructor(logger, requestContext) {
14710
- super(logger, requestContext);
14711
- import_common2.Logger.overrideLogger(this);
14688
+ constructor(logger, observableService, requestContext) {
14689
+ super(logger, requestContext, observableService);
14690
+ import_common.Logger.overrideLogger(this);
14712
14691
  }
14713
14692
  };
14714
- AppLogger = _ts_decorate2([
14715
- (0, import_common2.Injectable)(),
14716
- _ts_param(0, (0, import_common2.Inject)(PINO_ROOT_LOGGER)),
14693
+ AppLogger = _ts_decorate([
14694
+ (0, import_common.Injectable)(),
14695
+ _ts_param(0, (0, import_common.Inject)(PINO_ROOT_LOGGER)),
14696
+ _ts_param(1, (0, import_common.Inject)(import_nestjs_common.OBSERVABLE_SERVICE)),
14717
14697
  _ts_metadata("design:type", Function),
14718
14698
  _ts_metadata("design:paramtypes", [
14719
14699
  typeof PinoLogger === "undefined" ? Object : PinoLogger,
14720
- typeof RequestContextService === "undefined" ? Object : RequestContextService
14700
+ typeof import_nestjs_common.ObservableService === "undefined" ? Object : import_nestjs_common.ObservableService,
14701
+ typeof import_nestjs_common.RequestContextService === "undefined" ? Object : import_nestjs_common.RequestContextService
14721
14702
  ])
14722
14703
  ], AppLogger);
14723
14704
  var PinoLoggerService = class extends BasePinoLogger {
@@ -14743,18 +14724,6 @@ function mapLogLevelToPino(level) {
14743
14724
  }
14744
14725
  }
14745
14726
  __name(mapLogLevelToPino, "mapLogLevelToPino");
14746
- function stringifyParam(param) {
14747
- if (typeof param === "string") {
14748
- return param;
14749
- }
14750
- const inspectOptions = {
14751
- depth: 4,
14752
- colors: false,
14753
- compact: true
14754
- };
14755
- return (0, import_util.inspect)(param, inspectOptions);
14756
- }
14757
- __name(stringifyParam, "stringifyParam");
14758
14727
  function sanitizeValue(value) {
14759
14728
  if (value === null || value === void 0) {
14760
14729
  return value;
@@ -14777,9 +14746,10 @@ function sanitizeValue(value) {
14777
14746
  __name(sanitizeValue, "sanitizeValue");
14778
14747
 
14779
14748
  // src/module.ts
14780
- var import_common5 = require("@nestjs/common");
14749
+ var import_common4 = require("@nestjs/common");
14781
14750
  var import_core = require("@nestjs/core");
14782
14751
  var import_config3 = __toESM(require_config2(), 1);
14752
+ var import_nestjs_common4 = require("@lark-apaas/nestjs-common");
14783
14753
 
14784
14754
  // src/config/logger.config.ts
14785
14755
  var import_config = __toESM(require_config2(), 1);
@@ -14813,17 +14783,18 @@ var logger_config_default = (0, import_config.registerAs)("logger", () => {
14813
14783
  });
14814
14784
 
14815
14785
  // src/interceptor/logging.interceptor.ts
14816
- var import_common3 = require("@nestjs/common");
14786
+ var import_common2 = require("@nestjs/common");
14817
14787
  var import_config2 = __toESM(require_config2(), 1);
14818
14788
  var import_operators = __toESM(require_operators(), 1);
14819
- var import_util2 = require("util");
14820
- function _ts_decorate3(decorators, target, key, desc) {
14789
+ var import_util = require("util");
14790
+ var import_nestjs_common2 = require("@lark-apaas/nestjs-common");
14791
+ function _ts_decorate2(decorators, target, key, desc) {
14821
14792
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
14822
14793
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
14823
14794
  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;
14824
14795
  return c > 3 && r && Object.defineProperty(target, key, r), r;
14825
14796
  }
14826
- __name(_ts_decorate3, "_ts_decorate");
14797
+ __name(_ts_decorate2, "_ts_decorate");
14827
14798
  function _ts_metadata2(k, v) {
14828
14799
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
14829
14800
  }
@@ -14947,7 +14918,7 @@ duration_ms=${durationMs}`, "HTTPTraceInterceptor");
14947
14918
  this.traceLogger.logStructured(traceLevel, isError ? "HTTP request failed" : "HTTP request completed", responseMeta, "HTTPTraceInterceptor");
14948
14919
  });
14949
14920
  return next.handle().pipe((0, import_operators.catchError)((error) => {
14950
- this.appLogger.error((0, import_util2.format)("HTTP request exception\nmethod=%s url=%s\nerror=%o", req.method, req.url, error), "HTTPTraceInterceptor");
14921
+ this.appLogger.error((0, import_util.format)("HTTP request exception\nmethod=%s url=%s\nerror=%o", req.method, req.url, error), "HTTPTraceInterceptor");
14951
14922
  throw error;
14952
14923
  }));
14953
14924
  }
@@ -14972,20 +14943,21 @@ duration_ms=${durationMs}`, "HTTPTraceInterceptor");
14972
14943
  return {
14973
14944
  _error: "Failed to serialize data",
14974
14945
  _type: typeof data,
14946
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
14975
14947
  _constructor: data?.constructor?.name
14976
14948
  };
14977
14949
  }
14978
14950
  }
14979
14951
  };
14980
- LoggingInterceptor = _ts_decorate3([
14981
- (0, import_common3.Injectable)(),
14982
- _ts_param2(0, (0, import_common3.Inject)(TRACE_LOGGER)),
14983
- _ts_param2(2, (0, import_common3.Inject)(AppLogger)),
14984
- _ts_param2(3, (0, import_common3.Inject)(logger_config_default.KEY)),
14952
+ LoggingInterceptor = _ts_decorate2([
14953
+ (0, import_common2.Injectable)(),
14954
+ _ts_param2(0, (0, import_common2.Inject)(TRACE_LOGGER)),
14955
+ _ts_param2(2, (0, import_common2.Inject)(AppLogger)),
14956
+ _ts_param2(3, (0, import_common2.Inject)(logger_config_default.KEY)),
14985
14957
  _ts_metadata2("design:type", Function),
14986
14958
  _ts_metadata2("design:paramtypes", [
14987
14959
  typeof PinoLoggerService === "undefined" ? Object : PinoLoggerService,
14988
- typeof RequestContextService === "undefined" ? Object : RequestContextService,
14960
+ typeof import_nestjs_common2.RequestContextService === "undefined" ? Object : import_nestjs_common2.RequestContextService,
14989
14961
  typeof AppLogger === "undefined" ? Object : AppLogger,
14990
14962
  typeof import_config2.ConfigType === "undefined" ? Object : import_config2.ConfigType
14991
14963
  ])
@@ -15042,15 +15014,16 @@ function createFileDestination(pathname) {
15042
15014
  __name(createFileDestination, "createFileDestination");
15043
15015
 
15044
15016
  // src/middleware/logger-context.middleware.ts
15045
- var import_common4 = require("@nestjs/common");
15017
+ var import_common3 = require("@nestjs/common");
15046
15018
  var import_crypto = require("crypto");
15047
- function _ts_decorate4(decorators, target, key, desc) {
15019
+ var import_nestjs_common3 = require("@lark-apaas/nestjs-common");
15020
+ function _ts_decorate3(decorators, target, key, desc) {
15048
15021
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
15049
15022
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
15050
15023
  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;
15051
15024
  return c > 3 && r && Object.defineProperty(target, key, r), r;
15052
15025
  }
15053
- __name(_ts_decorate4, "_ts_decorate");
15026
+ __name(_ts_decorate3, "_ts_decorate");
15054
15027
  function _ts_metadata3(k, v) {
15055
15028
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
15056
15029
  }
@@ -15065,51 +15038,45 @@ var LoggerContextMiddleware = class {
15065
15038
  }
15066
15039
  use(req, res, next) {
15067
15040
  const requestId = req.headers["x-tt-log-id"] ?? (0, import_crypto.randomUUID)();
15068
- const path = req.originalUrl ?? req.url;
15069
- const userContext = req.userContext ?? {};
15070
15041
  const mutableReq = req;
15071
15042
  mutableReq.requestId = requestId;
15072
15043
  mutableReq.id = requestId;
15073
15044
  res.setHeader("x-log-trace-id", requestId);
15074
- this.requestContext.run({
15075
- requestId,
15076
- path,
15077
- method: req.method,
15078
- userId: userContext.userId,
15079
- tenantId: userContext.tenantId,
15080
- appId: userContext.appId
15081
- }, () => next());
15045
+ this.requestContext.setContext({
15046
+ requestId
15047
+ });
15048
+ next();
15082
15049
  }
15083
15050
  };
15084
- LoggerContextMiddleware = _ts_decorate4([
15085
- (0, import_common4.Injectable)(),
15051
+ LoggerContextMiddleware = _ts_decorate3([
15052
+ (0, import_common3.Injectable)(),
15086
15053
  _ts_metadata3("design:type", Function),
15087
15054
  _ts_metadata3("design:paramtypes", [
15088
- typeof RequestContextService === "undefined" ? Object : RequestContextService
15055
+ typeof import_nestjs_common3.RequestContextService === "undefined" ? Object : import_nestjs_common3.RequestContextService
15089
15056
  ])
15090
15057
  ], LoggerContextMiddleware);
15091
15058
 
15092
15059
  // src/module.ts
15093
- function _ts_decorate5(decorators, target, key, desc) {
15060
+ function _ts_decorate4(decorators, target, key, desc) {
15094
15061
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
15095
15062
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
15096
15063
  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;
15097
15064
  return c > 3 && r && Object.defineProperty(target, key, r), r;
15098
15065
  }
15099
- __name(_ts_decorate5, "_ts_decorate");
15066
+ __name(_ts_decorate4, "_ts_decorate");
15100
15067
  var LoggerModule = class {
15101
15068
  static {
15102
15069
  __name(this, "LoggerModule");
15103
15070
  }
15104
15071
  };
15105
- LoggerModule = _ts_decorate5([
15106
- (0, import_common5.Global)(),
15107
- (0, import_common5.Module)({
15072
+ LoggerModule = _ts_decorate4([
15073
+ (0, import_common4.Global)(),
15074
+ (0, import_common4.Module)({
15108
15075
  imports: [
15109
- import_config3.ConfigModule.forFeature(logger_config_default)
15076
+ import_config3.ConfigModule.forFeature(logger_config_default),
15077
+ import_nestjs_common4.CommonModule
15110
15078
  ],
15111
15079
  providers: [
15112
- RequestContextService,
15113
15080
  LoggerContextMiddleware,
15114
15081
  {
15115
15082
  provide: PINO_ROOT_LOGGER,
@@ -15125,13 +15092,14 @@ LoggerModule = _ts_decorate5([
15125
15092
  },
15126
15093
  {
15127
15094
  provide: TRACE_LOGGER,
15128
- useFactory: /* @__PURE__ */ __name((requestContext, config) => new PinoLoggerService(createPinoLogger({
15095
+ useFactory: /* @__PURE__ */ __name((requestContext, config, observableService) => new PinoLoggerService(createPinoLogger({
15129
15096
  level: config.level,
15130
15097
  filePath: `${config.logDir}/trace.log`
15131
- }), requestContext), "useFactory"),
15098
+ }), requestContext, observableService), "useFactory"),
15132
15099
  inject: [
15133
- RequestContextService,
15134
- logger_config_default.KEY
15100
+ import_nestjs_common4.RequestContextService,
15101
+ logger_config_default.KEY,
15102
+ import_nestjs_common4.OBSERVABLE_SERVICE
15135
15103
  ]
15136
15104
  },
15137
15105
  AppLogger,
@@ -15143,8 +15111,8 @@ LoggerModule = _ts_decorate5([
15143
15111
  ],
15144
15112
  exports: [
15145
15113
  AppLogger,
15114
+ import_nestjs_common4.CommonModule,
15146
15115
  TRACE_LOGGER,
15147
- RequestContextService,
15148
15116
  LoggerContextMiddleware
15149
15117
  ]
15150
15118
  })