@clicoh/logging 1.0.0

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/README.md ADDED
@@ -0,0 +1,53 @@
1
+ # @clicoh/logging
2
+
3
+ Structured JSON logging for ClicOH Node.js and Express services.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ bun add @clicoh/logging
9
+ ```
10
+
11
+ The package is public on npmjs.com, so consumers do not need a registry token.
12
+
13
+ ## Usage
14
+
15
+ ```ts
16
+ import logger, {
17
+ logErrorMiddleware,
18
+ logTimeStartMiddleware,
19
+ printGeneralLog,
20
+ requestLogMiddleware,
21
+ } from '@clicoh/logging';
22
+
23
+ printGeneralLog(
24
+ { message: 'Shipment created' },
25
+ 'shipmentCreated',
26
+ logger,
27
+ );
28
+ ```
29
+
30
+ Optional middleware exports:
31
+
32
+ ```ts
33
+ import { auditMiddleware, memoryMiddleware } from '@clicoh/logging';
34
+ ```
35
+
36
+ ## Configuration
37
+
38
+ - `SERVICE_NAME`: stable service name used in Loki.
39
+ - `ENVIRONMENT` or `NODE_ENV`: deployment environment.
40
+ - `LOG_LEVEL`: `error`, `warn`, `info`, or `debug`.
41
+ - `LOG_HTTP_FULL`: includes sanitized request bodies and headers in audit logs.
42
+ - `LOG_MEMORY_USAGE`: enables memory-delta logs.
43
+ - `MAX_LOG_STRING_LENGTH`: maximum length for individual strings.
44
+ - `MAX_LOG_EVENT_LENGTH`: maximum UTF-8 byte size for a complete JSON line.
45
+ - `AWS_REGION`: optional region metadata.
46
+
47
+ Errors are written to stderr. Other enabled levels are written to stdout.
48
+
49
+ ## Releases
50
+
51
+ The first public version is published manually with npm 2FA. Subsequent semver
52
+ tags publish through `.github/workflows/publish.yml` using npm trusted
53
+ publishing (OIDC), without long-lived registry tokens.
@@ -0,0 +1,4 @@
1
+ declare const auditMiddleware: import("express-serve-static-core").Router;
2
+ export { auditMiddleware };
3
+ export default auditMiddleware;
4
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"AAMA,QAAA,MAAM,eAAe,4CAAmB,CAAC;AAmEzC,OAAO,EAAE,eAAe,EAAE,CAAC;AAC3B,eAAe,eAAe,CAAC"}
package/dist/audit.js ADDED
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.auditMiddleware = void 0;
7
+ const express_1 = __importDefault(require("express"));
8
+ const log_data_1 = require("./log-data");
9
+ const logger_1 = require("./logger");
10
+ const logging_1 = __importDefault(require("./logging"));
11
+ const auditMiddleware = express_1.default.Router();
12
+ exports.auditMiddleware = auditMiddleware;
13
+ auditMiddleware.use(async (req, _res, next) => {
14
+ try {
15
+ if (!req.body)
16
+ req.body = {};
17
+ const { body, params, method, headers } = req;
18
+ let { admin, admin_id, adminId } = body;
19
+ let { messenger, messengerId, messenger_id, idMessenger } = body;
20
+ let { user, userId, user_id, idUser } = body;
21
+ let adminOid = null;
22
+ let userOid = null;
23
+ let messengerOid = null;
24
+ if (user == null && userId == null && user_id == null && idUser == null) {
25
+ ({ user, userId, user_id, idUser } = params);
26
+ }
27
+ userOid = user ?? userId ?? user_id ?? idUser ?? null;
28
+ if (messenger == null &&
29
+ messengerId == null &&
30
+ messenger_id == null &&
31
+ idMessenger == null) {
32
+ ({ messenger, messengerId, messenger_id, idMessenger } = params);
33
+ }
34
+ messengerOid =
35
+ messenger ?? messengerId ?? messenger_id ?? idMessenger ?? null;
36
+ if (admin == null && admin_id == null && adminId == null) {
37
+ ({ admin, admin_id, adminId } = params);
38
+ }
39
+ adminOid = admin ?? admin_id ?? adminId ?? null;
40
+ if (process.env.NODE_ENV !== 'local') {
41
+ const logHttpFull = process.env.LOG_HTTP_FULL === 'true';
42
+ (0, logger_1.printGeneralLog)({
43
+ method: method || null,
44
+ admin: adminOid ? String(adminOid) : null,
45
+ messenger: messengerOid ? String(messengerOid) : null,
46
+ user: userOid ? String(userOid) : null,
47
+ action: (0, log_data_1.sanitizeRequestPath)(`${req.baseUrl}${req.path}`),
48
+ ...(logHttpFull ? { body, headers } : {}),
49
+ }, 'auditRequest', logging_1.default);
50
+ }
51
+ next();
52
+ }
53
+ catch (error) {
54
+ (0, logger_1.printGeneralLog)(error && typeof error === 'object' ? error : { error }, 'auditMiddlewareError', logging_1.default, true);
55
+ next();
56
+ }
57
+ });
58
+ exports.default = auditMiddleware;
59
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import auditMiddleware from './audit';
2
+ import { CIRCULAR_VALUE, DEFAULT_SENSITIVE_FIELDS, REDACTED_VALUE, TRUNCATED_SUFFIX, cleanLogData, getMaxEventLength, getMaxStringLength, limitLogEvent, redactSensitiveData, safeSerialize, safeStringify, sanitizeRequestPath, truncateString } from './log-data';
3
+ import { cleanData, handlerError, hideSensitiveData, logErrorMiddleware, logTimeStartMiddleware, printGeneralLog, requestLogMiddleware } from './logger';
4
+ import logger from './logging';
5
+ import memoryMiddleware from './memory';
6
+ export { CIRCULAR_VALUE, DEFAULT_SENSITIVE_FIELDS, REDACTED_VALUE, TRUNCATED_SUFFIX, auditMiddleware, cleanData, cleanLogData, getMaxEventLength, getMaxStringLength, handlerError, hideSensitiveData, limitLogEvent, logErrorMiddleware, logger, logTimeStartMiddleware, memoryMiddleware, printGeneralLog, redactSensitiveData, requestLogMiddleware, safeSerialize, safeStringify, sanitizeRequestPath, truncateString, };
7
+ export type { CompatibleLogger } from './logger';
8
+ export default logger;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,SAAS,CAAC;AACtC,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,cAAc,EACf,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,eAAe,EACf,oBAAoB,EACrB,MAAM,UAAU,CAAC;AAClB,OAAO,MAAM,MAAM,WAAW,CAAC;AAC/B,OAAO,gBAAgB,MAAM,UAAU,CAAC;AAExC,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,MAAM,EACN,sBAAsB,EACtB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,cAAc,GACf,CAAC;AAEF,YAAY,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEjD,eAAe,MAAM,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.truncateString = exports.sanitizeRequestPath = exports.safeStringify = exports.safeSerialize = exports.requestLogMiddleware = exports.redactSensitiveData = exports.printGeneralLog = exports.memoryMiddleware = exports.logTimeStartMiddleware = exports.logger = exports.logErrorMiddleware = exports.limitLogEvent = exports.hideSensitiveData = exports.handlerError = exports.getMaxStringLength = exports.getMaxEventLength = exports.cleanLogData = exports.cleanData = exports.auditMiddleware = exports.TRUNCATED_SUFFIX = exports.REDACTED_VALUE = exports.DEFAULT_SENSITIVE_FIELDS = exports.CIRCULAR_VALUE = void 0;
7
+ const audit_1 = __importDefault(require("./audit"));
8
+ exports.auditMiddleware = audit_1.default;
9
+ const log_data_1 = require("./log-data");
10
+ Object.defineProperty(exports, "CIRCULAR_VALUE", { enumerable: true, get: function () { return log_data_1.CIRCULAR_VALUE; } });
11
+ Object.defineProperty(exports, "DEFAULT_SENSITIVE_FIELDS", { enumerable: true, get: function () { return log_data_1.DEFAULT_SENSITIVE_FIELDS; } });
12
+ Object.defineProperty(exports, "REDACTED_VALUE", { enumerable: true, get: function () { return log_data_1.REDACTED_VALUE; } });
13
+ Object.defineProperty(exports, "TRUNCATED_SUFFIX", { enumerable: true, get: function () { return log_data_1.TRUNCATED_SUFFIX; } });
14
+ Object.defineProperty(exports, "cleanLogData", { enumerable: true, get: function () { return log_data_1.cleanLogData; } });
15
+ Object.defineProperty(exports, "getMaxEventLength", { enumerable: true, get: function () { return log_data_1.getMaxEventLength; } });
16
+ Object.defineProperty(exports, "getMaxStringLength", { enumerable: true, get: function () { return log_data_1.getMaxStringLength; } });
17
+ Object.defineProperty(exports, "limitLogEvent", { enumerable: true, get: function () { return log_data_1.limitLogEvent; } });
18
+ Object.defineProperty(exports, "redactSensitiveData", { enumerable: true, get: function () { return log_data_1.redactSensitiveData; } });
19
+ Object.defineProperty(exports, "safeSerialize", { enumerable: true, get: function () { return log_data_1.safeSerialize; } });
20
+ Object.defineProperty(exports, "safeStringify", { enumerable: true, get: function () { return log_data_1.safeStringify; } });
21
+ Object.defineProperty(exports, "sanitizeRequestPath", { enumerable: true, get: function () { return log_data_1.sanitizeRequestPath; } });
22
+ Object.defineProperty(exports, "truncateString", { enumerable: true, get: function () { return log_data_1.truncateString; } });
23
+ const logger_1 = require("./logger");
24
+ Object.defineProperty(exports, "cleanData", { enumerable: true, get: function () { return logger_1.cleanData; } });
25
+ Object.defineProperty(exports, "handlerError", { enumerable: true, get: function () { return logger_1.handlerError; } });
26
+ Object.defineProperty(exports, "hideSensitiveData", { enumerable: true, get: function () { return logger_1.hideSensitiveData; } });
27
+ Object.defineProperty(exports, "logErrorMiddleware", { enumerable: true, get: function () { return logger_1.logErrorMiddleware; } });
28
+ Object.defineProperty(exports, "logTimeStartMiddleware", { enumerable: true, get: function () { return logger_1.logTimeStartMiddleware; } });
29
+ Object.defineProperty(exports, "printGeneralLog", { enumerable: true, get: function () { return logger_1.printGeneralLog; } });
30
+ Object.defineProperty(exports, "requestLogMiddleware", { enumerable: true, get: function () { return logger_1.requestLogMiddleware; } });
31
+ const logging_1 = __importDefault(require("./logging"));
32
+ exports.logger = logging_1.default;
33
+ const memory_1 = __importDefault(require("./memory"));
34
+ exports.memoryMiddleware = memory_1.default;
35
+ exports.default = logging_1.default;
36
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,oDAAsC;AAiCpC,0BAjCK,eAAe,CAiCL;AAhCjB,yCAcoB;AAclB,+FA3BA,yBAAc,OA2BA;AACd,yGA3BA,mCAAwB,OA2BA;AACxB,+FA3BA,yBAAc,OA2BA;AACd,iGA3BA,2BAAgB,OA2BA;AAGhB,6FA7BA,uBAAY,OA6BA;AACZ,kGA7BA,4BAAiB,OA6BA;AACjB,mGA7BA,6BAAkB,OA6BA;AAGlB,8FA/BA,wBAAa,OA+BA;AAMb,oGApCA,8BAAmB,OAoCA;AAEnB,8FArCA,wBAAa,OAqCA;AACb,8FArCA,wBAAa,OAqCA;AACb,oGArCA,8BAAmB,OAqCA;AACnB,+FArCA,yBAAc,OAqCA;AAnChB,qCAQkB;AAUhB,0FAjBA,kBAAS,OAiBA;AAIT,6FApBA,qBAAY,OAoBA;AACZ,kGApBA,0BAAiB,OAoBA;AAEjB,mGArBA,2BAAkB,OAqBA;AAElB,uGAtBA,+BAAsB,OAsBA;AAEtB,gGAvBA,wBAAe,OAuBA;AAEf,qGAxBA,6BAAoB,OAwBA;AAtBtB,wDAA+B;AAiB7B,iBAjBK,iBAAM,CAiBL;AAhBR,sDAAwC;AAkBtC,2BAlBK,gBAAgB,CAkBL;AAYlB,kBAAe,iBAAM,CAAC"}
@@ -0,0 +1,15 @@
1
+ declare const REDACTED_VALUE = "[REDACTED]";
2
+ declare const CIRCULAR_VALUE = "[Circular]";
3
+ declare const TRUNCATED_SUFFIX = "...[TRUNCATED]";
4
+ declare const DEFAULT_SENSITIVE_FIELDS: string[];
5
+ declare const getMaxStringLength: () => number;
6
+ declare const getMaxEventLength: () => number;
7
+ declare const truncateString: (value: string, maxLength?: number) => string;
8
+ declare const safeSerialize: (value: unknown) => unknown;
9
+ declare const redactSensitiveData: (value: unknown, hiddenFields?: string[]) => unknown;
10
+ declare const cleanLogData: (value: unknown, hiddenFields?: string[]) => unknown;
11
+ declare const safeStringify: (value: unknown) => string;
12
+ declare const limitLogEvent: (value: unknown) => unknown;
13
+ declare const sanitizeRequestPath: (path: string) => string;
14
+ export { CIRCULAR_VALUE, DEFAULT_SENSITIVE_FIELDS, REDACTED_VALUE, TRUNCATED_SUFFIX, cleanLogData, getMaxEventLength, getMaxStringLength, limitLogEvent, redactSensitiveData, sanitizeRequestPath, safeSerialize, safeStringify, truncateString, };
15
+ //# sourceMappingURL=log-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-data.d.ts","sourceRoot":"","sources":["../src/log-data.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,cAAc,eAAe,CAAC;AACpC,QAAA,MAAM,cAAc,eAAe,CAAC;AACpC,QAAA,MAAM,gBAAgB,mBAAmB,CAAC;AAQ1C,QAAA,MAAM,wBAAwB,UAyB7B,CAAC;AAYF,QAAA,MAAM,kBAAkB,cAOrB,CAAC;AAEJ,QAAA,MAAM,iBAAiB,cAOpB,CAAC;AAEJ,QAAA,MAAM,cAAc,GAAI,OAAO,MAAM,EAAE,kBAAgC,WAOtE,CAAC;AA2GF,QAAA,MAAM,aAAa,GAAI,OAAO,OAAO,KAAG,OAQrC,CAAC;AA0BJ,QAAA,MAAM,mBAAmB,GAAI,OAAO,OAAO,EAAE,eAAc,MAAM,EAAO,YAClB,CAAC;AAEvD,QAAA,MAAM,YAAY,GAAI,OAAO,OAAO,EAAE,eAAc,MAAM,EAAO,YACR,CAAC;AAE1D,QAAA,MAAM,aAAa,GAAI,OAAO,OAAO,WAMpC,CAAC;AAUF,QAAA,MAAM,aAAa,GAAI,OAAO,OAAO,KAAG,OA4BvC,CAAC;AAEF,QAAA,MAAM,mBAAmB,GAAI,MAAM,MAAM,WAWxC,CAAC;AAEF,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,cAAc,GACf,CAAC"}
@@ -0,0 +1,213 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.truncateString = exports.safeStringify = exports.safeSerialize = exports.sanitizeRequestPath = exports.redactSensitiveData = exports.limitLogEvent = exports.getMaxStringLength = exports.getMaxEventLength = exports.cleanLogData = exports.TRUNCATED_SUFFIX = exports.REDACTED_VALUE = exports.DEFAULT_SENSITIVE_FIELDS = exports.CIRCULAR_VALUE = void 0;
4
+ const REDACTED_VALUE = '[REDACTED]';
5
+ exports.REDACTED_VALUE = REDACTED_VALUE;
6
+ const CIRCULAR_VALUE = '[Circular]';
7
+ exports.CIRCULAR_VALUE = CIRCULAR_VALUE;
8
+ const TRUNCATED_SUFFIX = '...[TRUNCATED]';
9
+ exports.TRUNCATED_SUFFIX = TRUNCATED_SUFFIX;
10
+ const DEFAULT_MAX_STRING_LENGTH = 10000;
11
+ const DEFAULT_MAX_EVENT_LENGTH = 65536;
12
+ const MAX_DEPTH = 12;
13
+ const MAX_ARRAY_ITEMS = 100;
14
+ const MAX_OBJECT_KEYS = 100;
15
+ const MAX_NODES = 2000;
16
+ const DEFAULT_SENSITIVE_FIELDS = [
17
+ 'authorization',
18
+ 'proxy-authorization',
19
+ 'password',
20
+ 'passwordConfirmation',
21
+ 'passwd',
22
+ 'pass',
23
+ 'token',
24
+ 'tokenPushy',
25
+ 'accessToken',
26
+ 'access-token',
27
+ 'access_token',
28
+ 'refreshToken',
29
+ 'refresh_token',
30
+ 'apiKey',
31
+ 'apikey',
32
+ 'secret',
33
+ 'clientSecret',
34
+ 'client_secret',
35
+ 'cookie',
36
+ 'set-cookie',
37
+ 'x-api-key',
38
+ 'private-key',
39
+ 'session-tracker',
40
+ 'security',
41
+ ];
42
+ exports.DEFAULT_SENSITIVE_FIELDS = DEFAULT_SENSITIVE_FIELDS;
43
+ const parsePositiveInteger = (value, fallback) => {
44
+ const parsed = Number.parseInt(value ?? '', 10);
45
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
46
+ };
47
+ const getMaxStringLength = () => Math.max(TRUNCATED_SUFFIX.length, parsePositiveInteger(process.env.MAX_LOG_STRING_LENGTH, DEFAULT_MAX_STRING_LENGTH));
48
+ exports.getMaxStringLength = getMaxStringLength;
49
+ const getMaxEventLength = () => Math.max(256, parsePositiveInteger(process.env.MAX_LOG_EVENT_LENGTH, DEFAULT_MAX_EVENT_LENGTH));
50
+ exports.getMaxEventLength = getMaxEventLength;
51
+ const truncateString = (value, maxLength = getMaxStringLength()) => {
52
+ if (value.length <= maxLength) {
53
+ return value;
54
+ }
55
+ const availableLength = Math.max(0, maxLength - TRUNCATED_SUFFIX.length);
56
+ return `${value.slice(0, availableLength)}${TRUNCATED_SUFFIX}`;
57
+ };
58
+ exports.truncateString = truncateString;
59
+ const serializeValue = (value, context, depth) => {
60
+ if (value === undefined)
61
+ return '[Undefined]';
62
+ if (value === null)
63
+ return null;
64
+ if (typeof value === 'string')
65
+ return truncateString(value);
66
+ if (typeof value === 'number' ||
67
+ typeof value === 'boolean' ||
68
+ typeof value === 'bigint') {
69
+ return typeof value === 'bigint' ? value.toString() : value;
70
+ }
71
+ if (typeof value === 'symbol' || typeof value === 'function') {
72
+ return truncateString(String(value));
73
+ }
74
+ if (depth >= MAX_DEPTH || context.nodes >= MAX_NODES) {
75
+ return TRUNCATED_SUFFIX;
76
+ }
77
+ if (typeof value !== 'object') {
78
+ return truncateString(String(value));
79
+ }
80
+ if (context.seen.has(value)) {
81
+ return CIRCULAR_VALUE;
82
+ }
83
+ context.seen.add(value);
84
+ context.nodes += 1;
85
+ if (value instanceof Date) {
86
+ const timestamp = value.getTime();
87
+ return Number.isNaN(timestamp) ? 'Invalid Date' : value.toISOString();
88
+ }
89
+ if (value instanceof Error) {
90
+ const serializedError = {
91
+ name: value.name,
92
+ message: truncateString(value.message),
93
+ };
94
+ if (value.stack) {
95
+ serializedError.stack = truncateString(value.stack);
96
+ }
97
+ for (const key of Object.keys(value).slice(0, MAX_OBJECT_KEYS)) {
98
+ try {
99
+ serializedError[key] = serializeValue(value[key], context, depth + 1);
100
+ }
101
+ catch {
102
+ serializedError[key] = '[Unserializable]';
103
+ }
104
+ }
105
+ return serializedError;
106
+ }
107
+ if (Buffer.isBuffer(value)) {
108
+ return `[Buffer length=${value.length}]`;
109
+ }
110
+ if (Array.isArray(value)) {
111
+ const serializedArray = value
112
+ .slice(0, MAX_ARRAY_ITEMS)
113
+ .map((item) => serializeValue(item, context, depth + 1));
114
+ if (value.length > MAX_ARRAY_ITEMS) {
115
+ serializedArray.push(TRUNCATED_SUFFIX);
116
+ }
117
+ return serializedArray;
118
+ }
119
+ const serializedObject = {};
120
+ let keys;
121
+ try {
122
+ keys = Object.keys(value);
123
+ }
124
+ catch {
125
+ return '[Unserializable]';
126
+ }
127
+ for (const key of keys.slice(0, MAX_OBJECT_KEYS)) {
128
+ try {
129
+ serializedObject[key] = serializeValue(value[key], context, depth + 1);
130
+ }
131
+ catch {
132
+ serializedObject[key] = '[Unserializable]';
133
+ }
134
+ }
135
+ if (keys.length > MAX_OBJECT_KEYS) {
136
+ serializedObject._truncated = TRUNCATED_SUFFIX;
137
+ }
138
+ return serializedObject;
139
+ };
140
+ const safeSerialize = (value) => serializeValue(value, {
141
+ nodes: 0,
142
+ seen: new WeakSet(),
143
+ }, 0);
144
+ exports.safeSerialize = safeSerialize;
145
+ const getSensitiveFields = (hiddenFields = []) => new Set([...DEFAULT_SENSITIVE_FIELDS, ...hiddenFields].map((field) => field.toLowerCase()));
146
+ const redactValue = (value, sensitiveFields) => {
147
+ if (Array.isArray(value)) {
148
+ return value.map((item) => redactValue(item, sensitiveFields));
149
+ }
150
+ if (value === null || typeof value !== 'object') {
151
+ return value;
152
+ }
153
+ const redacted = {};
154
+ for (const [key, item] of Object.entries(value)) {
155
+ redacted[key] = sensitiveFields.has(key.toLowerCase())
156
+ ? REDACTED_VALUE
157
+ : redactValue(item, sensitiveFields);
158
+ }
159
+ return redacted;
160
+ };
161
+ const redactSensitiveData = (value, hiddenFields = []) => redactValue(value, getSensitiveFields(hiddenFields));
162
+ exports.redactSensitiveData = redactSensitiveData;
163
+ const cleanLogData = (value, hiddenFields = []) => redactSensitiveData(safeSerialize(value), hiddenFields);
164
+ exports.cleanLogData = cleanLogData;
165
+ const safeStringify = (value) => {
166
+ try {
167
+ return JSON.stringify(value);
168
+ }
169
+ catch {
170
+ return JSON.stringify('[Unserializable]');
171
+ }
172
+ };
173
+ exports.safeStringify = safeStringify;
174
+ const truncateUtf8 = (value, maxBytes) => {
175
+ const buffer = Buffer.from(value);
176
+ if (buffer.length <= maxBytes) {
177
+ return value;
178
+ }
179
+ return buffer.subarray(0, Math.max(0, maxBytes)).toString('utf8');
180
+ };
181
+ const limitLogEvent = (value) => {
182
+ const serialized = safeStringify(value);
183
+ const maxLength = getMaxEventLength();
184
+ if (Buffer.byteLength(serialized) <= maxLength) {
185
+ return value;
186
+ }
187
+ let availableBytes = Math.max(0, maxLength - Buffer.byteLength(TRUNCATED_SUFFIX) - 64);
188
+ let limited = {
189
+ message: `${truncateUtf8(serialized, availableBytes)}${TRUNCATED_SUFFIX}`,
190
+ truncated: true,
191
+ };
192
+ let limitedSize = Buffer.byteLength(safeStringify(limited));
193
+ while (limitedSize > maxLength && availableBytes > 0) {
194
+ availableBytes = Math.max(0, availableBytes - (limitedSize - maxLength));
195
+ limited = {
196
+ message: `${truncateUtf8(serialized, availableBytes)}${TRUNCATED_SUFFIX}`,
197
+ truncated: true,
198
+ };
199
+ limitedSize = Buffer.byteLength(safeStringify(limited));
200
+ }
201
+ return limited;
202
+ };
203
+ exports.limitLogEvent = limitLogEvent;
204
+ const sanitizeRequestPath = (path) => {
205
+ const dynamicSegment = /^(?:\d+|[0-9a-f]{8}-[0-9a-f-]{27,}|[0-9a-f]{16,}|[^/]*@[^/]*)$/i;
206
+ const pathname = path.split('?')[0];
207
+ return pathname
208
+ .split('/')
209
+ .map((segment) => dynamicSegment.test(segment) || segment.length > 24 ? ':value' : segment)
210
+ .join('/');
211
+ };
212
+ exports.sanitizeRequestPath = sanitizeRequestPath;
213
+ //# sourceMappingURL=log-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-data.js","sourceRoot":"","sources":["../src/log-data.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { ErrorRequestHandler, NextFunction, Request, Response } from 'express';
2
+ import { limitLogEvent, redactSensitiveData, safeSerialize, truncateString } from './log-data';
3
+ type CompatibleLogger = {
4
+ error: (message: unknown, metadata?: object) => unknown;
5
+ info: (message: unknown, metadata?: object) => unknown;
6
+ };
7
+ declare const handlerError: (code: number, error: string, status: number) => {
8
+ status: number;
9
+ message: {
10
+ code: number;
11
+ detail: string;
12
+ };
13
+ };
14
+ declare const logTimeStartMiddleware: (req: Request & {
15
+ logTimeStart?: number;
16
+ }, _res: Response, next: NextFunction) => void;
17
+ declare const cleanData: (data: unknown, hiddenFields?: string[]) => unknown;
18
+ declare const hideSensitiveData: (data: unknown, hiddenFields?: string[]) => unknown;
19
+ declare const logErrorMiddleware: ErrorRequestHandler;
20
+ declare const requestLogMiddleware: (targetLogger: CompatibleLogger, formats?: string, enabled?: boolean, hiddenFields?: string[]) => (_req: Request, _res: Response, next: NextFunction) => void;
21
+ declare const printGeneralLog: (message: object, type: string, targetLogger?: CompatibleLogger | null, isError?: boolean, formats?: string, enabled?: boolean) => void;
22
+ export { CompatibleLogger, cleanData, handlerError, hideSensitiveData, limitLogEvent, logErrorMiddleware, logTimeStartMiddleware, printGeneralLog, redactSensitiveData, requestLogMiddleware, safeSerialize, truncateString, };
23
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,OAAO,EACP,QAAQ,EACT,MAAM,SAAS,CAAC;AAGjB,OAAO,EAEL,aAAa,EACb,mBAAmB,EACnB,aAAa,EAEb,cAAc,EACf,MAAM,YAAY,CAAC;AAMpB,KAAK,gBAAgB,GAAG;IACtB,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IACxD,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;CACxD,CAAC;AAKF,QAAA,MAAM,YAAY,GAAI,MAAM,MAAM,EAAE,OAAO,MAAM,EAAE,QAAQ,MAAM;;;;;;CAM/D,CAAC;AAEH,QAAA,MAAM,sBAAsB,GAC1B,KAAK,OAAO,GAAG;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,EACxC,MAAM,QAAQ,EACd,MAAM,YAAY,SAInB,CAAC;AAEF,QAAA,MAAM,SAAS,GAAI,MAAM,OAAO,EAAE,eAAc,MAAM,EAAO,YAC3B,CAAC;AAEnC,QAAA,MAAM,iBAAiB,GAAI,MAAM,OAAO,EAAE,eAAc,MAAM,EAAO,YACb,CAAC;AAEzD,QAAA,MAAM,kBAAkB,EAAE,mBA4CzB,CAAC;AAEF,QAAA,MAAM,oBAAoB,GAEtB,cAAc,gBAAgB,EAC9B,gBAAgB,EAChB,iBAAc,EACd,eAAc,MAAM,EAAO,MAE5B,MAAM,OAAO,EAAE,MAAM,QAAQ,EAAE,MAAM,YAAY,SAMjD,CAAC;AAEJ,QAAA,MAAM,eAAe,GACnB,SAAS,MAAM,EACf,MAAM,MAAM,EACZ,eAAc,gBAAgB,GAAG,IAAW,EAC5C,iBAAe,EACf,gBAAgB,EAChB,iBAAc,SAoCf,CAAC;AAEF,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,sBAAsB,EACtB,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,aAAa,EACb,cAAc,GACf,CAAC"}
package/dist/logger.js ADDED
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.truncateString = exports.safeSerialize = exports.requestLogMiddleware = exports.redactSensitiveData = exports.printGeneralLog = exports.logTimeStartMiddleware = exports.logErrorMiddleware = exports.limitLogEvent = exports.hideSensitiveData = exports.handlerError = exports.cleanData = void 0;
7
+ const logging_1 = __importDefault(require("./logging"));
8
+ const log_data_1 = require("./log-data");
9
+ Object.defineProperty(exports, "limitLogEvent", { enumerable: true, get: function () { return log_data_1.limitLogEvent; } });
10
+ Object.defineProperty(exports, "redactSensitiveData", { enumerable: true, get: function () { return log_data_1.redactSensitiveData; } });
11
+ Object.defineProperty(exports, "safeSerialize", { enumerable: true, get: function () { return log_data_1.safeSerialize; } });
12
+ Object.defineProperty(exports, "truncateString", { enumerable: true, get: function () { return log_data_1.truncateString; } });
13
+ const getGlobalHiddenFields = () => global.hiddenFields ?? [];
14
+ const handlerError = (code, error, status) => ({
15
+ status: status || 400,
16
+ message: {
17
+ code,
18
+ detail: error,
19
+ },
20
+ });
21
+ exports.handlerError = handlerError;
22
+ const logTimeStartMiddleware = (req, _res, next) => {
23
+ req.logTimeStart = Date.now();
24
+ next();
25
+ };
26
+ exports.logTimeStartMiddleware = logTimeStartMiddleware;
27
+ const cleanData = (data, hiddenFields = []) => (0, log_data_1.cleanLogData)(data, hiddenFields);
28
+ exports.cleanData = cleanData;
29
+ const hideSensitiveData = (data, hiddenFields = []) => (0, log_data_1.redactSensitiveData)((0, log_data_1.safeSerialize)(data), hiddenFields);
30
+ exports.hideSensitiveData = hideSensitiveData;
31
+ const logErrorMiddleware = (err, req, _res, next) => {
32
+ try {
33
+ const errorRecord = err && typeof err === 'object'
34
+ ? err
35
+ : undefined;
36
+ const nestedError = errorRecord?.error;
37
+ const source = nestedError ?? err;
38
+ const sourceRecord = source && typeof source === 'object'
39
+ ? source
40
+ : undefined;
41
+ const name = source instanceof Error
42
+ ? source.name
43
+ : typeof sourceRecord?.name === 'string'
44
+ ? sourceRecord.name
45
+ : String(source ?? 'UnknownError');
46
+ const stack = typeof errorRecord?.stack === 'string'
47
+ ? errorRecord.stack
48
+ : typeof sourceRecord?.stack === 'string'
49
+ ? sourceRecord.stack
50
+ : '';
51
+ req.logErrorData = {
52
+ name: (0, log_data_1.truncateString)(name),
53
+ data: (0, log_data_1.limitLogEvent)(cleanData(source, getGlobalHiddenFields())),
54
+ stack: (0, log_data_1.truncateString)(stack),
55
+ };
56
+ }
57
+ catch {
58
+ req.logErrorData = {
59
+ name: 'LoggingError',
60
+ data: '[Unserializable]',
61
+ stack: '',
62
+ };
63
+ }
64
+ next(err);
65
+ };
66
+ exports.logErrorMiddleware = logErrorMiddleware;
67
+ const requestLogMiddleware = (targetLogger, formats = 'json', enabled = true, hiddenFields = []) => (_req, _res, next) => {
68
+ void targetLogger;
69
+ void formats;
70
+ void enabled;
71
+ void hiddenFields;
72
+ next();
73
+ };
74
+ exports.requestLogMiddleware = requestLogMiddleware;
75
+ const printGeneralLog = (message, type, targetLogger = null, isError = false, formats = 'json', enabled = true) => {
76
+ if (!enabled) {
77
+ return;
78
+ }
79
+ const selectedLogger = targetLogger || logging_1.default;
80
+ try {
81
+ const sanitized = cleanData(message, getGlobalHiddenFields());
82
+ const formatted = formats === 'json' ? sanitized : (0, log_data_1.safeStringify)(sanitized);
83
+ const limited = (0, log_data_1.limitLogEvent)(formatted);
84
+ const event = limited && typeof limited === 'object' && !Array.isArray(limited)
85
+ ? { ...limited, type }
86
+ : { message: limited, type };
87
+ if (isError) {
88
+ selectedLogger.error(event);
89
+ }
90
+ else {
91
+ selectedLogger.info(event);
92
+ }
93
+ }
94
+ catch {
95
+ try {
96
+ process.stderr.write(`${(0, log_data_1.safeStringify)({
97
+ level: 'error',
98
+ type: 'loggerFailure',
99
+ sourceType: (0, log_data_1.truncateString)(type),
100
+ message: 'The logger failed to serialize an event',
101
+ })}\n`);
102
+ }
103
+ catch {
104
+ // Logging failures must not affect application behavior.
105
+ }
106
+ }
107
+ };
108
+ exports.printGeneralLog = printGeneralLog;
109
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":";;;;;;AAOA,wDAA+B;AAC/B,yCAOoB;AAmJlB,8FAxJA,wBAAa,OAwJA;AAIb,oGA3JA,8BAAmB,OA2JA;AAEnB,8FA5JA,wBAAa,OA4JA;AACb,+FA3JA,yBAAc,OA2JA;AA/IhB,MAAM,qBAAqB,GAAG,GAAG,EAAE,CAChC,MAA4B,CAAC,YAAY,IAAI,EAAE,CAAC;AAEnD,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,KAAa,EAAE,MAAc,EAAE,EAAE,CAAC,CAAC;IACrE,MAAM,EAAE,MAAM,IAAI,GAAG;IACrB,OAAO,EAAE;QACP,IAAI;QACJ,MAAM,EAAE,KAAK;KACd;CACF,CAAC,CAAC;AA6HD,oCAAY;AA3Hd,MAAM,sBAAsB,GAAG,CAC7B,GAAwC,EACxC,IAAc,EACd,IAAkB,EAClB,EAAE;IACF,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC9B,IAAI,EAAE,CAAC;AACT,CAAC,CAAC;AAwHA,wDAAsB;AAtHxB,MAAM,SAAS,GAAG,CAAC,IAAa,EAAE,eAAyB,EAAE,EAAE,EAAE,CAC/D,IAAA,uBAAY,EAAC,IAAI,EAAE,YAAY,CAAC,CAAC;AAgHjC,8BAAS;AA9GX,MAAM,iBAAiB,GAAG,CAAC,IAAa,EAAE,eAAyB,EAAE,EAAE,EAAE,CACvE,IAAA,8BAAmB,EAAC,IAAA,wBAAa,EAAC,IAAI,CAAC,EAAE,YAAY,CAAC,CAAC;AA+GvD,8CAAiB;AA7GnB,MAAM,kBAAkB,GAAwB,CAC9C,GAAY,EACZ,GAAwC,EACxC,IAAc,EACd,IAAkB,EAClB,EAAE;IACF,IAAI,CAAC;QACH,MAAM,WAAW,GACf,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;YAC5B,CAAC,CAAE,GAA+B;YAClC,CAAC,CAAC,SAAS,CAAC;QAChB,MAAM,WAAW,GAAG,WAAW,EAAE,KAAK,CAAC;QACvC,MAAM,MAAM,GAAG,WAAW,IAAI,GAAG,CAAC;QAClC,MAAM,YAAY,GAChB,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;YAClC,CAAC,CAAE,MAAkC;YACrC,CAAC,CAAC,SAAS,CAAC;QAChB,MAAM,IAAI,GACR,MAAM,YAAY,KAAK;YACrB,CAAC,CAAC,MAAM,CAAC,IAAI;YACb,CAAC,CAAC,OAAO,YAAY,EAAE,IAAI,KAAK,QAAQ;gBACtC,CAAC,CAAC,YAAY,CAAC,IAAI;gBACnB,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,cAAc,CAAC,CAAC;QACzC,MAAM,KAAK,GACT,OAAO,WAAW,EAAE,KAAK,KAAK,QAAQ;YACpC,CAAC,CAAC,WAAW,CAAC,KAAK;YACnB,CAAC,CAAC,OAAO,YAAY,EAAE,KAAK,KAAK,QAAQ;gBACvC,CAAC,CAAC,YAAY,CAAC,KAAK;gBACpB,CAAC,CAAC,EAAE,CAAC;QAEX,GAAG,CAAC,YAAY,GAAG;YACjB,IAAI,EAAE,IAAA,yBAAc,EAAC,IAAI,CAAC;YAC1B,IAAI,EAAE,IAAA,wBAAa,EAAC,SAAS,CAAC,MAAM,EAAE,qBAAqB,EAAE,CAAC,CAAC;YAC/D,KAAK,EAAE,IAAA,yBAAc,EAAC,KAAK,CAAC;SAC7B,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,CAAC,YAAY,GAAG;YACjB,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,kBAAkB;YACxB,KAAK,EAAE,EAAE;SACV,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,CAAC;AACZ,CAAC,CAAC;AAmEA,gDAAkB;AAjEpB,MAAM,oBAAoB,GACxB,CACE,YAA8B,EAC9B,OAAO,GAAG,MAAM,EAChB,OAAO,GAAG,IAAI,EACd,eAAyB,EAAE,EAC3B,EAAE,CACJ,CAAC,IAAa,EAAE,IAAc,EAAE,IAAkB,EAAE,EAAE;IACpD,KAAK,YAAY,CAAC;IAClB,KAAK,OAAO,CAAC;IACb,KAAK,OAAO,CAAC;IACb,KAAK,YAAY,CAAC;IAClB,IAAI,EAAE,CAAC;AACT,CAAC,CAAC;AAwDF,oDAAoB;AAtDtB,MAAM,eAAe,GAAG,CACtB,OAAe,EACf,IAAY,EACZ,eAAwC,IAAI,EAC5C,OAAO,GAAG,KAAK,EACf,OAAO,GAAG,MAAM,EAChB,OAAO,GAAG,IAAI,EACd,EAAE;IACF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;IACT,CAAC;IAED,MAAM,cAAc,GAAG,YAAY,IAAI,iBAAM,CAAC;IAE9C,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,EAAE,qBAAqB,EAAE,CAAC,CAAC;QAC9D,MAAM,SAAS,GAAG,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAA,wBAAa,EAAC,SAAS,CAAC,CAAC;QAC5E,MAAM,OAAO,GAAG,IAAA,wBAAa,EAAC,SAAS,CAAC,CAAC;QACzC,MAAM,KAAK,GACT,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YAC/D,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE;YACtB,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAEjC,IAAI,OAAO,EAAE,CAAC;YACZ,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;YACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,IAAA,wBAAa,EAAC;gBACf,KAAK,EAAE,OAAO;gBACd,IAAI,EAAE,eAAe;gBACrB,UAAU,EAAE,IAAA,yBAAc,EAAC,IAAI,CAAC;gBAChC,OAAO,EAAE,yCAAyC;aACnD,CAAC,IAAI,CACP,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,yDAAyD;QAC3D,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAUA,0CAAe"}
@@ -0,0 +1,5 @@
1
+ import winston from 'winston';
2
+ declare const logger: winston.Logger;
3
+ export { logger };
4
+ export default logger;
5
+ //# sourceMappingURL=logging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../src/logging.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,SAAS,CAAC;AAgF9B,QAAA,MAAM,MAAM,gBASV,CAAC;AAiCH,OAAO,EAAE,MAAM,EAAE,CAAC;AAClB,eAAe,MAAM,CAAC"}
@@ -0,0 +1,130 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.logger = void 0;
40
+ const rTracer = __importStar(require("cls-rtracer"));
41
+ const winston_1 = __importDefault(require("winston"));
42
+ const log_data_1 = require("./log-data");
43
+ const VALID_LOG_LEVELS = new Set(['error', 'warn', 'info', 'debug']);
44
+ const configuredLevel = process.env.LOG_LEVEL?.toLowerCase();
45
+ const logLevel = configuredLevel && VALID_LOG_LEVELS.has(configuredLevel)
46
+ ? configuredLevel
47
+ : 'info';
48
+ const getHiddenFields = () => {
49
+ const applicationGlobal = global;
50
+ return applicationGlobal.hiddenFields ?? [];
51
+ };
52
+ const structuredMetadata = winston_1.default.format((info) => {
53
+ const currentLevel = info.level;
54
+ const sanitized = (0, log_data_1.limitLogEvent)((0, log_data_1.cleanLogData)(info, getHiddenFields()));
55
+ for (const key of Object.keys(info)) {
56
+ delete info[key];
57
+ }
58
+ if (sanitized &&
59
+ typeof sanitized === 'object' &&
60
+ !Array.isArray(sanitized)) {
61
+ Object.assign(info, sanitized);
62
+ }
63
+ else {
64
+ info.message = sanitized;
65
+ }
66
+ info.level = currentLevel;
67
+ info.service =
68
+ process.env.SERVICE_NAME ||
69
+ process.env.npm_package_name ||
70
+ 'unknown-service';
71
+ info.environment =
72
+ process.env.ENVIRONMENT || process.env.NODE_ENV || 'unknown';
73
+ if (process.env.AWS_REGION) {
74
+ info.region = process.env.AWS_REGION;
75
+ }
76
+ const requestId = rTracer.id();
77
+ if (requestId !== undefined && requestId !== null) {
78
+ info.requestId = requestId;
79
+ }
80
+ return info;
81
+ });
82
+ const oneLineJson = winston_1.default.format((info) => {
83
+ info[Symbol.for('message')] = (0, log_data_1.safeStringify)((0, log_data_1.limitLogEvent)(info));
84
+ return info;
85
+ });
86
+ const outputFormat = process.env.NODE_ENV === 'local'
87
+ ? winston_1.default.format.combine(winston_1.default.format.errors({ stack: true }), structuredMetadata(), winston_1.default.format.timestamp(), winston_1.default.format.prettyPrint())
88
+ : winston_1.default.format.combine(winston_1.default.format.errors({ stack: true }), structuredMetadata(), winston_1.default.format.timestamp(), oneLineJson());
89
+ const logger = winston_1.default.createLogger({
90
+ level: logLevel,
91
+ format: outputFormat,
92
+ transports: [
93
+ new winston_1.default.transports.Console({
94
+ stderrLevels: ['error'],
95
+ consoleWarnLevels: [],
96
+ }),
97
+ ],
98
+ });
99
+ exports.logger = logger;
100
+ process
101
+ .on('unhandledRejection', (reason, promise) => {
102
+ try {
103
+ logger.error({
104
+ type: 'unhandledRejection',
105
+ name: 'Unhandled Rejection at Promise',
106
+ error: reason,
107
+ promise,
108
+ });
109
+ }
110
+ catch {
111
+ process.stderr.write('{"level":"error","type":"unhandledRejection","message":"Logger failed while handling rejection"}\n');
112
+ }
113
+ })
114
+ .on('uncaughtException', (error) => {
115
+ try {
116
+ logger.error({
117
+ type: 'uncaughtException',
118
+ name: 'Uncaught Exception thrown',
119
+ error,
120
+ });
121
+ }
122
+ catch {
123
+ process.stderr.write('{"level":"error","type":"uncaughtException","message":"Logger failed while handling exception"}\n');
124
+ }
125
+ finally {
126
+ process.exit(1);
127
+ }
128
+ });
129
+ exports.default = logger;
130
+ //# sourceMappingURL=logging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.js","sourceRoot":"","sources":["../src/logging.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ declare const memoryMiddleware: import("express-serve-static-core").Router;
2
+ export { memoryMiddleware };
3
+ export default memoryMiddleware;
4
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AAKA,QAAA,MAAM,gBAAgB,4CAAmB,CAAC;AA4B1C,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAC5B,eAAe,gBAAgB,CAAC"}
package/dist/memory.js ADDED
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.memoryMiddleware = void 0;
7
+ const express_1 = __importDefault(require("express"));
8
+ const logger_1 = require("./logger");
9
+ const logging_1 = __importDefault(require("./logging"));
10
+ const memoryMiddleware = express_1.default.Router();
11
+ exports.memoryMiddleware = memoryMiddleware;
12
+ memoryMiddleware.use(async (req, res, next) => {
13
+ if (process.env.LOG_MEMORY_USAGE !== 'true') {
14
+ return next();
15
+ }
16
+ const startMemory = process.memoryUsage().heapUsed;
17
+ res.on('finish', () => {
18
+ const endMemory = process.memoryUsage().heapUsed;
19
+ const memoryUsed = endMemory - startMemory;
20
+ if (process.env.NODE_ENV !== 'local') {
21
+ (0, logger_1.printGeneralLog)({
22
+ memoryMb: memoryUsed / (1024 * 1024),
23
+ method: req.method,
24
+ url: req.path,
25
+ }, 'memory-usage', logging_1.default);
26
+ }
27
+ });
28
+ next();
29
+ });
30
+ exports.default = memoryMiddleware;
31
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":";;;;;;AAAA,sDAAmE;AAEnE,qCAA2C;AAC3C,wDAA+B;AAE/B,MAAM,gBAAgB,GAAG,iBAAO,CAAC,MAAM,EAAE,CAAC;AA4BjC,4CAAgB;AA1BzB,gBAAgB,CAAC,GAAG,CAClB,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;IACxD,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,MAAM,EAAE,CAAC;QAC5C,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC;IACnD,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACpB,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC;QACjD,MAAM,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC;QAC3C,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACrC,IAAA,wBAAe,EACb;gBACE,QAAQ,EAAE,UAAU,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;gBACpC,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,GAAG,EAAE,GAAG,CAAC,IAAI;aACd,EACD,cAAc,EACd,iBAAM,CACP,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IACH,IAAI,EAAE,CAAC;AACT,CAAC,CACF,CAAC;AAGF,kBAAe,gBAAgB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "@clicoh/logging",
3
+ "version": "1.0.0",
4
+ "description": "Structured JSON logging for ClicOH Node.js Express services",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "require": "./dist/index.js",
11
+ "default": "./dist/index.js"
12
+ },
13
+ "./logger": {
14
+ "types": "./dist/logger.d.ts",
15
+ "require": "./dist/logger.js",
16
+ "default": "./dist/logger.js"
17
+ },
18
+ "./log-data": {
19
+ "types": "./dist/log-data.d.ts",
20
+ "require": "./dist/log-data.js",
21
+ "default": "./dist/log-data.js"
22
+ },
23
+ "./audit": {
24
+ "types": "./dist/audit.d.ts",
25
+ "require": "./dist/audit.js",
26
+ "default": "./dist/audit.js"
27
+ },
28
+ "./memory": {
29
+ "types": "./dist/memory.d.ts",
30
+ "require": "./dist/memory.js",
31
+ "default": "./dist/memory.js"
32
+ }
33
+ },
34
+ "files": [
35
+ "dist",
36
+ "README.md"
37
+ ],
38
+ "scripts": {
39
+ "build": "tsc -p tsconfig.json",
40
+ "test": "bun run build && node --test tests/*.test.js",
41
+ "prepublishOnly": "bun run test"
42
+ },
43
+ "engines": {
44
+ "node": ">=18"
45
+ },
46
+ "peerDependencies": {
47
+ "cls-rtracer": "^2.6.0",
48
+ "express": "^4.18.0 || ^5.0.0",
49
+ "winston": "^3.11.0"
50
+ },
51
+ "devDependencies": {
52
+ "@types/express": "^5.0.0",
53
+ "@types/node": "^22.10.0",
54
+ "cls-rtracer": "2.6.3",
55
+ "express": "^5.2.1",
56
+ "typescript": "^5.7.2",
57
+ "winston": "3.19.0"
58
+ },
59
+ "publishConfig": {
60
+ "registry": "https://registry.npmjs.org",
61
+ "access": "public"
62
+ },
63
+ "repository": {
64
+ "type": "git",
65
+ "url": "git+https://github.com/clicOH/logging-node.git"
66
+ },
67
+ "license": "UNLICENSED",
68
+ "private": false,
69
+ "packageManager": "bun@1.4.2"
70
+ }