@aifabrix/miso-client 3.4.2 → 3.8.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/CHANGELOG.md +306 -12
- package/dist/api/auth-cache.api.d.ts.map +1 -1
- package/dist/api/auth-cache.api.js +27 -5
- package/dist/api/auth-cache.api.js.map +1 -1
- package/dist/api/auth-login.api.d.ts.map +1 -1
- package/dist/api/auth-login.api.js +49 -6
- package/dist/api/auth-login.api.js.map +1 -1
- package/dist/api/auth-token.api.d.ts.map +1 -1
- package/dist/api/auth-token.api.js +99 -7
- package/dist/api/auth-token.api.js.map +1 -1
- package/dist/api/auth-user.api.d.ts.map +1 -1
- package/dist/api/auth-user.api.js +22 -4
- package/dist/api/auth-user.api.js.map +1 -1
- package/dist/api/auth.api.d.ts +2 -9
- package/dist/api/auth.api.d.ts.map +1 -1
- package/dist/api/auth.api.js +1 -66
- package/dist/api/auth.api.js.map +1 -1
- package/dist/api/logs-create.api.d.ts.map +1 -1
- package/dist/api/logs-create.api.js +57 -4
- package/dist/api/logs-create.api.js.map +1 -1
- package/dist/api/logs-export.api.d.ts.map +1 -1
- package/dist/api/logs-export.api.js +7 -1
- package/dist/api/logs-export.api.js.map +1 -1
- package/dist/api/logs-list.api.d.ts.map +1 -1
- package/dist/api/logs-list.api.js +32 -6
- package/dist/api/logs-list.api.js.map +1 -1
- package/dist/api/logs-stats.api.d.ts.map +1 -1
- package/dist/api/logs-stats.api.js +22 -4
- package/dist/api/logs-stats.api.js.map +1 -1
- package/dist/api/permissions.api.d.ts +2 -1
- package/dist/api/permissions.api.d.ts.map +1 -1
- package/dist/api/permissions.api.js +16 -5
- package/dist/api/permissions.api.js.map +1 -1
- package/dist/api/roles.api.d.ts +2 -1
- package/dist/api/roles.api.d.ts.map +1 -1
- package/dist/api/roles.api.js +16 -5
- package/dist/api/roles.api.js.map +1 -1
- package/dist/api/types/logs.types.d.ts +44 -7
- package/dist/api/types/logs.types.d.ts.map +1 -1
- package/dist/express/client-token-endpoint.d.ts.map +1 -1
- package/dist/express/client-token-endpoint.js +42 -5
- package/dist/express/client-token-endpoint.js.map +1 -1
- package/dist/express/error-handler.d.ts.map +1 -1
- package/dist/express/error-handler.js +32 -8
- package/dist/express/error-handler.js.map +1 -1
- package/dist/express/index.d.ts +1 -0
- package/dist/express/index.d.ts.map +1 -1
- package/dist/express/index.js +4 -1
- package/dist/express/index.js.map +1 -1
- package/dist/express/logger-context.middleware.d.ts +46 -0
- package/dist/express/logger-context.middleware.d.ts.map +1 -0
- package/dist/express/logger-context.middleware.js +99 -0
- package/dist/express/logger-context.middleware.js.map +1 -0
- package/dist/index.d.ts +6 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -5
- package/dist/index.js.map +1 -1
- package/dist/services/auth.service.d.ts.map +1 -1
- package/dist/services/auth.service.js +97 -8
- package/dist/services/auth.service.js.map +1 -1
- package/dist/services/browser-permission.service.d.ts +5 -0
- package/dist/services/browser-permission.service.d.ts.map +1 -1
- package/dist/services/browser-permission.service.js +39 -2
- package/dist/services/browser-permission.service.js.map +1 -1
- package/dist/services/browser-role.service.d.ts +5 -0
- package/dist/services/browser-role.service.d.ts.map +1 -1
- package/dist/services/browser-role.service.js +45 -2
- package/dist/services/browser-role.service.js.map +1 -1
- package/dist/services/logger/index.d.ts +10 -0
- package/dist/services/logger/index.d.ts.map +1 -0
- package/dist/services/logger/index.js +22 -0
- package/dist/services/logger/index.js.map +1 -0
- package/dist/services/logger/logger-chain.d.ts +90 -0
- package/dist/services/logger/logger-chain.d.ts.map +1 -0
- package/dist/services/logger/logger-chain.js +169 -0
- package/dist/services/logger/logger-chain.js.map +1 -0
- package/dist/services/logger/logger-context-storage.d.ts +73 -0
- package/dist/services/logger/logger-context-storage.d.ts.map +1 -0
- package/dist/services/logger/logger-context-storage.js +86 -0
- package/dist/services/logger/logger-context-storage.js.map +1 -0
- package/dist/services/logger/logger-context.d.ts +85 -0
- package/dist/services/logger/logger-context.d.ts.map +1 -0
- package/dist/services/logger/logger-context.js +192 -0
- package/dist/services/logger/logger-context.js.map +1 -0
- package/dist/services/{logger.service.d.ts → logger/logger.service.d.ts} +59 -72
- package/dist/services/logger/logger.service.d.ts.map +1 -0
- package/dist/services/logger/logger.service.js +403 -0
- package/dist/services/logger/logger.service.js.map +1 -0
- package/dist/services/logger/unified-logger.factory.d.ts +87 -0
- package/dist/services/logger/unified-logger.factory.d.ts.map +1 -0
- package/dist/services/logger/unified-logger.factory.js +120 -0
- package/dist/services/logger/unified-logger.factory.js.map +1 -0
- package/dist/services/logger/unified-logger.service.d.ts +89 -0
- package/dist/services/logger/unified-logger.service.d.ts.map +1 -0
- package/dist/services/logger/unified-logger.service.js +178 -0
- package/dist/services/logger/unified-logger.service.js.map +1 -0
- package/dist/services/permission.service.d.ts +5 -0
- package/dist/services/permission.service.d.ts.map +1 -1
- package/dist/services/permission.service.js +42 -2
- package/dist/services/permission.service.js.map +1 -1
- package/dist/services/redis.service.d.ts.map +1 -1
- package/dist/services/redis.service.js +2 -0
- package/dist/services/redis.service.js.map +1 -1
- package/dist/services/role.service.d.ts +5 -0
- package/dist/services/role.service.d.ts.map +1 -1
- package/dist/services/role.service.js +42 -2
- package/dist/services/role.service.js.map +1 -1
- package/dist/types/config.types.d.ts +1 -0
- package/dist/types/config.types.d.ts.map +1 -1
- package/dist/types/config.types.js.map +1 -1
- package/dist/types/filter.types.d.ts +6 -6
- package/dist/types/filter.types.d.ts.map +1 -1
- package/dist/types/filter.types.js +14 -5
- package/dist/types/filter.types.js.map +1 -1
- package/dist/utils/config-loader.d.ts.map +1 -1
- package/dist/utils/config-loader.js +10 -0
- package/dist/utils/config-loader.js.map +1 -1
- package/dist/utils/console-logger.d.ts +21 -0
- package/dist/utils/console-logger.d.ts.map +1 -0
- package/dist/utils/console-logger.js +58 -0
- package/dist/utils/console-logger.js.map +1 -0
- package/dist/utils/controller-url-resolver.d.ts.map +1 -1
- package/dist/utils/controller-url-resolver.js +5 -0
- package/dist/utils/controller-url-resolver.js.map +1 -1
- package/dist/utils/data-client-auth.d.ts.map +1 -1
- package/dist/utils/data-client-auth.js +34 -2
- package/dist/utils/data-client-auth.js.map +1 -1
- package/dist/utils/data-client-auto-init.d.ts.map +1 -1
- package/dist/utils/data-client-auto-init.js +59 -3
- package/dist/utils/data-client-auto-init.js.map +1 -1
- package/dist/utils/data-client-request.d.ts.map +1 -1
- package/dist/utils/data-client-request.js +78 -2
- package/dist/utils/data-client-request.js.map +1 -1
- package/dist/utils/data-client.d.ts.map +1 -1
- package/dist/utils/data-client.js +25 -19
- package/dist/utils/data-client.js.map +1 -1
- package/dist/utils/environment-token.d.ts.map +1 -1
- package/dist/utils/environment-token.js +37 -57
- package/dist/utils/environment-token.js.map +1 -1
- package/dist/utils/error-extractor.d.ts +52 -0
- package/dist/utils/error-extractor.d.ts.map +1 -0
- package/dist/utils/error-extractor.js +136 -0
- package/dist/utils/error-extractor.js.map +1 -0
- package/dist/utils/filter.utils.d.ts +115 -3
- package/dist/utils/filter.utils.d.ts.map +1 -1
- package/dist/utils/filter.utils.js +298 -27
- package/dist/utils/filter.utils.js.map +1 -1
- package/dist/utils/http-client-audit.d.ts +1 -1
- package/dist/utils/http-client-audit.d.ts.map +1 -1
- package/dist/utils/http-client.d.ts +1 -1
- package/dist/utils/http-client.d.ts.map +1 -1
- package/dist/utils/internal-http-client.d.ts +12 -0
- package/dist/utils/internal-http-client.d.ts.map +1 -1
- package/dist/utils/internal-http-client.js +235 -11
- package/dist/utils/internal-http-client.js.map +1 -1
- package/dist/utils/response-validator.d.ts +59 -0
- package/dist/utils/response-validator.d.ts.map +1 -0
- package/dist/utils/response-validator.js +115 -0
- package/dist/utils/response-validator.js.map +1 -0
- package/dist/utils/token-utils.d.ts.map +1 -1
- package/dist/utils/token-utils.js +75 -4
- package/dist/utils/token-utils.js.map +1 -1
- package/package.json +2 -1
- package/dist/services/logger.service.d.ts.map +0 -1
- package/dist/services/logger.service.js +0 -488
- package/dist/services/logger.service.js.map +0 -1
|
@@ -3,10 +3,11 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { EventEmitter } from "events";
|
|
5
5
|
import { Request } from "express";
|
|
6
|
-
import { HttpClient } from "
|
|
7
|
-
import { ApiClient } from "
|
|
8
|
-
import { RedisService } from "
|
|
9
|
-
import {
|
|
6
|
+
import { HttpClient } from "../../utils/http-client";
|
|
7
|
+
import { ApiClient } from "../../api";
|
|
8
|
+
import { RedisService } from "../redis.service";
|
|
9
|
+
import { LogEntry } from "../../types/config.types";
|
|
10
|
+
import { LoggerChain } from "./logger-chain";
|
|
10
11
|
export interface ClientLoggingOptions {
|
|
11
12
|
applicationId?: string;
|
|
12
13
|
userId?: string;
|
|
@@ -55,16 +56,16 @@ export declare class LoggerService extends EventEmitter {
|
|
|
55
56
|
setMasking(enabled: boolean): void;
|
|
56
57
|
/**
|
|
57
58
|
* Generate unique correlation ID for request tracking
|
|
59
|
+
* Public method to allow other modules to generate consistent correlation IDs
|
|
60
|
+
*
|
|
61
|
+
* @returns Unique correlation ID string
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```typescript
|
|
65
|
+
* const correlationId = loggerService.generateCorrelationId();
|
|
66
|
+
* ```
|
|
58
67
|
*/
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Extract JWT token information
|
|
62
|
-
*/
|
|
63
|
-
private extractJWTContext;
|
|
64
|
-
/**
|
|
65
|
-
* Extract metadata from environment (browser or Node.js)
|
|
66
|
-
*/
|
|
67
|
-
private extractMetadata;
|
|
68
|
+
generateCorrelationId(): string;
|
|
68
69
|
/**
|
|
69
70
|
* Log error message with optional stack trace and enhanced options
|
|
70
71
|
*/
|
|
@@ -92,100 +93,86 @@ export declare class LoggerService extends EventEmitter {
|
|
|
92
93
|
withToken(token: string): LoggerChain;
|
|
93
94
|
withoutMasking(): LoggerChain;
|
|
94
95
|
/**
|
|
95
|
-
*
|
|
96
|
-
*
|
|
96
|
+
* Get LogEntry object with request context extracted
|
|
97
|
+
* Extracts IP, method, path, userAgent, correlationId, userId from Express Request
|
|
98
|
+
* Returns structured LogEntry object ready for external logger tables
|
|
97
99
|
*
|
|
98
100
|
* @param req - Express Request object
|
|
99
|
-
* @
|
|
101
|
+
* @param message - Log message
|
|
102
|
+
* @param level - Optional log level (defaults to 'info')
|
|
103
|
+
* @param context - Optional additional context
|
|
104
|
+
* @returns Complete LogEntry object with all request context extracted
|
|
100
105
|
*
|
|
101
106
|
* @example
|
|
102
107
|
* ```typescript
|
|
103
|
-
*
|
|
108
|
+
* const logEntry = client.log.getLogWithRequest(req, 'User action', 'info', { action: 'login' });
|
|
109
|
+
* await myCustomLogger.save(logEntry); // Save to own logger table
|
|
104
110
|
* ```
|
|
105
111
|
*/
|
|
106
|
-
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Method chaining class for fluent logging API
|
|
110
|
-
*/
|
|
111
|
-
export declare class LoggerChain {
|
|
112
|
-
private logger;
|
|
113
|
-
private context;
|
|
114
|
-
private options;
|
|
115
|
-
constructor(logger: LoggerService, context?: Record<string, unknown>, options?: ClientLoggingOptions);
|
|
116
|
-
addContext(key: string, value: unknown): LoggerChain;
|
|
117
|
-
addUser(userId: string): LoggerChain;
|
|
118
|
-
addApplication(applicationId: string): LoggerChain;
|
|
119
|
-
addCorrelation(correlationId: string): LoggerChain;
|
|
120
|
-
withToken(token: string): LoggerChain;
|
|
121
|
-
withoutMasking(): LoggerChain;
|
|
112
|
+
getLogWithRequest(req: Request, message: string, level?: LogEntry["level"], context?: Record<string, unknown>): LogEntry;
|
|
122
113
|
/**
|
|
123
|
-
*
|
|
114
|
+
* Get LogEntry object with provided context
|
|
115
|
+
* Generates correlation ID automatically and extracts metadata from environment
|
|
124
116
|
*
|
|
125
|
-
* @param context -
|
|
126
|
-
* @
|
|
117
|
+
* @param context - Context object to include in logs
|
|
118
|
+
* @param message - Log message
|
|
119
|
+
* @param level - Optional log level (defaults to 'info')
|
|
120
|
+
* @returns Complete LogEntry object
|
|
127
121
|
*
|
|
128
122
|
* @example
|
|
129
123
|
* ```typescript
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
* sourceKey: 'datasource-1',
|
|
133
|
-
* sourceDisplayName: 'PostgreSQL DB',
|
|
134
|
-
* externalSystemKey: 'system-1',
|
|
135
|
-
* recordKey: 'record-123'
|
|
136
|
-
* })
|
|
137
|
-
* .info('Sync completed');
|
|
124
|
+
* const logEntry = client.log.getWithContext({ operation: 'sync' }, 'Sync started');
|
|
125
|
+
* await myCustomLogger.save(logEntry);
|
|
138
126
|
* ```
|
|
139
127
|
*/
|
|
140
|
-
|
|
128
|
+
getWithContext(context: Record<string, unknown>, message: string, level?: LogEntry["level"]): LogEntry;
|
|
141
129
|
/**
|
|
142
|
-
*
|
|
130
|
+
* Get LogEntry object with token context extracted
|
|
131
|
+
* Extracts userId, sessionId, applicationId from JWT token
|
|
132
|
+
* Generates correlation ID automatically
|
|
143
133
|
*
|
|
144
|
-
* @param
|
|
145
|
-
* @param
|
|
146
|
-
* @
|
|
134
|
+
* @param token - JWT token to extract user context from
|
|
135
|
+
* @param message - Log message
|
|
136
|
+
* @param level - Optional log level (defaults to 'info')
|
|
137
|
+
* @param context - Optional additional context
|
|
138
|
+
* @returns Complete LogEntry object with user context
|
|
147
139
|
*
|
|
148
140
|
* @example
|
|
149
141
|
* ```typescript
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
* .info('API call completed');
|
|
142
|
+
* const logEntry = client.log.getWithToken(token, 'Token validated', 'audit');
|
|
143
|
+
* await myCustomLogger.save(logEntry);
|
|
153
144
|
* ```
|
|
154
145
|
*/
|
|
155
|
-
|
|
146
|
+
getWithToken(token: string, message: string, level?: LogEntry["level"], context?: Record<string, unknown>): LogEntry;
|
|
156
147
|
/**
|
|
157
|
-
*
|
|
148
|
+
* Get LogEntry object with request context extracted (alias for getLogWithRequest)
|
|
149
|
+
* Alias for getLogWithRequest() for consistency with existing forRequest() pattern
|
|
158
150
|
*
|
|
159
|
-
* @param
|
|
160
|
-
* @param
|
|
161
|
-
* @param
|
|
162
|
-
* @
|
|
151
|
+
* @param req - Express Request object
|
|
152
|
+
* @param message - Log message
|
|
153
|
+
* @param level - Optional log level (defaults to 'info')
|
|
154
|
+
* @param context - Optional additional context
|
|
155
|
+
* @returns Complete LogEntry object
|
|
163
156
|
*
|
|
164
157
|
* @example
|
|
165
158
|
* ```typescript
|
|
166
|
-
*
|
|
167
|
-
*
|
|
168
|
-
* .info('Upstream API call completed');
|
|
159
|
+
* const logEntry = client.log.getForRequest(req, 'User action', 'info', { action: 'login' });
|
|
160
|
+
* await myCustomLogger.save(logEntry);
|
|
169
161
|
* ```
|
|
170
162
|
*/
|
|
171
|
-
|
|
163
|
+
getForRequest(req: Request, message: string, level?: LogEntry["level"], context?: Record<string, unknown>): LogEntry;
|
|
172
164
|
/**
|
|
173
|
-
*
|
|
174
|
-
*
|
|
165
|
+
* Create logger chain with request context pre-populated
|
|
166
|
+
* Auto-extracts: IP, method, path, user-agent, correlation ID, user from JWT
|
|
175
167
|
*
|
|
176
168
|
* @param req - Express Request object
|
|
177
|
-
* @returns LoggerChain
|
|
169
|
+
* @returns LoggerChain with request context pre-populated
|
|
178
170
|
*
|
|
179
171
|
* @example
|
|
180
172
|
* ```typescript
|
|
181
|
-
* await miso.log
|
|
182
|
-
* .withRequest(req)
|
|
183
|
-
* .info("Processing request");
|
|
173
|
+
* await miso.log.forRequest(req).info("Processing request");
|
|
184
174
|
* ```
|
|
185
175
|
*/
|
|
186
|
-
|
|
187
|
-
error(message: string, stackTrace?: string): Promise<void>;
|
|
188
|
-
info(message: string): Promise<void>;
|
|
189
|
-
audit(action: string, resource: string): Promise<void>;
|
|
176
|
+
forRequest(req: Request): LoggerChain;
|
|
190
177
|
}
|
|
191
178
|
//# sourceMappingURL=logger.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.service.d.ts","sourceRoot":"","sources":["../../../src/services/logger/logger.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Logger service for application logging and audit events
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.LoggerService = void 0;
|
|
7
|
+
const events_1 = require("events");
|
|
8
|
+
const data_masker_1 = require("../../utils/data-masker");
|
|
9
|
+
const audit_log_queue_1 = require("../../utils/audit-log-queue");
|
|
10
|
+
const logger_chain_1 = require("./logger-chain");
|
|
11
|
+
const logger_context_1 = require("./logger-context");
|
|
12
|
+
class LoggerService extends events_1.EventEmitter {
|
|
13
|
+
constructor(httpClient, redis) {
|
|
14
|
+
super(); // Initialize EventEmitter
|
|
15
|
+
this.maskSensitiveData = true; // Default: mask sensitive data
|
|
16
|
+
this.correlationCounter = 0;
|
|
17
|
+
this.auditLogQueue = null;
|
|
18
|
+
// Circuit breaker for HTTP logging - skip attempts after repeated failures
|
|
19
|
+
this.httpLoggingFailures = 0;
|
|
20
|
+
this.httpLoggingDisabledUntil = null;
|
|
21
|
+
this.config = httpClient.config;
|
|
22
|
+
this.redis = redis;
|
|
23
|
+
this.httpClient = httpClient;
|
|
24
|
+
// Initialize audit log queue if batch logging is enabled
|
|
25
|
+
const auditConfig = this.config.audit || {};
|
|
26
|
+
if (auditConfig.batchSize !== undefined ||
|
|
27
|
+
auditConfig.batchInterval !== undefined) {
|
|
28
|
+
this.auditLogQueue = new audit_log_queue_1.AuditLogQueue(httpClient, redis, this.config, this);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Set ApiClient instance (used to resolve circular dependency)
|
|
33
|
+
* @param apiClient - ApiClient instance
|
|
34
|
+
*/
|
|
35
|
+
setApiClient(apiClient) {
|
|
36
|
+
this.apiClient = apiClient;
|
|
37
|
+
// Also set ApiClient in AuditLogQueue if available
|
|
38
|
+
if (this.auditLogQueue) {
|
|
39
|
+
this.auditLogQueue.setApiClient(apiClient);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Enable or disable sensitive data masking
|
|
44
|
+
*/
|
|
45
|
+
setMasking(enabled) {
|
|
46
|
+
this.maskSensitiveData = enabled;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Generate unique correlation ID for request tracking
|
|
50
|
+
* Public method to allow other modules to generate consistent correlation IDs
|
|
51
|
+
*
|
|
52
|
+
* @returns Unique correlation ID string
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```typescript
|
|
56
|
+
* const correlationId = loggerService.generateCorrelationId();
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
generateCorrelationId() {
|
|
60
|
+
this.correlationCounter = (this.correlationCounter + 1) % 10000;
|
|
61
|
+
const timestamp = Date.now();
|
|
62
|
+
const random = Math.random().toString(36).substring(2, 8);
|
|
63
|
+
// Use clientId instead of applicationKey
|
|
64
|
+
const clientPrefix = this.config.clientId.substring(0, 10);
|
|
65
|
+
return `${clientPrefix}-${timestamp}-${this.correlationCounter}-${random}`;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Log error message with optional stack trace and enhanced options
|
|
69
|
+
*/
|
|
70
|
+
async error(message, context, stackTrace, options) {
|
|
71
|
+
await this.log("error", message, context, stackTrace, options);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Log audit event with enhanced options
|
|
75
|
+
*/
|
|
76
|
+
async audit(action, resource, context, options) {
|
|
77
|
+
const auditContext = {
|
|
78
|
+
action,
|
|
79
|
+
resource,
|
|
80
|
+
...context,
|
|
81
|
+
};
|
|
82
|
+
await this.log("audit", `Audit: ${action} on ${resource}`, auditContext, undefined, options);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Log info message with enhanced options
|
|
86
|
+
*/
|
|
87
|
+
async info(message, context, options) {
|
|
88
|
+
await this.log("info", message, context, undefined, options);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Log debug message with enhanced options
|
|
92
|
+
*/
|
|
93
|
+
async debug(message, context, options) {
|
|
94
|
+
if (this.config.logLevel === "debug") {
|
|
95
|
+
await this.log("debug", message, context, undefined, options);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Internal log method with enhanced features
|
|
100
|
+
*/
|
|
101
|
+
async log(level, message, context, stackTrace, options) {
|
|
102
|
+
// Extract JWT context if token provided
|
|
103
|
+
const jwtContext = options?.token
|
|
104
|
+
? (0, logger_context_1.extractJwtContext)(options.token)
|
|
105
|
+
: {};
|
|
106
|
+
// Extract environment metadata
|
|
107
|
+
const metadata = (0, logger_context_1.extractEnvironmentMetadata)();
|
|
108
|
+
// Generate correlation ID if not provided
|
|
109
|
+
const correlationId = options?.correlationId || this.generateCorrelationId();
|
|
110
|
+
// Mask sensitive data in context if enabled
|
|
111
|
+
const maskSensitive = options?.maskSensitiveData !== false && this.maskSensitiveData;
|
|
112
|
+
const maskedContext = maskSensitive && context
|
|
113
|
+
? data_masker_1.DataMasker.maskSensitiveData(context)
|
|
114
|
+
: context;
|
|
115
|
+
const logEntry = {
|
|
116
|
+
timestamp: new Date().toISOString(),
|
|
117
|
+
level,
|
|
118
|
+
environment: "unknown", // Backend extracts from client credentials
|
|
119
|
+
application: this.config.clientId, // Use clientId as application identifier
|
|
120
|
+
applicationId: options?.applicationId || "", // Optional from options
|
|
121
|
+
message,
|
|
122
|
+
context: maskedContext,
|
|
123
|
+
stackTrace,
|
|
124
|
+
correlationId,
|
|
125
|
+
userId: options?.userId || jwtContext.userId,
|
|
126
|
+
sessionId: options?.sessionId || jwtContext.sessionId,
|
|
127
|
+
requestId: options?.requestId,
|
|
128
|
+
ipAddress: options?.ipAddress || metadata.ipAddress,
|
|
129
|
+
userAgent: options?.userAgent || metadata.userAgent,
|
|
130
|
+
...metadata,
|
|
131
|
+
// Indexed context fields
|
|
132
|
+
sourceKey: options?.sourceKey,
|
|
133
|
+
sourceDisplayName: options?.sourceDisplayName,
|
|
134
|
+
externalSystemKey: options?.externalSystemKey,
|
|
135
|
+
externalSystemDisplayName: options?.externalSystemDisplayName,
|
|
136
|
+
recordKey: options?.recordKey,
|
|
137
|
+
recordDisplayName: options?.recordDisplayName,
|
|
138
|
+
// Credential context
|
|
139
|
+
credentialId: options?.credentialId,
|
|
140
|
+
credentialType: options?.credentialType,
|
|
141
|
+
// Request metrics
|
|
142
|
+
requestSize: options?.requestSize,
|
|
143
|
+
responseSize: options?.responseSize,
|
|
144
|
+
durationMs: options?.durationMs,
|
|
145
|
+
// Error classification
|
|
146
|
+
errorCategory: options?.errorCategory,
|
|
147
|
+
httpStatusCategory: options?.httpStatusCategory,
|
|
148
|
+
};
|
|
149
|
+
// If emitEvents is enabled, emit event and skip HTTP/Redis
|
|
150
|
+
if (this.config.emitEvents) {
|
|
151
|
+
// Emit log event - same payload structure as REST API
|
|
152
|
+
// Listener can check logEntry.level to filter by log level if needed
|
|
153
|
+
this.emit("log", logEntry);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
// Use batch queue for audit logs if available
|
|
157
|
+
if (level === "audit" && this.auditLogQueue) {
|
|
158
|
+
await this.auditLogQueue.add(logEntry);
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
// Try Redis first (if available)
|
|
162
|
+
if (this.redis.isConnected()) {
|
|
163
|
+
const queueName = `logs:${this.config.clientId}`;
|
|
164
|
+
const success = await this.redis.rpush(queueName, JSON.stringify(logEntry));
|
|
165
|
+
if (success) {
|
|
166
|
+
return; // Successfully queued in Redis
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// Check circuit breaker - skip HTTP logging if we've had too many failures
|
|
170
|
+
const now = Date.now();
|
|
171
|
+
if (this.httpLoggingDisabledUntil && now < this.httpLoggingDisabledUntil) {
|
|
172
|
+
// Circuit breaker is open - skip HTTP logging attempt
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
// Send to unified logging endpoint with client credentials
|
|
176
|
+
try {
|
|
177
|
+
if (!this.apiClient) {
|
|
178
|
+
throw new Error('ApiClient not initialized. Call setApiClient() before logging.');
|
|
179
|
+
}
|
|
180
|
+
// Map LogEntry to CreateLogRequest format
|
|
181
|
+
const logType = level === 'audit' ? 'audit' : level === 'error' ? 'error' : 'general';
|
|
182
|
+
// Map level: 'audit' -> 'info', others map directly (CreateLogRequest.data.level doesn't accept 'audit')
|
|
183
|
+
const logLevel = level === 'audit' ? 'info' : level === 'error' ? 'error' : level === 'info' ? 'info' : 'debug';
|
|
184
|
+
// Build context with all LogEntry fields (backend extracts environment/application from credentials)
|
|
185
|
+
const enrichedContext = {
|
|
186
|
+
...logEntry.context,
|
|
187
|
+
// Include additional LogEntry fields in context
|
|
188
|
+
userId: logEntry.userId,
|
|
189
|
+
sessionId: logEntry.sessionId,
|
|
190
|
+
requestId: logEntry.requestId,
|
|
191
|
+
ipAddress: logEntry.ipAddress,
|
|
192
|
+
userAgent: logEntry.userAgent,
|
|
193
|
+
hostname: logEntry.hostname,
|
|
194
|
+
applicationId: logEntry.applicationId,
|
|
195
|
+
sourceKey: logEntry.sourceKey,
|
|
196
|
+
sourceDisplayName: logEntry.sourceDisplayName,
|
|
197
|
+
externalSystemKey: logEntry.externalSystemKey,
|
|
198
|
+
externalSystemDisplayName: logEntry.externalSystemDisplayName,
|
|
199
|
+
recordKey: logEntry.recordKey,
|
|
200
|
+
recordDisplayName: logEntry.recordDisplayName,
|
|
201
|
+
credentialId: logEntry.credentialId,
|
|
202
|
+
credentialType: logEntry.credentialType,
|
|
203
|
+
requestSize: logEntry.requestSize,
|
|
204
|
+
responseSize: logEntry.responseSize,
|
|
205
|
+
durationMs: logEntry.durationMs,
|
|
206
|
+
errorCategory: logEntry.errorCategory,
|
|
207
|
+
httpStatusCategory: logEntry.httpStatusCategory,
|
|
208
|
+
};
|
|
209
|
+
// Remove undefined values to keep payload clean
|
|
210
|
+
Object.keys(enrichedContext).forEach(key => {
|
|
211
|
+
if (enrichedContext[key] === undefined) {
|
|
212
|
+
delete enrichedContext[key];
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
// Include stackTrace in context if present
|
|
216
|
+
if (logEntry.stackTrace) {
|
|
217
|
+
enrichedContext.stackTrace = logEntry.stackTrace;
|
|
218
|
+
}
|
|
219
|
+
// For audit logs, extract required fields from context
|
|
220
|
+
if (level === 'audit') {
|
|
221
|
+
// Extract action and resource from context (set by audit() method)
|
|
222
|
+
const auditAction = enrichedContext.action;
|
|
223
|
+
const auditResource = enrichedContext.resource;
|
|
224
|
+
// Extract entityType and entityId if already provided in context
|
|
225
|
+
const providedEntityType = enrichedContext.entityType;
|
|
226
|
+
const providedEntityId = enrichedContext.entityId;
|
|
227
|
+
const providedOldValues = enrichedContext.oldValues;
|
|
228
|
+
const providedNewValues = enrichedContext.newValues;
|
|
229
|
+
// Remove fields that will be moved to data object (not in context)
|
|
230
|
+
delete enrichedContext.action;
|
|
231
|
+
delete enrichedContext.resource;
|
|
232
|
+
delete enrichedContext.entityType;
|
|
233
|
+
delete enrichedContext.entityId;
|
|
234
|
+
delete enrichedContext.oldValues;
|
|
235
|
+
delete enrichedContext.newValues;
|
|
236
|
+
// Map to required audit log fields
|
|
237
|
+
// entityType: Type of entity (use provided, or default to "HTTP Request" for HTTP requests, or "API Endpoint" for API paths)
|
|
238
|
+
// entityId: The resource/URL being acted upon (use provided, or default to resource/URL)
|
|
239
|
+
// action: The action being performed (use provided action from audit() call)
|
|
240
|
+
const entityType = providedEntityType ||
|
|
241
|
+
(auditResource && auditResource.startsWith('/api/') ? 'API Endpoint' : 'HTTP Request');
|
|
242
|
+
const entityId = providedEntityId || auditResource || 'unknown';
|
|
243
|
+
const action = auditAction || 'unknown';
|
|
244
|
+
await this.apiClient.logs.createLog({
|
|
245
|
+
type: logType,
|
|
246
|
+
data: {
|
|
247
|
+
level: logLevel,
|
|
248
|
+
message: logEntry.message,
|
|
249
|
+
context: enrichedContext,
|
|
250
|
+
correlationId: logEntry.correlationId,
|
|
251
|
+
entityType,
|
|
252
|
+
entityId,
|
|
253
|
+
action,
|
|
254
|
+
// Include oldValues and newValues if present
|
|
255
|
+
oldValues: providedOldValues,
|
|
256
|
+
newValues: providedNewValues,
|
|
257
|
+
},
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
await this.apiClient.logs.createLog({
|
|
262
|
+
type: logType,
|
|
263
|
+
data: {
|
|
264
|
+
level: logLevel,
|
|
265
|
+
message: logEntry.message,
|
|
266
|
+
context: enrichedContext,
|
|
267
|
+
correlationId: logEntry.correlationId,
|
|
268
|
+
},
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
// Success - reset failure counter
|
|
272
|
+
this.httpLoggingFailures = 0;
|
|
273
|
+
this.httpLoggingDisabledUntil = null;
|
|
274
|
+
}
|
|
275
|
+
catch (error) {
|
|
276
|
+
// Failed to send log to controller
|
|
277
|
+
// Check if it's a 401 (token expired) - don't count towards failure threshold
|
|
278
|
+
const isAuthError = error instanceof Error &&
|
|
279
|
+
(error.message.includes('401') ||
|
|
280
|
+
error.message.includes('Unauthorized') ||
|
|
281
|
+
error.statusCode === 401);
|
|
282
|
+
if (!isAuthError) {
|
|
283
|
+
// Only increment failure counter for non-auth errors
|
|
284
|
+
this.httpLoggingFailures++;
|
|
285
|
+
if (this.httpLoggingFailures >= LoggerService.MAX_FAILURES) {
|
|
286
|
+
// Open circuit breaker - disable HTTP logging for a period
|
|
287
|
+
this.httpLoggingDisabledUntil = now + LoggerService.DISABLE_DURATION_MS;
|
|
288
|
+
this.httpLoggingFailures = 0; // Reset counter for next attempt after cooldown
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
// Silently fail to avoid infinite logging loops
|
|
292
|
+
// Application should implement retry or buffer strategy if needed
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Method chaining support for complex logging scenarios
|
|
297
|
+
*/
|
|
298
|
+
withContext(context) {
|
|
299
|
+
return new logger_chain_1.LoggerChain(this, context);
|
|
300
|
+
}
|
|
301
|
+
withToken(token) {
|
|
302
|
+
return new logger_chain_1.LoggerChain(this, {}, { token });
|
|
303
|
+
}
|
|
304
|
+
withoutMasking() {
|
|
305
|
+
return new logger_chain_1.LoggerChain(this, {}, { maskSensitiveData: false });
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Get LogEntry object with request context extracted
|
|
309
|
+
* Extracts IP, method, path, userAgent, correlationId, userId from Express Request
|
|
310
|
+
* Returns structured LogEntry object ready for external logger tables
|
|
311
|
+
*
|
|
312
|
+
* @param req - Express Request object
|
|
313
|
+
* @param message - Log message
|
|
314
|
+
* @param level - Optional log level (defaults to 'info')
|
|
315
|
+
* @param context - Optional additional context
|
|
316
|
+
* @returns Complete LogEntry object with all request context extracted
|
|
317
|
+
*
|
|
318
|
+
* @example
|
|
319
|
+
* ```typescript
|
|
320
|
+
* const logEntry = client.log.getLogWithRequest(req, 'User action', 'info', { action: 'login' });
|
|
321
|
+
* await myCustomLogger.save(logEntry); // Save to own logger table
|
|
322
|
+
* ```
|
|
323
|
+
*/
|
|
324
|
+
getLogWithRequest(req, message, level = "info", context) {
|
|
325
|
+
return (0, logger_context_1.getLogWithRequest)(req, message, level, context, this.config, () => this.generateCorrelationId(), this.maskSensitiveData);
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Get LogEntry object with provided context
|
|
329
|
+
* Generates correlation ID automatically and extracts metadata from environment
|
|
330
|
+
*
|
|
331
|
+
* @param context - Context object to include in logs
|
|
332
|
+
* @param message - Log message
|
|
333
|
+
* @param level - Optional log level (defaults to 'info')
|
|
334
|
+
* @returns Complete LogEntry object
|
|
335
|
+
*
|
|
336
|
+
* @example
|
|
337
|
+
* ```typescript
|
|
338
|
+
* const logEntry = client.log.getWithContext({ operation: 'sync' }, 'Sync started');
|
|
339
|
+
* await myCustomLogger.save(logEntry);
|
|
340
|
+
* ```
|
|
341
|
+
*/
|
|
342
|
+
getWithContext(context, message, level = "info") {
|
|
343
|
+
return (0, logger_context_1.getWithContext)(context, message, level, this.config, () => this.generateCorrelationId(), this.maskSensitiveData);
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Get LogEntry object with token context extracted
|
|
347
|
+
* Extracts userId, sessionId, applicationId from JWT token
|
|
348
|
+
* Generates correlation ID automatically
|
|
349
|
+
*
|
|
350
|
+
* @param token - JWT token to extract user context from
|
|
351
|
+
* @param message - Log message
|
|
352
|
+
* @param level - Optional log level (defaults to 'info')
|
|
353
|
+
* @param context - Optional additional context
|
|
354
|
+
* @returns Complete LogEntry object with user context
|
|
355
|
+
*
|
|
356
|
+
* @example
|
|
357
|
+
* ```typescript
|
|
358
|
+
* const logEntry = client.log.getWithToken(token, 'Token validated', 'audit');
|
|
359
|
+
* await myCustomLogger.save(logEntry);
|
|
360
|
+
* ```
|
|
361
|
+
*/
|
|
362
|
+
getWithToken(token, message, level = "info", context) {
|
|
363
|
+
return (0, logger_context_1.getWithToken)(token, message, level, context, this.config, () => this.generateCorrelationId(), this.maskSensitiveData);
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Get LogEntry object with request context extracted (alias for getLogWithRequest)
|
|
367
|
+
* Alias for getLogWithRequest() for consistency with existing forRequest() pattern
|
|
368
|
+
*
|
|
369
|
+
* @param req - Express Request object
|
|
370
|
+
* @param message - Log message
|
|
371
|
+
* @param level - Optional log level (defaults to 'info')
|
|
372
|
+
* @param context - Optional additional context
|
|
373
|
+
* @returns Complete LogEntry object
|
|
374
|
+
*
|
|
375
|
+
* @example
|
|
376
|
+
* ```typescript
|
|
377
|
+
* const logEntry = client.log.getForRequest(req, 'User action', 'info', { action: 'login' });
|
|
378
|
+
* await myCustomLogger.save(logEntry);
|
|
379
|
+
* ```
|
|
380
|
+
*/
|
|
381
|
+
getForRequest(req, message, level = "info", context) {
|
|
382
|
+
return this.getLogWithRequest(req, message, level, context);
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Create logger chain with request context pre-populated
|
|
386
|
+
* Auto-extracts: IP, method, path, user-agent, correlation ID, user from JWT
|
|
387
|
+
*
|
|
388
|
+
* @param req - Express Request object
|
|
389
|
+
* @returns LoggerChain with request context pre-populated
|
|
390
|
+
*
|
|
391
|
+
* @example
|
|
392
|
+
* ```typescript
|
|
393
|
+
* await miso.log.forRequest(req).info("Processing request");
|
|
394
|
+
* ```
|
|
395
|
+
*/
|
|
396
|
+
forRequest(req) {
|
|
397
|
+
return new logger_chain_1.LoggerChain(this, {}, {}).withRequest(req);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
exports.LoggerService = LoggerService;
|
|
401
|
+
LoggerService.MAX_FAILURES = 3;
|
|
402
|
+
LoggerService.DISABLE_DURATION_MS = 60000; // 1 minute
|
|
403
|
+
//# sourceMappingURL=logger.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.service.js","sourceRoot":"","sources":["../../../src/services/logger/logger.service.ts"],"names":[],"mappings":"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"}
|