@saultechitsolutions/gighub-shared-core 1.0.3 → 1.0.4

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.
@@ -0,0 +1,9 @@
1
+ import { DynamicModule } from '@nestjs/common';
2
+ import { ElkConfig } from './interfaces/elk-config.interface';
3
+ export declare class ElkModule {
4
+ static forRoot(config: ElkConfig): DynamicModule;
5
+ static forRootAsync(options: {
6
+ useFactory: (...args: any[]) => Promise<ElkConfig> | ElkConfig;
7
+ inject?: any[];
8
+ }): DynamicModule;
9
+ }
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var ElkModule_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.ElkModule = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ const elk_service_1 = require("./elk.service");
13
+ let ElkModule = ElkModule_1 = class ElkModule {
14
+ static forRoot(config) {
15
+ return {
16
+ module: ElkModule_1,
17
+ providers: [
18
+ {
19
+ provide: 'ELK_CONFIG',
20
+ useValue: config,
21
+ },
22
+ elk_service_1.ElkService,
23
+ ],
24
+ exports: [elk_service_1.ElkService],
25
+ };
26
+ }
27
+ static forRootAsync(options) {
28
+ return {
29
+ module: ElkModule_1,
30
+ providers: [
31
+ {
32
+ provide: 'ELK_CONFIG',
33
+ useFactory: options.useFactory,
34
+ inject: options.inject || [],
35
+ },
36
+ elk_service_1.ElkService,
37
+ ],
38
+ exports: [elk_service_1.ElkService],
39
+ };
40
+ }
41
+ };
42
+ exports.ElkModule = ElkModule;
43
+ exports.ElkModule = ElkModule = ElkModule_1 = __decorate([
44
+ (0, common_1.Global)(),
45
+ (0, common_1.Module)({})
46
+ ], ElkModule);
47
+ //# sourceMappingURL=elk.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elk.module.js","sourceRoot":"","sources":["../../src/elk/elk.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAA+D;AAC/D,+CAA2C;AAKpC,IAAM,SAAS,iBAAf,MAAM,SAAS;IAClB,MAAM,CAAC,OAAO,CAAC,MAAiB;QAC5B,OAAO;YACH,MAAM,EAAE,WAAS;YACjB,SAAS,EAAE;gBACP;oBACI,OAAO,EAAE,YAAY;oBACrB,QAAQ,EAAE,MAAM;iBACnB;gBACD,wBAAU;aACb;YACD,OAAO,EAAE,CAAC,wBAAU,CAAC;SACxB,CAAC;IACN,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,OAGnB;QACG,OAAO;YACH,MAAM,EAAE,WAAS;YACjB,SAAS,EAAE;gBACP;oBACI,OAAO,EAAE,YAAY;oBACrB,UAAU,EAAE,OAAO,CAAC,UAAU;oBAC9B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;iBAC/B;gBACD,wBAAU;aACb;YACD,OAAO,EAAE,CAAC,wBAAU,CAAC;SACxB,CAAC;IACN,CAAC;CACJ,CAAA;AAhCY,8BAAS;oBAAT,SAAS;IAFrB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,SAAS,CAgCrB"}
@@ -0,0 +1,27 @@
1
+ import { LoggerService as NestLoggerService } from '@nestjs/common';
2
+ import { Client } from '@elastic/elasticsearch';
3
+ import { ElkConfig, LogMetadata } from './interfaces/elk-config.interface';
4
+ export declare class ElkService implements NestLoggerService {
5
+ private config;
6
+ private logger;
7
+ private elasticClient;
8
+ constructor(config: ElkConfig);
9
+ private initializeElasticsearch;
10
+ private initializeLogger;
11
+ log(message: string, context?: string): void;
12
+ log(message: string, metadata?: LogMetadata): void;
13
+ error(message: string, trace?: string, context?: string): void;
14
+ error(message: string, metadata?: LogMetadata): void;
15
+ warn(message: string, context?: string): void;
16
+ warn(message: string, metadata?: LogMetadata): void;
17
+ debug(message: string, context?: string): void;
18
+ debug(message: string, metadata?: LogMetadata): void;
19
+ verbose(message: string, context?: string): void;
20
+ verbose(message: string, metadata?: LogMetadata): void;
21
+ searchLogs(query: any, from?: number, size?: number): Promise<any>;
22
+ getLogsByTimeRange(startTime: Date, endTime: Date): Promise<any>;
23
+ getElasticsearchClient(): Client;
24
+ checkHealth(): Promise<boolean>;
25
+ private normalizeMeta;
26
+ onModuleDestroy(): Promise<void>;
27
+ }
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.ElkService = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const elasticsearch_1 = require("@elastic/elasticsearch");
18
+ const winston = require("winston");
19
+ const winston_elasticsearch_1 = require("winston-elasticsearch");
20
+ let ElkService = class ElkService {
21
+ constructor(config) {
22
+ this.config = config;
23
+ this.initializeElasticsearch();
24
+ this.initializeLogger();
25
+ }
26
+ initializeElasticsearch() {
27
+ this.elasticClient = new elasticsearch_1.Client({
28
+ node: this.config.elasticsearch.node,
29
+ auth: this.config.elasticsearch.auth,
30
+ maxRetries: this.config.elasticsearch.maxRetries || 3,
31
+ requestTimeout: this.config.elasticsearch.requestTimeout || 30000,
32
+ sniffOnStart: this.config.elasticsearch.sniffOnStart || false,
33
+ });
34
+ }
35
+ initializeLogger() {
36
+ const transports = [];
37
+ if (this.config.logging.consoleLog !== false) {
38
+ transports.push(new winston.transports.Console({
39
+ format: winston.format.combine(winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), winston.format.colorize(), winston.format.printf(({ timestamp, level, message, context, ...meta }) => {
40
+ const contextStr = context ? `[${context}]` : '';
41
+ const metaStr = Object.keys(meta).length ? JSON.stringify(meta) : '';
42
+ return `${timestamp} ${level} ${contextStr} ${message} ${metaStr}`;
43
+ })),
44
+ }));
45
+ }
46
+ const esTransportOpts = {
47
+ level: this.config.logging.level || 'info',
48
+ clientOpts: {
49
+ node: this.config.elasticsearch.node,
50
+ auth: this.config.elasticsearch.auth,
51
+ maxRetries: this.config.elasticsearch.maxRetries || 3,
52
+ requestTimeout: this.config.elasticsearch.requestTimeout || 30000,
53
+ sniffOnStart: this.config.elasticsearch.sniffOnStart || false,
54
+ },
55
+ index: this.config.logging.index,
56
+ buffering: this.config.logging.buffering !== false,
57
+ bufferLimit: this.config.logging.bufferLimit || 100,
58
+ flushInterval: this.config.logging.flushInterval || 2000,
59
+ retryLimit: this.config.logging.retryLimit || 3,
60
+ healthCheckTimeout: '30s',
61
+ healthCheckWaitForStatus: 'yellow',
62
+ transformer: (logData) => {
63
+ const transformed = {
64
+ '@timestamp': new Date().toISOString(),
65
+ message: logData.message,
66
+ severity: logData.level,
67
+ service: this.config.serviceName,
68
+ environment: this.config.environment,
69
+ context: logData.meta?.context,
70
+ ...logData.meta,
71
+ };
72
+ Object.keys(transformed).forEach(key => {
73
+ if (transformed[key] === undefined) {
74
+ delete transformed[key];
75
+ }
76
+ });
77
+ return transformed;
78
+ },
79
+ };
80
+ transports.push(new winston_elasticsearch_1.ElasticsearchTransport(esTransportOpts));
81
+ this.logger = winston.createLogger({
82
+ level: this.config.logging.level || 'info',
83
+ format: winston.format.combine(winston.format.timestamp(), winston.format.errors({ stack: true }), winston.format.json()),
84
+ defaultMeta: {
85
+ service: this.config.serviceName,
86
+ environment: this.config.environment,
87
+ },
88
+ transports,
89
+ });
90
+ }
91
+ log(message, contextOrMeta) {
92
+ const meta = this.normalizeMeta(contextOrMeta);
93
+ this.logger.info(message, meta);
94
+ }
95
+ error(message, traceOrMeta, context) {
96
+ if (typeof traceOrMeta === 'string') {
97
+ this.logger.error(message, {
98
+ context,
99
+ trace: traceOrMeta,
100
+ });
101
+ }
102
+ else {
103
+ this.logger.error(message, traceOrMeta);
104
+ }
105
+ }
106
+ warn(message, contextOrMeta) {
107
+ const meta = this.normalizeMeta(contextOrMeta);
108
+ this.logger.warn(message, meta);
109
+ }
110
+ debug(message, contextOrMeta) {
111
+ const meta = this.normalizeMeta(contextOrMeta);
112
+ this.logger.debug(message, meta);
113
+ }
114
+ verbose(message, contextOrMeta) {
115
+ const meta = this.normalizeMeta(contextOrMeta);
116
+ this.logger.verbose(message, meta);
117
+ }
118
+ async searchLogs(query, from = 0, size = 100) {
119
+ try {
120
+ return await this.elasticClient.search({
121
+ index: this.config.logging.index,
122
+ query,
123
+ from,
124
+ size,
125
+ sort: [{ '@timestamp': { order: 'desc' } }],
126
+ });
127
+ }
128
+ catch (error) {
129
+ console.error('Error searching logs:', error);
130
+ throw error;
131
+ }
132
+ }
133
+ async getLogsByTimeRange(startTime, endTime) {
134
+ const query = {
135
+ bool: {
136
+ must: [
137
+ { match: { service: this.config.serviceName } },
138
+ {
139
+ range: {
140
+ '@timestamp': {
141
+ gte: startTime.toISOString(),
142
+ lte: endTime.toISOString(),
143
+ },
144
+ },
145
+ },
146
+ ],
147
+ },
148
+ };
149
+ return this.searchLogs(query);
150
+ }
151
+ getElasticsearchClient() {
152
+ return this.elasticClient;
153
+ }
154
+ async checkHealth() {
155
+ try {
156
+ const health = await this.elasticClient.cluster.health();
157
+ return health.status === 'green' || health.status === 'yellow';
158
+ }
159
+ catch (error) {
160
+ console.error('Elasticsearch health check failed:', error);
161
+ return false;
162
+ }
163
+ }
164
+ normalizeMeta(contextOrMeta) {
165
+ if (typeof contextOrMeta === 'string') {
166
+ return { context: contextOrMeta };
167
+ }
168
+ return contextOrMeta || {};
169
+ }
170
+ async onModuleDestroy() {
171
+ await this.elasticClient.close();
172
+ this.logger.close();
173
+ }
174
+ };
175
+ exports.ElkService = ElkService;
176
+ exports.ElkService = ElkService = __decorate([
177
+ (0, common_1.Injectable)({ scope: common_1.Scope.DEFAULT }),
178
+ __param(0, (0, common_1.Inject)('ELK_CONFIG')),
179
+ __metadata("design:paramtypes", [Object])
180
+ ], ElkService);
181
+ //# sourceMappingURL=elk.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elk.service.js","sourceRoot":"","sources":["../../src/elk/elk.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA6F;AAC7F,0DAA8C;AAC9C,mCAAmC;AACnC,iEAA6D;AAItD,IAAM,UAAU,GAAhB,MAAM,UAAU;IAInB,YAA0C,MAAiB;QAAjB,WAAM,GAAN,MAAM,CAAW;QACvD,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC5B,CAAC;IAEO,uBAAuB;QAE3B,IAAI,CAAC,aAAa,GAAG,IAAI,sBAAM,CAAC;YAC5B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI;YACpC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI;YACpC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,IAAI,CAAC;YACrD,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,IAAI,KAAK;YACjE,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,YAAY,IAAI,KAAK;SAChE,CAAC,CAAC;IACP,CAAC;IAEO,gBAAgB;QACpB,MAAM,UAAU,GAAwB,EAAE,CAAC;QAG3C,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;YAC3C,UAAU,CAAC,IAAI,CACX,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;gBAC3B,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAC1B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,EAC3D,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,EACzB,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE;oBACtE,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrE,OAAO,GAAG,SAAS,IAAI,KAAK,IAAI,UAAU,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;gBACvE,CAAC,CAAC,CACL;aACJ,CAAC,CACL,CAAC;QACN,CAAC;QAGD,MAAM,eAAe,GAAQ;YACzB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,MAAM;YAC1C,UAAU,EAAE;gBACR,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI;gBACpC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI;gBACpC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,IAAI,CAAC;gBACrD,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,IAAI,KAAK;gBACjE,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,YAAY,IAAI,KAAK;aAChE;YACD,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK;YAChC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,KAAK,KAAK;YAClD,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,IAAI,GAAG;YACnD,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,IAAI,IAAI;YACxD,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC;YAC/C,kBAAkB,EAAE,KAAK;YACzB,wBAAwB,EAAE,QAAQ;YAClC,WAAW,EAAE,CAAC,OAAY,EAAE,EAAE;gBAC1B,MAAM,WAAW,GAAG;oBAChB,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACtC,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,QAAQ,EAAE,OAAO,CAAC,KAAK;oBACvB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;oBAChC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;oBACpC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO;oBAC9B,GAAG,OAAO,CAAC,IAAI;iBAClB,CAAC;gBAGF,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;oBACnC,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;wBACjC,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;oBAC5B,CAAC;gBACL,CAAC,CAAC,CAAC;gBAEH,OAAO,WAAW,CAAC;YACvB,CAAC;SACJ,CAAC;QAEF,UAAU,CAAC,IAAI,CAAC,IAAI,8CAAsB,CAAC,eAAe,CAAC,CAAC,CAAC;QAE7D,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;YAC/B,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,MAAM;YAC1C,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAC1B,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,EAC1B,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EACtC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CACxB;YACD,WAAW,EAAE;gBACT,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;gBAChC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;aACvC;YACD,UAAU;SACb,CAAC,CAAC;IACP,CAAC;IAOD,GAAG,CAAC,OAAe,EAAE,aAAoC;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC;IAOD,KAAK,CAAC,OAAe,EAAE,WAAkC,EAAE,OAAgB;QACvE,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE;gBACvB,OAAO;gBACP,KAAK,EAAE,WAAW;aACrB,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC5C,CAAC;IACL,CAAC;IAOD,IAAI,CAAC,OAAe,EAAE,aAAoC;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC;IAOD,KAAK,CAAC,OAAe,EAAE,aAAoC;QACvD,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;IAOD,OAAO,CAAC,OAAe,EAAE,aAAoC;QACzD,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC;IAKD,KAAK,CAAC,UAAU,CAAC,KAAU,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,GAAG;QAC7C,IAAI,CAAC;YACD,OAAO,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;gBACnC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK;gBAChC,KAAK;gBACL,IAAI;gBACJ,IAAI;gBACJ,IAAI,EAAE,CAAC,EAAC,YAAY,EAAE,EAAC,KAAK,EAAE,MAAM,EAAC,EAAC,CAAC;aAC1C,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;YAC9C,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAKD,KAAK,CAAC,kBAAkB,CAAC,SAAe,EAAE,OAAa;QACnD,MAAM,KAAK,GAAG;YACV,IAAI,EAAE;gBACF,IAAI,EAAE;oBACF,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE;oBAC/C;wBACI,KAAK,EAAE;4BACH,YAAY,EAAE;gCACV,GAAG,EAAE,SAAS,CAAC,WAAW,EAAE;gCAC5B,GAAG,EAAE,OAAO,CAAC,WAAW,EAAE;6BAC7B;yBACJ;qBACJ;iBACJ;aACJ;SACJ,CAAC;QAEF,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAKD,sBAAsB;QAClB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAKD,KAAK,CAAC,WAAW;QACb,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACzD,OAAO,MAAM,CAAC,MAAM,KAAK,OAAO,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC;QACnE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;YAC3D,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAKO,aAAa,CAAC,aAAoC;QACtD,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;YACpC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;QACtC,CAAC;QACD,OAAO,aAAa,IAAI,EAAE,CAAC;IAC/B,CAAC;IAKD,KAAK,CAAC,eAAe;QACjB,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;CACJ,CAAA;AAtOY,gCAAU;qBAAV,UAAU;IADtB,IAAA,mBAAU,EAAC,EAAE,KAAK,EAAE,cAAK,CAAC,OAAO,EAAE,CAAC;IAKpB,WAAA,IAAA,eAAM,EAAC,YAAY,CAAC,CAAA;;GAJxB,UAAU,CAsOtB"}
@@ -0,0 +1,10 @@
1
+ import { NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
2
+ import { Observable } from 'rxjs';
3
+ import { ElkService } from '../elk.service';
4
+ export declare class ElkLoggingInterceptor implements NestInterceptor {
5
+ private readonly elkService;
6
+ constructor(elkService: ElkService);
7
+ intercept(context: ExecutionContext, next: CallHandler): Observable<any>;
8
+ private sanitizeBody;
9
+ private generateRequestId;
10
+ }
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ElkLoggingInterceptor = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const operators_1 = require("rxjs/operators");
15
+ const elk_service_1 = require("../elk.service");
16
+ let ElkLoggingInterceptor = class ElkLoggingInterceptor {
17
+ constructor(elkService) {
18
+ this.elkService = elkService;
19
+ }
20
+ intercept(context, next) {
21
+ const request = context.switchToHttp().getRequest();
22
+ const { method, url, body, headers, ip } = request;
23
+ const userAgent = headers['user-agent'] || '';
24
+ const requestId = headers['x-request-id'] || this.generateRequestId();
25
+ const startTime = Date.now();
26
+ this.elkService.log('Incoming request', {
27
+ context: 'HTTP',
28
+ method,
29
+ url,
30
+ requestId,
31
+ ip,
32
+ userAgent,
33
+ body: this.sanitizeBody(body),
34
+ });
35
+ return next.handle().pipe((0, operators_1.tap)((data) => {
36
+ const response = context.switchToHttp().getResponse();
37
+ const { statusCode } = response;
38
+ const duration = Date.now() - startTime;
39
+ this.elkService.log('Request completed', {
40
+ context: 'HTTP',
41
+ method,
42
+ url,
43
+ requestId,
44
+ statusCode,
45
+ duration: `${duration}ms`,
46
+ });
47
+ }), (0, operators_1.catchError)((error) => {
48
+ const duration = Date.now() - startTime;
49
+ this.elkService.error('Request failed', {
50
+ context: 'HTTP',
51
+ method,
52
+ url,
53
+ requestId,
54
+ error: error.message,
55
+ stack: error.stack,
56
+ duration: `${duration}ms`,
57
+ });
58
+ throw error;
59
+ }));
60
+ }
61
+ sanitizeBody(body) {
62
+ if (!body)
63
+ return body;
64
+ const sanitized = { ...body };
65
+ const sensitiveFields = ['password', 'token', 'secret', 'apiKey', 'creditCard'];
66
+ sensitiveFields.forEach(field => {
67
+ if (sanitized[field]) {
68
+ sanitized[field] = '***REDACTED***';
69
+ }
70
+ });
71
+ return sanitized;
72
+ }
73
+ generateRequestId() {
74
+ return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
75
+ }
76
+ };
77
+ exports.ElkLoggingInterceptor = ElkLoggingInterceptor;
78
+ exports.ElkLoggingInterceptor = ElkLoggingInterceptor = __decorate([
79
+ (0, common_1.Injectable)(),
80
+ __metadata("design:paramtypes", [elk_service_1.ElkService])
81
+ ], ElkLoggingInterceptor);
82
+ //# sourceMappingURL=elk-logging.interceptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elk-logging.interceptor.js","sourceRoot":"","sources":["../../../src/elk/interceptors/elk-logging.interceptor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export interface ElkConfig {
2
+ elasticsearch: {
3
+ node: string;
4
+ auth?: {
5
+ username: string;
6
+ password: string;
7
+ };
8
+ maxRetries?: number;
9
+ requestTimeout?: number;
10
+ sniffOnStart?: boolean;
11
+ };
12
+ logging: {
13
+ index: string;
14
+ level?: 'error' | 'warn' | 'info' | 'debug' | 'verbose';
15
+ datePattern?: string;
16
+ maxFiles?: string;
17
+ consoleLog?: boolean;
18
+ includeContext?: boolean;
19
+ buffering?: boolean;
20
+ bufferLimit?: number;
21
+ flushInterval?: number;
22
+ retryLimit?: number;
23
+ };
24
+ serviceName: string;
25
+ environment: string;
26
+ }
27
+ export interface LogMetadata {
28
+ context?: string;
29
+ userId?: string;
30
+ requestId?: string;
31
+ [key: string]: any;
32
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=elk-config.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elk-config.interface.js","sourceRoot":"","sources":["../../../src/elk/interfaces/elk-config.interface.ts"],"names":[],"mappings":""}
package/dist/index.d.ts CHANGED
@@ -2,14 +2,17 @@ export * from './audit/audit.module';
2
2
  export * from './kafka/kafka.module';
3
3
  export * from './redis/redis.module';
4
4
  export * from './context/request-context.module';
5
+ export * from './elk/elk.module';
5
6
  export * from './audit/audit.service';
6
7
  export * from './kafka/kafka.service';
7
8
  export * from './redis/redis.service';
8
9
  export * from './context/request-context.service';
10
+ export * from './elk/elk.service';
9
11
  export * from './guards/auth.guard';
10
12
  export * from './guards/roles.guard';
11
13
  export * from './interceptors/logging.interceptor';
12
14
  export * from './interceptors/transform.interceptor';
15
+ export * from './elk/interceptors/elk-logging.interceptor';
13
16
  export * from './filters/http-exception.filter';
14
17
  export * from './filters/global-exception.filter';
15
18
  export * from './decorators/current-user.decorator';
@@ -23,3 +26,4 @@ export * from './exceptions/database.exception';
23
26
  export * from './audit/interfaces/audit-log.interface';
24
27
  export * from './kafka/interfaces/kafka-config.interface';
25
28
  export * from './redis/interfaces/redis-config.interface';
29
+ export * from './elk/interfaces/elk-config.interface';
package/dist/index.js CHANGED
@@ -18,14 +18,17 @@ __exportStar(require("./audit/audit.module"), exports);
18
18
  __exportStar(require("./kafka/kafka.module"), exports);
19
19
  __exportStar(require("./redis/redis.module"), exports);
20
20
  __exportStar(require("./context/request-context.module"), exports);
21
+ __exportStar(require("./elk/elk.module"), exports);
21
22
  __exportStar(require("./audit/audit.service"), exports);
22
23
  __exportStar(require("./kafka/kafka.service"), exports);
23
24
  __exportStar(require("./redis/redis.service"), exports);
24
25
  __exportStar(require("./context/request-context.service"), exports);
26
+ __exportStar(require("./elk/elk.service"), exports);
25
27
  __exportStar(require("./guards/auth.guard"), exports);
26
28
  __exportStar(require("./guards/roles.guard"), exports);
27
29
  __exportStar(require("./interceptors/logging.interceptor"), exports);
28
30
  __exportStar(require("./interceptors/transform.interceptor"), exports);
31
+ __exportStar(require("./elk/interceptors/elk-logging.interceptor"), exports);
29
32
  __exportStar(require("./filters/http-exception.filter"), exports);
30
33
  __exportStar(require("./filters/global-exception.filter"), exports);
31
34
  __exportStar(require("./decorators/current-user.decorator"), exports);
@@ -39,4 +42,5 @@ __exportStar(require("./exceptions/database.exception"), exports);
39
42
  __exportStar(require("./audit/interfaces/audit-log.interface"), exports);
40
43
  __exportStar(require("./kafka/interfaces/kafka-config.interface"), exports);
41
44
  __exportStar(require("./redis/interfaces/redis-config.interface"), exports);
45
+ __exportStar(require("./elk/interfaces/elk-config.interface"), exports);
42
46
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uDAAqC;AACrC,uDAAqC;AACrC,uDAAqC;AACrC,mEAAiD;AAGjD,wDAAsC;AACtC,wDAAsC;AACtC,wDAAsC;AACtC,oEAAkD;AAGlD,sDAAoC;AACpC,uDAAqC;AAGrC,qEAAmD;AACnD,uEAAqD;AAGrD,kEAAgD;AAChD,oEAAkD;AAGlD,sEAAoD;AACpD,+DAA6C;AAG7C,iDAA+B;AAC/B,uDAAqC;AACrC,yDAAuC;AAGvC,kEAAgD;AAChD,6DAA2C;AAC3C,kEAAgD;AAGhD,yEAAuD;AACvD,4EAA0D;AAC1D,4EAA0D"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uDAAqC;AACrC,uDAAqC;AACrC,uDAAqC;AACrC,mEAAiD;AACjD,mDAAiC;AAGjC,wDAAsC;AACtC,wDAAsC;AACtC,wDAAsC;AACtC,oEAAkD;AAClD,oDAAiC;AAGjC,sDAAoC;AACpC,uDAAqC;AAGrC,qEAAmD;AACnD,uEAAqD;AACrD,6EAA2D;AAG3D,kEAAgD;AAChD,oEAAkD;AAGlD,sEAAoD;AACpD,+DAA6C;AAG7C,iDAA+B;AAC/B,uDAAqC;AACrC,yDAAuC;AAGvC,kEAAgD;AAChD,6DAA2C;AAC3C,kEAAgD;AAGhD,yEAAuD;AACvD,4EAA0D;AAC1D,4EAA0D;AAC1D,wEAAsD"}