@aifabrix/miso-client 3.5.0 → 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 +240 -0
- 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/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/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/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 +10 -7
- 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 +4 -0
- package/dist/utils/internal-http-client.d.ts.map +1 -1
- package/dist/utils/internal-http-client.js +190 -11
- package/dist/utils/internal-http-client.js.map +1 -1
- package/dist/utils/response-validator.d.ts.map +1 -1
- package/dist/utils/response-validator.js +2 -4
- package/dist/utils/response-validator.js.map +1 -1
- 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
|
@@ -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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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified Logger Factory
|
|
3
|
+
* Provides factory function to get UnifiedLogger instance with automatic context detection
|
|
4
|
+
*/
|
|
5
|
+
import { LoggerService } from "./logger.service";
|
|
6
|
+
import { UnifiedLogger } from "./unified-logger.service";
|
|
7
|
+
import { LoggerContext } from "./logger-context-storage";
|
|
8
|
+
/**
|
|
9
|
+
* Global registry for LoggerService instance
|
|
10
|
+
* Allows factory function to access LoggerService without requiring MisoClient parameter
|
|
11
|
+
*/
|
|
12
|
+
declare class LoggerServiceRegistry {
|
|
13
|
+
private static instance;
|
|
14
|
+
/**
|
|
15
|
+
* Register LoggerService instance
|
|
16
|
+
* Should be called during MisoClient initialization
|
|
17
|
+
* @param loggerService - LoggerService instance to register
|
|
18
|
+
*/
|
|
19
|
+
static register(loggerService: LoggerService): void;
|
|
20
|
+
/**
|
|
21
|
+
* Get registered LoggerService instance
|
|
22
|
+
* @returns LoggerService instance or null if not registered
|
|
23
|
+
*/
|
|
24
|
+
static get(): LoggerService | null;
|
|
25
|
+
/**
|
|
26
|
+
* Clear registered LoggerService instance
|
|
27
|
+
*/
|
|
28
|
+
static clear(): void;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get logger instance with automatic context detection from AsyncLocalStorage
|
|
32
|
+
* Returns UnifiedLogger instance that automatically extracts context
|
|
33
|
+
*
|
|
34
|
+
* @param loggerService - Optional LoggerService instance (if not provided, uses registered instance)
|
|
35
|
+
* @returns UnifiedLogger instance
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```typescript
|
|
39
|
+
* const logger = getLogger();
|
|
40
|
+
* await logger.info('Message'); // Auto-extracts context from AsyncLocalStorage
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export declare function getLogger(loggerService?: LoggerService): UnifiedLogger;
|
|
44
|
+
/**
|
|
45
|
+
* Set logger context for current async execution context
|
|
46
|
+
* Context is automatically available to all code in the same async context
|
|
47
|
+
*
|
|
48
|
+
* @param context - Context to set (partial, will be merged with existing)
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```typescript
|
|
52
|
+
* setLoggerContext({
|
|
53
|
+
* userId: 'user-123',
|
|
54
|
+
* correlationId: 'req-456',
|
|
55
|
+
* ipAddress: '192.168.1.1',
|
|
56
|
+
* });
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
export declare function setLoggerContext(context: Partial<LoggerContext>): void;
|
|
60
|
+
/**
|
|
61
|
+
* Clear logger context for current async execution context
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```typescript
|
|
65
|
+
* clearLoggerContext();
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
export declare function clearLoggerContext(): void;
|
|
69
|
+
/**
|
|
70
|
+
* Merge additional fields into existing logger context
|
|
71
|
+
*
|
|
72
|
+
* @param additional - Additional context fields to merge
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```typescript
|
|
76
|
+
* mergeLoggerContext({ userId: 'user-123' });
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
export declare function mergeLoggerContext(additional: Partial<LoggerContext>): void;
|
|
80
|
+
/**
|
|
81
|
+
* Register LoggerService instance for global access
|
|
82
|
+
* Called automatically by MisoClient during initialization
|
|
83
|
+
* @param loggerService - LoggerService instance to register
|
|
84
|
+
*/
|
|
85
|
+
export declare function registerLoggerService(loggerService: LoggerService): void;
|
|
86
|
+
export { LoggerServiceRegistry };
|
|
87
|
+
//# sourceMappingURL=unified-logger.factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unified-logger.factory.d.ts","sourceRoot":"","sources":["../../../src/services/logger/unified-logger.factory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAwB,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAwB,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE/E;;;GAGG;AACH,cAAM,qBAAqB;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA8B;IAErD;;;;OAIG;IACH,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa,GAAG,IAAI;IAInD;;;OAGG;IACH,MAAM,CAAC,GAAG,IAAI,aAAa,GAAG,IAAI;IAIlC;;OAEG;IACH,MAAM,CAAC,KAAK,IAAI,IAAI;CAGrB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,SAAS,CAAC,aAAa,CAAC,EAAE,aAAa,GAAG,aAAa,CActE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,CAGtE;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAGzC;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,CAG3E;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,aAAa,GAAG,IAAI,CAExE;AAGD,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Unified Logger Factory
|
|
4
|
+
* Provides factory function to get UnifiedLogger instance with automatic context detection
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.LoggerServiceRegistry = void 0;
|
|
8
|
+
exports.getLogger = getLogger;
|
|
9
|
+
exports.setLoggerContext = setLoggerContext;
|
|
10
|
+
exports.clearLoggerContext = clearLoggerContext;
|
|
11
|
+
exports.mergeLoggerContext = mergeLoggerContext;
|
|
12
|
+
exports.registerLoggerService = registerLoggerService;
|
|
13
|
+
const unified_logger_service_1 = require("./unified-logger.service");
|
|
14
|
+
const logger_context_storage_1 = require("./logger-context-storage");
|
|
15
|
+
/**
|
|
16
|
+
* Global registry for LoggerService instance
|
|
17
|
+
* Allows factory function to access LoggerService without requiring MisoClient parameter
|
|
18
|
+
*/
|
|
19
|
+
class LoggerServiceRegistry {
|
|
20
|
+
/**
|
|
21
|
+
* Register LoggerService instance
|
|
22
|
+
* Should be called during MisoClient initialization
|
|
23
|
+
* @param loggerService - LoggerService instance to register
|
|
24
|
+
*/
|
|
25
|
+
static register(loggerService) {
|
|
26
|
+
LoggerServiceRegistry.instance = loggerService;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get registered LoggerService instance
|
|
30
|
+
* @returns LoggerService instance or null if not registered
|
|
31
|
+
*/
|
|
32
|
+
static get() {
|
|
33
|
+
return LoggerServiceRegistry.instance;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Clear registered LoggerService instance
|
|
37
|
+
*/
|
|
38
|
+
static clear() {
|
|
39
|
+
LoggerServiceRegistry.instance = null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
exports.LoggerServiceRegistry = LoggerServiceRegistry;
|
|
43
|
+
LoggerServiceRegistry.instance = null;
|
|
44
|
+
/**
|
|
45
|
+
* Get logger instance with automatic context detection from AsyncLocalStorage
|
|
46
|
+
* Returns UnifiedLogger instance that automatically extracts context
|
|
47
|
+
*
|
|
48
|
+
* @param loggerService - Optional LoggerService instance (if not provided, uses registered instance)
|
|
49
|
+
* @returns UnifiedLogger instance
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```typescript
|
|
53
|
+
* const logger = getLogger();
|
|
54
|
+
* await logger.info('Message'); // Auto-extracts context from AsyncLocalStorage
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
function getLogger(loggerService) {
|
|
58
|
+
const contextStorage = logger_context_storage_1.LoggerContextStorage.getInstance();
|
|
59
|
+
// Use provided loggerService or get from registry
|
|
60
|
+
const service = loggerService || LoggerServiceRegistry.get();
|
|
61
|
+
if (!service) {
|
|
62
|
+
// If no LoggerService available, throw error with helpful message
|
|
63
|
+
throw new Error("LoggerService not available. Either pass LoggerService to getLogger() or ensure MisoClient is initialized.");
|
|
64
|
+
}
|
|
65
|
+
return new unified_logger_service_1.UnifiedLoggerService(service, contextStorage);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Set logger context for current async execution context
|
|
69
|
+
* Context is automatically available to all code in the same async context
|
|
70
|
+
*
|
|
71
|
+
* @param context - Context to set (partial, will be merged with existing)
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* ```typescript
|
|
75
|
+
* setLoggerContext({
|
|
76
|
+
* userId: 'user-123',
|
|
77
|
+
* correlationId: 'req-456',
|
|
78
|
+
* ipAddress: '192.168.1.1',
|
|
79
|
+
* });
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
function setLoggerContext(context) {
|
|
83
|
+
const contextStorage = logger_context_storage_1.LoggerContextStorage.getInstance();
|
|
84
|
+
contextStorage.setContext(context);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Clear logger context for current async execution context
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* ```typescript
|
|
91
|
+
* clearLoggerContext();
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
function clearLoggerContext() {
|
|
95
|
+
const contextStorage = logger_context_storage_1.LoggerContextStorage.getInstance();
|
|
96
|
+
contextStorage.clearContext();
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Merge additional fields into existing logger context
|
|
100
|
+
*
|
|
101
|
+
* @param additional - Additional context fields to merge
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* ```typescript
|
|
105
|
+
* mergeLoggerContext({ userId: 'user-123' });
|
|
106
|
+
* ```
|
|
107
|
+
*/
|
|
108
|
+
function mergeLoggerContext(additional) {
|
|
109
|
+
const contextStorage = logger_context_storage_1.LoggerContextStorage.getInstance();
|
|
110
|
+
contextStorage.mergeContext(additional);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Register LoggerService instance for global access
|
|
114
|
+
* Called automatically by MisoClient during initialization
|
|
115
|
+
* @param loggerService - LoggerService instance to register
|
|
116
|
+
*/
|
|
117
|
+
function registerLoggerService(loggerService) {
|
|
118
|
+
LoggerServiceRegistry.register(loggerService);
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=unified-logger.factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unified-logger.factory.js","sourceRoot":"","sources":["../../../src/services/logger/unified-logger.factory.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAmDH,8BAcC;AAiBD,4CAGC;AAUD,gDAGC;AAYD,gDAGC;AAOD,sDAEC;AAvHD,qEAA+E;AAC/E,qEAA+E;AAE/E;;;GAGG;AACH,MAAM,qBAAqB;IAGzB;;;;OAIG;IACH,MAAM,CAAC,QAAQ,CAAC,aAA4B;QAC1C,qBAAqB,CAAC,QAAQ,GAAG,aAAa,CAAC;IACjD,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,GAAG;QACR,OAAO,qBAAqB,CAAC,QAAQ,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK;QACV,qBAAqB,CAAC,QAAQ,GAAG,IAAI,CAAC;IACxC,CAAC;;AA0FM,sDAAqB;AAlHb,8BAAQ,GAAyB,IAAI,CAAC;AA2BvD;;;;;;;;;;;;GAYG;AACH,SAAgB,SAAS,CAAC,aAA6B;IACrD,MAAM,cAAc,GAAG,6CAAoB,CAAC,WAAW,EAAE,CAAC;IAE1D,kDAAkD;IAClD,MAAM,OAAO,GAAG,aAAa,IAAI,qBAAqB,CAAC,GAAG,EAAE,CAAC;IAE7D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,kEAAkE;QAClE,MAAM,IAAI,KAAK,CACb,4GAA4G,CAC7G,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,6CAAoB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAgB,gBAAgB,CAAC,OAA+B;IAC9D,MAAM,cAAc,GAAG,6CAAoB,CAAC,WAAW,EAAE,CAAC;IAC1D,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,kBAAkB;IAChC,MAAM,cAAc,GAAG,6CAAoB,CAAC,WAAW,EAAE,CAAC;IAC1D,cAAc,CAAC,YAAY,EAAE,CAAC;AAChC,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,kBAAkB,CAAC,UAAkC;IACnE,MAAM,cAAc,GAAG,6CAAoB,CAAC,WAAW,EAAE,CAAC;IAC1D,cAAc,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;AAC1C,CAAC;AAED;;;;GAIG;AACH,SAAgB,qBAAqB,CAAC,aAA4B;IAChE,qBAAqB,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;AAChD,CAAC"}
|