@vita-mojo/services-logger 1.0.18 → 1.0.19

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vita-mojo/services-logger",
3
- "version": "1.0.18",
3
+ "version": "1.0.19",
4
4
  "type": "commonjs",
5
5
  "dependencies": {
6
6
  "@aws-sdk/client-cloudwatch-logs": "^3.922.0",
package/src/index.d.ts CHANGED
@@ -4,3 +4,4 @@ export { Log, Logger } from './lib/logger';
4
4
  export { createProvider, createRequestLoggerMiddleware, createResponseLoggerMiddleware, loggerProvider, } from './lib/nestjs';
5
5
  export { CloudWatch, Console, ConsoleAsJSON, Dynatrace, LambdaExtension, Logzio, Transport, } from './lib/transports';
6
6
  export * from './lib/utils';
7
+ export * from './lib/constants';
package/src/index.js CHANGED
@@ -22,4 +22,5 @@ Object.defineProperty(exports, "LambdaExtension", { enumerable: true, get: funct
22
22
  Object.defineProperty(exports, "Logzio", { enumerable: true, get: function () { return transports_1.Logzio; } });
23
23
  Object.defineProperty(exports, "Transport", { enumerable: true, get: function () { return transports_1.Transport; } });
24
24
  tslib_1.__exportStar(require("./lib/utils"), exports);
25
+ tslib_1.__exportStar(require("./lib/constants"), exports);
25
26
  //# sourceMappingURL=index.js.map
package/src/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/services-logger/src/index.ts"],"names":[],"mappings":";;;;AAAA,mEAAgE;AAAvD,0HAAA,kBAAkB,OAAA;AAC3B,qDAAmD;AAA1C,6GAAA,YAAY,OAAA;AACrB,uCAA2C;AAA7B,gGAAA,MAAM,OAAA;AACpB,uCAKsB;AAJpB,wGAAA,cAAc,OAAA;AACd,uHAAA,6BAA6B,OAAA;AAC7B,wHAAA,8BAA8B,OAAA;AAC9B,wGAAA,cAAc,OAAA;AAEhB,+CAQ0B;AAPxB,wGAAA,UAAU,OAAA;AACV,qGAAA,OAAO,OAAA;AACP,2GAAA,aAAa,OAAA;AACb,uGAAA,SAAS,OAAA;AACT,6GAAA,eAAe,OAAA;AACf,oGAAA,MAAM,OAAA;AACN,uGAAA,SAAS,OAAA;AAEX,sDAA4B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/services-logger/src/index.ts"],"names":[],"mappings":";;;;AAAA,mEAAgE;AAAvD,0HAAA,kBAAkB,OAAA;AAC3B,qDAAmD;AAA1C,6GAAA,YAAY,OAAA;AACrB,uCAA2C;AAA7B,gGAAA,MAAM,OAAA;AACpB,uCAKsB;AAJpB,wGAAA,cAAc,OAAA;AACd,uHAAA,6BAA6B,OAAA;AAC7B,wHAAA,8BAA8B,OAAA;AAC9B,wGAAA,cAAc,OAAA;AAEhB,+CAQ0B;AAPxB,wGAAA,UAAU,OAAA;AACV,qGAAA,OAAO,OAAA;AACP,2GAAA,aAAa,OAAA;AACb,uGAAA,SAAS,OAAA;AACT,6GAAA,eAAe,OAAA;AACf,oGAAA,MAAM,OAAA;AACN,uGAAA,SAAS,OAAA;AAEX,sDAA4B;AAC5B,0DAAgC"}
@@ -0,0 +1 @@
1
+ export * from './log-events';
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./log-events"), exports);
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/services-logger/src/lib/constants/index.ts"],"names":[],"mappings":";;;AAAA,uDAA6B"}
@@ -0,0 +1,28 @@
1
+ export declare const LogEvents: {
2
+ readonly HTTP_REQUEST_RECEIVED: "http.request.received";
3
+ readonly HTTP_REQUEST_COMPLETED: "http.request.completed";
4
+ readonly HTTP_REQUEST_SLOW: "http.request.slow";
5
+ readonly EXTERNAL_CALL_COMPLETED: "external.call.completed";
6
+ readonly EXTERNAL_CALL_FAILED: "external.call.failed";
7
+ readonly EXTERNAL_CALL_SLOW: "external.call.slow";
8
+ readonly AWS_SNS_PUBLISHED: "aws.sns.published";
9
+ readonly AWS_SNS_FAILED: "aws.sns.failed";
10
+ readonly AWS_SQS_SENT: "aws.sqs.sent";
11
+ readonly AWS_SQS_RECEIVED: "aws.sqs.received";
12
+ readonly AWS_SQS_PROCESSED: "aws.sqs.processed";
13
+ readonly AWS_SQS_FAILED: "aws.sqs.failed";
14
+ readonly AWS_S3_LOADED: "aws.s3.loaded";
15
+ readonly AWS_S3_FAILED: "aws.s3.failed";
16
+ readonly AWS_DYNAMODB_FAILED: "aws.dynamodb.failed";
17
+ readonly AUTH_LOGIN_SUCCESS: "auth.login.success";
18
+ readonly AUTH_LOGIN_FAILED: "auth.login.failed";
19
+ readonly AUTH_TOKEN_REFRESHED: "auth.token.refreshed";
20
+ readonly AUTH_TOKEN_REFRESH_FAILED: "auth.token.refresh_failed";
21
+ readonly AUTH_PERMISSION_DENIED: "auth.permission.denied";
22
+ readonly SYSTEM_STARTED: "system.started";
23
+ readonly SYSTEM_SHUTDOWN: "system.shutdown";
24
+ readonly SYSTEM_HEALTH_FAILED: "system.health.failed";
25
+ readonly SYSTEM_WORKER_FAILED: "system.worker.failed";
26
+ readonly SYSTEM_DB_READONLY: "system.db.readonly";
27
+ };
28
+ export type LogEvents = typeof LogEvents[keyof typeof LogEvents];
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LogEvents = void 0;
4
+ exports.LogEvents = {
5
+ // Inbound HTTP request lifecycle events
6
+ HTTP_REQUEST_RECEIVED: 'http.request.received', // Request enters the service
7
+ HTTP_REQUEST_COMPLETED: 'http.request.completed', // Response sent (2xx/3xx/4xx/5xx)
8
+ HTTP_REQUEST_SLOW: 'http.request.slow', // Response time exceeds threshold (service-defined)
9
+ // External Service Calls
10
+ EXTERNAL_CALL_COMPLETED: 'external.call.completed', // Outbound HTTP call succeeded
11
+ EXTERNAL_CALL_FAILED: 'external.call.failed', // Outbound HTTP call failed after all retries
12
+ EXTERNAL_CALL_SLOW: 'external.call.slow', // Outbound HTTP call exceeds response latency threshold
13
+ // AWS Infrastructure
14
+ AWS_SNS_PUBLISHED: 'aws.sns.published', // SNS message published
15
+ AWS_SNS_FAILED: 'aws.sns.failed', // SNS publish failed
16
+ AWS_SQS_SENT: 'aws.sqs.sent', // SQS message sent
17
+ AWS_SQS_RECEIVED: 'aws.sqs.received', // SQS message received
18
+ AWS_SQS_PROCESSED: 'aws.sqs.processed', // SQS message processed successfully
19
+ AWS_SQS_FAILED: 'aws.sqs.failed', // SQS message processing failed
20
+ AWS_S3_LOADED: 'aws.s3.loaded', // S3 object loaded
21
+ AWS_S3_FAILED: 'aws.s3.failed', // S3 operation failed
22
+ AWS_DYNAMODB_FAILED: 'aws.dynamodb.failed', // DynamoDB operation failed
23
+ // Auth
24
+ AUTH_LOGIN_SUCCESS: 'auth.login.success', // User authenticated
25
+ AUTH_LOGIN_FAILED: 'auth.login.failed', // Authentication attempt failed
26
+ AUTH_TOKEN_REFRESHED: 'auth.token.refreshed', // Auth token refreshed
27
+ AUTH_TOKEN_REFRESH_FAILED: 'auth.token.refresh_failed', // Auth token refresh failed
28
+ AUTH_PERMISSION_DENIED: 'auth.permission.denied', // Permission check failed
29
+ // System Lifecycle
30
+ SYSTEM_STARTED: 'system.started', // Service booted
31
+ SYSTEM_SHUTDOWN: 'system.shutdown', // Graceful shutdown initiated
32
+ SYSTEM_HEALTH_FAILED: 'system.health.failed', // Health check failed
33
+ SYSTEM_WORKER_FAILED: 'system.worker.failed', // Cluster worker died
34
+ SYSTEM_DB_READONLY: 'system.db.readonly', // Database is in read-only mode
35
+ };
36
+ //# sourceMappingURL=log-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-events.js","sourceRoot":"","sources":["../../../../../../packages/services-logger/src/lib/constants/log-events.ts"],"names":[],"mappings":";;;AAAa,QAAA,SAAS,GAAG;IACvB,wCAAwC;IACxC,qBAAqB,EAAE,uBAAuB,EAAE,6BAA6B;IAC7E,sBAAsB,EAAE,wBAAwB,EAAE,kCAAkC;IACpF,iBAAiB,EAAE,mBAAmB,EAAE,oDAAoD;IAE5F,yBAAyB;IACzB,uBAAuB,EAAE,yBAAyB,EAAE,+BAA+B;IACnF,oBAAoB,EAAE,sBAAsB,EAAE,8CAA8C;IAC5F,kBAAkB,EAAE,oBAAoB,EAAE,wDAAwD;IAElG,qBAAqB;IACrB,iBAAiB,EAAE,mBAAmB,EAAE,wBAAwB;IAChE,cAAc,EAAE,gBAAgB,EAAE,qBAAqB;IACvD,YAAY,EAAE,cAAc,EAAE,mBAAmB;IACjD,gBAAgB,EAAE,kBAAkB,EAAE,uBAAuB;IAC7D,iBAAiB,EAAE,mBAAmB,EAAE,qCAAqC;IAC7E,cAAc,EAAE,gBAAgB,EAAE,gCAAgC;IAClE,aAAa,EAAE,eAAe,EAAE,mBAAmB;IACnD,aAAa,EAAE,eAAe,EAAE,sBAAsB;IACtD,mBAAmB,EAAE,qBAAqB,EAAE,4BAA4B;IAExE,OAAO;IACP,kBAAkB,EAAE,oBAAoB,EAAE,qBAAqB;IAC/D,iBAAiB,EAAE,mBAAmB,EAAE,gCAAgC;IACxE,oBAAoB,EAAE,sBAAsB,EAAE,uBAAuB;IACrE,yBAAyB,EAAE,2BAA2B,EAAE,4BAA4B;IACpF,sBAAsB,EAAE,wBAAwB,EAAE,0BAA0B;IAE5E,mBAAmB;IACnB,cAAc,EAAE,gBAAgB,EAAE,iBAAiB;IACnD,eAAe,EAAE,iBAAiB,EAAE,8BAA8B;IAClE,oBAAoB,EAAE,sBAAsB,EAAE,sBAAsB;IACpE,oBAAoB,EAAE,sBAAsB,EAAE,sBAAsB;IACpE,kBAAkB,EAAE,oBAAoB,EAAE,gCAAgC;CAClE,CAAC"}
@@ -5,6 +5,7 @@ const tslib_1 = require("tslib");
5
5
  const node_crypto_1 = require("node:crypto");
6
6
  const mung = tslib_1.__importStar(require("express-mung"));
7
7
  const logger_1 = require("../logger");
8
+ const constants_1 = require("../constants");
8
9
  const shouldLog = (level, url) => {
9
10
  if (level === 'debug') {
10
11
  if (process.env['VMOS_LOGGER_PATHS'] && url) {
@@ -17,6 +18,7 @@ const shouldLog = (level, url) => {
17
18
  function createRequestLoggerMiddleware(logger, level = 'info', logDepth) {
18
19
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
19
20
  return (req, res, next) => {
21
+ var _a, _b;
20
22
  res.locals[logger_1.Logger.requestIdKey] =
21
23
  req.headers[logger_1.Logger.requestIdKey] || (0, node_crypto_1.randomUUID)();
22
24
  if (shouldLog(level, req.originalUrl)) {
@@ -31,6 +33,9 @@ function createRequestLoggerMiddleware(logger, level = 'info', logDepth) {
31
33
  [logger_1.Logger.metaKey]: {
32
34
  type: 'request',
33
35
  url: req.originalUrl,
36
+ event: constants_1.LogEvents.HTTP_REQUEST_RECEIVED,
37
+ tenantId: (_a = req.headers) === null || _a === void 0 ? void 0 : _a['tenant'],
38
+ storeId: (_b = req.headers) === null || _b === void 0 ? void 0 : _b['store'],
34
39
  [logger_1.Logger.requestIdKey]: res.locals[logger_1.Logger.requestIdKey],
35
40
  },
36
41
  });
@@ -44,7 +49,7 @@ function createResponseLoggerMiddleware(logger, level = 'info', logDepth) {
44
49
  return mung.json(
45
50
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
46
51
  (body, req, res) => {
47
- var _a, _b;
52
+ var _a, _b, _c, _d;
48
53
  if (shouldLog(level, req.url)) {
49
54
  logger[level]({
50
55
  logDepth,
@@ -61,6 +66,9 @@ function createResponseLoggerMiddleware(logger, level = 'info', logDepth) {
61
66
  statusCode: res.statusCode,
62
67
  type: 'response',
63
68
  url: req.url,
69
+ event: constants_1.LogEvents.HTTP_REQUEST_COMPLETED,
70
+ tenantId: (_c = req.headers) === null || _c === void 0 ? void 0 : _c['tenant'],
71
+ storeId: (_d = req.headers) === null || _d === void 0 ? void 0 : _d['store'],
64
72
  [logger_1.Logger.requestIdKey]: res.locals[logger_1.Logger.requestIdKey],
65
73
  },
66
74
  });
@@ -1 +1 @@
1
- {"version":3,"file":"middlewares.js","sourceRoot":"","sources":["../../../../../../packages/services-logger/src/lib/nestjs/middlewares.ts"],"names":[],"mappings":";;;;AAAA,6CAAyC;AAEzC,2DAAqC;AAErC,sCAAmC;AAEnC,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,EAAE;IAC/C,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QACtB,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,GAAG,EAAE,CAAC;YAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAE7D,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,SAAgB,6BAA6B,CAC3C,MAAc,EACd,KAAK,GAAG,MAAM,EACd,QAAiB;IAEjB,8DAA8D;IAC9D,OAAO,CAAC,GAAQ,EAAE,GAAQ,EAAE,IAAS,EAAE,EAAE;QACvC,GAAG,CAAC,MAAM,CAAC,eAAM,CAAC,YAAY,CAAC;YAC7B,GAAG,CAAC,OAAO,CAAC,eAAM,CAAC,YAAY,CAAC,IAAI,IAAA,wBAAU,GAAE,CAAC;QAEnD,IAAI,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACZ,QAAQ;gBACR,OAAO,EAAE;oBACP,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,OAAO,EAAE,GAAG,CAAC,OAAO;iBACrB;gBACD,CAAC,eAAM,CAAC,OAAO,CAAC,EAAE;oBAChB,IAAI,EAAE,SAAS;oBACf,GAAG,EAAE,GAAG,CAAC,WAAW;oBACpB,CAAC,eAAM,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,eAAM,CAAC,YAAY,CAAC;iBACvD;aACF,CAAC,CAAC;QACL,CAAC;QAED,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC;AA7BD,sEA6BC;AAED,SAAgB,8BAA8B,CAC5C,MAAc,EACd,KAAK,GAAG,MAAM,EACd,QAAiB;IAEjB,8DAA8D;IAC9D,OAAgE,IAAI,CAAC,IAAI;IACvE,8DAA8D;IAC9D,CAAC,IAAS,EAAE,GAAQ,EAAE,GAAQ,EAAE,EAAE;;QAChC,IAAI,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,CAAC;gBACZ,QAAQ;gBACR,OAAO,EAAE;oBACP,OAAO,EAAE,MAAA,GAAG,CAAC,OAAO,mCAAI,EAAE;iBAC3B;gBACD,QAAQ,EAAE;oBACR,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,IAAI;oBACJ,OAAO,EAAE,GAAG,CAAC,UAAU,EAAE;oBACzB,QAAQ,EAAE,MAAA,GAAG,CAAC,MAAM,0CAAE,QAAQ;iBAC/B;gBACD,CAAC,eAAM,CAAC,OAAO,CAAC,EAAE;oBAChB,UAAU,EAAE,GAAG,CAAC,UAAU;oBAC1B,IAAI,EAAE,UAAU;oBAChB,GAAG,EAAE,GAAG,CAAC,GAAG;oBACZ,CAAC,eAAM,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,eAAM,CAAC,YAAY,CAAC;iBACvD;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC;AA/BD,wEA+BC"}
1
+ {"version":3,"file":"middlewares.js","sourceRoot":"","sources":["../../../../../../packages/services-logger/src/lib/nestjs/middlewares.ts"],"names":[],"mappings":"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"}