@tc-libs/logger 3.12.0 → 3.14.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/package.json +2 -1
- package/src/logger.factory.js +2 -0
- package/src/logger.factory.js.map +1 -1
- package/src/logger.module.options.d.ts +11 -0
- package/src/services/logger.service.d.ts +13 -0
- package/src/services/logger.service.js +54 -0
- package/src/services/logger.service.js.map +1 -1
- package/src/transports/cloudwatch.transport.d.ts +30 -0
- package/src/transports/cloudwatch.transport.js +132 -0
- package/src/transports/cloudwatch.transport.js.map +1 -0
package/package.json
CHANGED
package/src/logger.factory.js
CHANGED
|
@@ -14,6 +14,8 @@ let LogFactory = class LogFactory {
|
|
|
14
14
|
telegramEnabled: this._options.telegram.enabled,
|
|
15
15
|
telegramChatId: this._options.telegram.chatId,
|
|
16
16
|
telegramApiToken: this._options.telegram.apiToken,
|
|
17
|
+
cloudwatchEnabled: !!this._options.cloudwatch?.enabled,
|
|
18
|
+
cloudwatchConfig: this._options.cloudwatch,
|
|
17
19
|
};
|
|
18
20
|
return new logger_service_1.TcLogService(context, logConf);
|
|
19
21
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.factory.js","sourceRoot":"","sources":["../../../../packages/logger/src/logger.factory.ts"],"names":[],"mappings":";;;;AAAA,2CAAoD;AACpD,8DAAyD;AAEzD,mEAGiC;AAG1B,IAAM,UAAU,GAAhB,MAAM,UAAU;IACrB,YAEmB,QAA6B;QAA7B,aAAQ,GAAR,QAAQ,CAAqB;IAC7C,CAAC;IACJ,YAAY,CAAC,OAAe;QAC1B,MAAM,OAAO,GAAG;YACd,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO;YAC/C,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM;YAC7C,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ;
|
|
1
|
+
{"version":3,"file":"logger.factory.js","sourceRoot":"","sources":["../../../../packages/logger/src/logger.factory.ts"],"names":[],"mappings":";;;;AAAA,2CAAoD;AACpD,8DAAyD;AAEzD,mEAGiC;AAG1B,IAAM,UAAU,GAAhB,MAAM,UAAU;IACrB,YAEmB,QAA6B;QAA7B,aAAQ,GAAR,QAAQ,CAAqB;IAC7C,CAAC;IACJ,YAAY,CAAC,OAAe;QAC1B,MAAM,OAAO,GAAG;YACd,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO;YAC/C,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM;YAC7C,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ;YACjD,iBAAiB,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO;YACtD,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU;SAC3C,CAAC;QACF,OAAO,IAAI,6BAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;CACF,CAAA;AAfY,gCAAU;qBAAV,UAAU;IADtB,IAAA,mBAAU,GAAE;IAGR,mBAAA,IAAA,eAAM,EAAC,6CAAqB,CAAC,CAAA;;GAFrB,UAAU,CAetB"}
|
|
@@ -7,6 +7,17 @@ export interface LoggerModuleOptions {
|
|
|
7
7
|
chatId: string;
|
|
8
8
|
apiToken: string;
|
|
9
9
|
};
|
|
10
|
+
cloudwatch?: {
|
|
11
|
+
enabled: boolean;
|
|
12
|
+
credential: {
|
|
13
|
+
key: string;
|
|
14
|
+
secret: string;
|
|
15
|
+
};
|
|
16
|
+
region: string;
|
|
17
|
+
logGroup: string;
|
|
18
|
+
logStream: string;
|
|
19
|
+
minLevel?: 'error' | 'warn' | 'info' | 'debug';
|
|
20
|
+
};
|
|
10
21
|
}
|
|
11
22
|
type LoggerModuleAsyncOptions = Pick<ModuleMetadata, 'imports'> & Pick<FactoryProvider<LoggerModuleOptions>, 'useFactory' | 'inject'>;
|
|
12
23
|
export default LoggerModuleAsyncOptions;
|
|
@@ -3,12 +3,25 @@ export type TcLogServiceConfig = {
|
|
|
3
3
|
telegramEnabled: boolean;
|
|
4
4
|
telegramChatId?: string;
|
|
5
5
|
telegramApiToken?: string;
|
|
6
|
+
cloudwatchEnabled: boolean;
|
|
7
|
+
cloudwatchConfig?: {
|
|
8
|
+
credential: {
|
|
9
|
+
key: string;
|
|
10
|
+
secret: string;
|
|
11
|
+
};
|
|
12
|
+
region: string;
|
|
13
|
+
logGroup: string;
|
|
14
|
+
logStream: string;
|
|
15
|
+
minLevel?: 'error' | 'warn' | 'info' | 'debug';
|
|
16
|
+
};
|
|
6
17
|
};
|
|
7
18
|
export declare class TcLogService implements ITcLogService {
|
|
8
19
|
private _context;
|
|
9
20
|
private _consoleLog;
|
|
10
21
|
private _telegramLogger;
|
|
11
22
|
private _telegramEnabled;
|
|
23
|
+
private _cloudwatchLogger;
|
|
24
|
+
private _cloudwatchEnabled;
|
|
12
25
|
private _badges;
|
|
13
26
|
constructor(context: string, conf: TcLogServiceConfig);
|
|
14
27
|
/**
|
|
@@ -4,6 +4,7 @@ exports.TcLogService = void 0;
|
|
|
4
4
|
const winston_1 = require("winston");
|
|
5
5
|
const { combine, metadata, timestamp, label, printf, errors, colorize } = winston_1.format;
|
|
6
6
|
const telegram_transport_1 = require("../transports/telegram.transport");
|
|
7
|
+
const cloudwatch_transport_1 = require("../transports/cloudwatch.transport");
|
|
7
8
|
const _sanitize = (str) => {
|
|
8
9
|
return str.replace(/[\u00A0-\u9999<>&]/g, (i) => {
|
|
9
10
|
return '&#' + i.charCodeAt(0) + ';';
|
|
@@ -103,6 +104,51 @@ class TcLogService {
|
|
|
103
104
|
],
|
|
104
105
|
});
|
|
105
106
|
}
|
|
107
|
+
this._cloudwatchEnabled = conf.cloudwatchEnabled && !!conf.cloudwatchConfig;
|
|
108
|
+
if (this._cloudwatchEnabled && conf.cloudwatchConfig) {
|
|
109
|
+
const cw = conf.cloudwatchConfig;
|
|
110
|
+
this._cloudwatchLogger = (0, winston_1.createLogger)({
|
|
111
|
+
// filtra per livello minimo: i livelli meno gravi vengono scartati
|
|
112
|
+
// prima di raggiungere il transport (es. 'warn' => warn + error).
|
|
113
|
+
level: cw.minLevel ?? 'info',
|
|
114
|
+
format: combine(label({ label: this._context }), errors({ stack: true }), metadata({ fillExcept: ['message', 'level', 'timestamp', 'label'] }), timestamp({ format: 'DD/MM/YY HH:mm:ss Z' }), printf((info) => {
|
|
115
|
+
// log strutturato in JSON, interrogabile da CloudWatch Logs Insights
|
|
116
|
+
const entry = {
|
|
117
|
+
level: info.level,
|
|
118
|
+
context: info['label'],
|
|
119
|
+
message: info.message,
|
|
120
|
+
timestamp: info['timestamp'],
|
|
121
|
+
};
|
|
122
|
+
if (info['stack'])
|
|
123
|
+
entry['stack'] = info['stack'];
|
|
124
|
+
const meta = info['metadata'];
|
|
125
|
+
if (meta && Object.keys(meta).length)
|
|
126
|
+
entry['metadata'] = meta;
|
|
127
|
+
try {
|
|
128
|
+
return JSON.stringify(entry);
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return JSON.stringify({
|
|
132
|
+
level: info.level,
|
|
133
|
+
message: String(info.message),
|
|
134
|
+
timestamp: info['timestamp'],
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
})),
|
|
138
|
+
transports: [
|
|
139
|
+
new cloudwatch_transport_1.CloudwatchTransport({
|
|
140
|
+
region: cw.region,
|
|
141
|
+
credentials: {
|
|
142
|
+
accessKeyId: cw.credential.key,
|
|
143
|
+
secretAccessKey: cw.credential.secret,
|
|
144
|
+
},
|
|
145
|
+
// suffisso fisso del modulo: <base>/system
|
|
146
|
+
logGroupName: `${cw.logGroup.replace(/\/+$/, '')}/system`,
|
|
147
|
+
logStreamName: cw.logStream,
|
|
148
|
+
}),
|
|
149
|
+
],
|
|
150
|
+
});
|
|
151
|
+
}
|
|
106
152
|
}
|
|
107
153
|
/**
|
|
108
154
|
* Write a 'log' level log.
|
|
@@ -138,21 +184,29 @@ class TcLogService {
|
|
|
138
184
|
this._consoleLog.log('debug', message, optionalParams, null);
|
|
139
185
|
if (this._telegramEnabled)
|
|
140
186
|
this._telegramLogger.debug(message, optionalParams, null);
|
|
187
|
+
if (this._cloudwatchEnabled)
|
|
188
|
+
this._cloudwatchLogger.debug(message, optionalParams, null);
|
|
141
189
|
}
|
|
142
190
|
notifyInfo(message, ...optionalParams) {
|
|
143
191
|
this._consoleLog.log('info', message, optionalParams, null);
|
|
144
192
|
if (this._telegramEnabled)
|
|
145
193
|
this._telegramLogger.info(message, optionalParams, null);
|
|
194
|
+
if (this._cloudwatchEnabled)
|
|
195
|
+
this._cloudwatchLogger.info(message, optionalParams, null);
|
|
146
196
|
}
|
|
147
197
|
notifyWarn(message, ...optionalParams) {
|
|
148
198
|
this._consoleLog.log('warn', message, optionalParams, null);
|
|
149
199
|
if (this._telegramEnabled)
|
|
150
200
|
this._telegramLogger.warn(message, optionalParams, null);
|
|
201
|
+
if (this._cloudwatchEnabled)
|
|
202
|
+
this._cloudwatchLogger.warn(message, optionalParams, null);
|
|
151
203
|
}
|
|
152
204
|
notifyError(message, ...optionalParams) {
|
|
153
205
|
this._consoleLog.log('error', message, optionalParams, null);
|
|
154
206
|
if (this._telegramEnabled)
|
|
155
207
|
this._telegramLogger.error(message, optionalParams, null);
|
|
208
|
+
if (this._cloudwatchEnabled)
|
|
209
|
+
this._cloudwatchLogger.error(message, optionalParams, null);
|
|
156
210
|
}
|
|
157
211
|
}
|
|
158
212
|
exports.TcLogService = TcLogService;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.service.js","sourceRoot":"","sources":["../../../../../packages/logger/src/services/logger.service.ts"],"names":[],"mappings":";;;AAAA,qCAMiB;AACjB,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GACrE,gBAAM,CAAC;AACT,yEAAqE;
|
|
1
|
+
{"version":3,"file":"logger.service.js","sourceRoot":"","sources":["../../../../../packages/logger/src/services/logger.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import Transport, { TransportStreamOptions } from 'winston-transport';
|
|
2
|
+
interface CloudwatchTransportOpts extends TransportStreamOptions {
|
|
3
|
+
region: string;
|
|
4
|
+
credentials?: {
|
|
5
|
+
accessKeyId: string;
|
|
6
|
+
secretAccessKey: string;
|
|
7
|
+
};
|
|
8
|
+
logGroupName: string;
|
|
9
|
+
logStreamName: string;
|
|
10
|
+
flushInterval?: number;
|
|
11
|
+
}
|
|
12
|
+
export declare class CloudwatchTransport extends Transport {
|
|
13
|
+
private readonly _client;
|
|
14
|
+
private readonly _logGroupName;
|
|
15
|
+
private readonly _logStreamName;
|
|
16
|
+
private readonly _flushInterval;
|
|
17
|
+
private _buffer;
|
|
18
|
+
private _timer;
|
|
19
|
+
private _flushing;
|
|
20
|
+
private _ready;
|
|
21
|
+
constructor(opts: CloudwatchTransportOpts);
|
|
22
|
+
log(info: any, cb: () => void): void;
|
|
23
|
+
private _scheduleFlush;
|
|
24
|
+
private _ensureStream;
|
|
25
|
+
private _createIgnoringExisting;
|
|
26
|
+
private _flush;
|
|
27
|
+
private _chunk;
|
|
28
|
+
close(): void;
|
|
29
|
+
}
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CloudwatchTransport = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const winston_transport_1 = tslib_1.__importDefault(require("winston-transport"));
|
|
6
|
+
const client_cloudwatch_logs_1 = require("@aws-sdk/client-cloudwatch-logs");
|
|
7
|
+
// Limiti dell'API PutLogEvents: max 10.000 eventi e 1.048.576 byte per batch,
|
|
8
|
+
// dove ogni evento conta come byte UTF-8 del messaggio + 26 byte di overhead.
|
|
9
|
+
const MAX_BATCH_COUNT = 10000;
|
|
10
|
+
const MAX_BATCH_BYTES = 1048576;
|
|
11
|
+
const EVENT_OVERHEAD = 26;
|
|
12
|
+
const FLUSH_THRESHOLD = 1000;
|
|
13
|
+
class CloudwatchTransport extends winston_transport_1.default {
|
|
14
|
+
constructor(opts) {
|
|
15
|
+
super(opts);
|
|
16
|
+
this._buffer = [];
|
|
17
|
+
this._timer = null;
|
|
18
|
+
this._flushing = false;
|
|
19
|
+
this._ready = null;
|
|
20
|
+
this._client = new client_cloudwatch_logs_1.CloudWatchLogsClient({
|
|
21
|
+
region: opts.region,
|
|
22
|
+
...(opts.credentials ? { credentials: opts.credentials } : {}),
|
|
23
|
+
});
|
|
24
|
+
this._logGroupName = opts.logGroupName;
|
|
25
|
+
this._logStreamName = opts.logStreamName;
|
|
26
|
+
this._flushInterval = opts.flushInterval ?? 2000;
|
|
27
|
+
}
|
|
28
|
+
log(info, cb) {
|
|
29
|
+
setImmediate(() => this.emit('logged', info));
|
|
30
|
+
const message = info[Symbol.for('message')] ?? JSON.stringify(info);
|
|
31
|
+
this._buffer.push({ timestamp: Date.now(), message });
|
|
32
|
+
if (this._buffer.length >= FLUSH_THRESHOLD) {
|
|
33
|
+
void this._flush();
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
this._scheduleFlush();
|
|
37
|
+
}
|
|
38
|
+
cb();
|
|
39
|
+
}
|
|
40
|
+
_scheduleFlush() {
|
|
41
|
+
if (this._timer)
|
|
42
|
+
return;
|
|
43
|
+
this._timer = setTimeout(() => {
|
|
44
|
+
this._timer = null;
|
|
45
|
+
void this._flush();
|
|
46
|
+
}, this._flushInterval);
|
|
47
|
+
}
|
|
48
|
+
async _ensureStream() {
|
|
49
|
+
if (this._ready)
|
|
50
|
+
return this._ready;
|
|
51
|
+
this._ready = (async () => {
|
|
52
|
+
await this._createIgnoringExisting(new client_cloudwatch_logs_1.CreateLogGroupCommand({ logGroupName: this._logGroupName }));
|
|
53
|
+
await this._createIgnoringExisting(new client_cloudwatch_logs_1.CreateLogStreamCommand({
|
|
54
|
+
logGroupName: this._logGroupName,
|
|
55
|
+
logStreamName: this._logStreamName,
|
|
56
|
+
}));
|
|
57
|
+
})();
|
|
58
|
+
return this._ready;
|
|
59
|
+
}
|
|
60
|
+
async _createIgnoringExisting(command) {
|
|
61
|
+
try {
|
|
62
|
+
await this._client.send(command);
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
// se group/stream esistono già non è un errore; altrimenti rilancio e
|
|
66
|
+
// azzero _ready così un log successivo riprova la creazione.
|
|
67
|
+
if (err?.name !== 'ResourceAlreadyExistsException') {
|
|
68
|
+
this._ready = null;
|
|
69
|
+
throw err;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async _flush() {
|
|
74
|
+
if (this._flushing || this._buffer.length === 0)
|
|
75
|
+
return;
|
|
76
|
+
this._flushing = true;
|
|
77
|
+
if (this._timer) {
|
|
78
|
+
clearTimeout(this._timer);
|
|
79
|
+
this._timer = null;
|
|
80
|
+
}
|
|
81
|
+
// gli eventi di un batch devono essere ordinati per timestamp crescente.
|
|
82
|
+
const events = this._buffer
|
|
83
|
+
.splice(0)
|
|
84
|
+
.sort((a, b) => (a.timestamp ?? 0) - (b.timestamp ?? 0));
|
|
85
|
+
try {
|
|
86
|
+
await this._ensureStream();
|
|
87
|
+
for (const batch of this._chunk(events)) {
|
|
88
|
+
await this._client.send(new client_cloudwatch_logs_1.PutLogEventsCommand({
|
|
89
|
+
logGroupName: this._logGroupName,
|
|
90
|
+
logStreamName: this._logStreamName,
|
|
91
|
+
logEvents: batch,
|
|
92
|
+
}));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
// non rimettiamo in coda gli eventi falliti per evitare crescita
|
|
97
|
+
// illimitata del buffer: il logging non deve mai far crashare l'app.
|
|
98
|
+
console.error('[CloudwatchTransport] flush failed:', err);
|
|
99
|
+
}
|
|
100
|
+
finally {
|
|
101
|
+
this._flushing = false;
|
|
102
|
+
if (this._buffer.length > 0)
|
|
103
|
+
this._scheduleFlush();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
*_chunk(events) {
|
|
107
|
+
let batch = [];
|
|
108
|
+
let bytes = 0;
|
|
109
|
+
for (const event of events) {
|
|
110
|
+
const size = Buffer.byteLength(event.message ?? '', 'utf8') + EVENT_OVERHEAD;
|
|
111
|
+
if (batch.length >= MAX_BATCH_COUNT || bytes + size > MAX_BATCH_BYTES) {
|
|
112
|
+
if (batch.length)
|
|
113
|
+
yield batch;
|
|
114
|
+
batch = [];
|
|
115
|
+
bytes = 0;
|
|
116
|
+
}
|
|
117
|
+
batch.push(event);
|
|
118
|
+
bytes += size;
|
|
119
|
+
}
|
|
120
|
+
if (batch.length)
|
|
121
|
+
yield batch;
|
|
122
|
+
}
|
|
123
|
+
close() {
|
|
124
|
+
if (this._timer) {
|
|
125
|
+
clearTimeout(this._timer);
|
|
126
|
+
this._timer = null;
|
|
127
|
+
}
|
|
128
|
+
void this._flush();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
exports.CloudwatchTransport = CloudwatchTransport;
|
|
132
|
+
//# sourceMappingURL=cloudwatch.transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudwatch.transport.js","sourceRoot":"","sources":["../../../../../packages/logger/src/transports/cloudwatch.transport.ts"],"names":[],"mappings":"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"}
|