@tc-libs/logger 3.12.0 → 3.13.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 +53 -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,50 @@ 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
|
+
logGroupName: cw.logGroup,
|
|
146
|
+
logStreamName: cw.logStream,
|
|
147
|
+
}),
|
|
148
|
+
],
|
|
149
|
+
});
|
|
150
|
+
}
|
|
106
151
|
}
|
|
107
152
|
/**
|
|
108
153
|
* Write a 'log' level log.
|
|
@@ -138,21 +183,29 @@ class TcLogService {
|
|
|
138
183
|
this._consoleLog.log('debug', message, optionalParams, null);
|
|
139
184
|
if (this._telegramEnabled)
|
|
140
185
|
this._telegramLogger.debug(message, optionalParams, null);
|
|
186
|
+
if (this._cloudwatchEnabled)
|
|
187
|
+
this._cloudwatchLogger.debug(message, optionalParams, null);
|
|
141
188
|
}
|
|
142
189
|
notifyInfo(message, ...optionalParams) {
|
|
143
190
|
this._consoleLog.log('info', message, optionalParams, null);
|
|
144
191
|
if (this._telegramEnabled)
|
|
145
192
|
this._telegramLogger.info(message, optionalParams, null);
|
|
193
|
+
if (this._cloudwatchEnabled)
|
|
194
|
+
this._cloudwatchLogger.info(message, optionalParams, null);
|
|
146
195
|
}
|
|
147
196
|
notifyWarn(message, ...optionalParams) {
|
|
148
197
|
this._consoleLog.log('warn', message, optionalParams, null);
|
|
149
198
|
if (this._telegramEnabled)
|
|
150
199
|
this._telegramLogger.warn(message, optionalParams, null);
|
|
200
|
+
if (this._cloudwatchEnabled)
|
|
201
|
+
this._cloudwatchLogger.warn(message, optionalParams, null);
|
|
151
202
|
}
|
|
152
203
|
notifyError(message, ...optionalParams) {
|
|
153
204
|
this._consoleLog.log('error', message, optionalParams, null);
|
|
154
205
|
if (this._telegramEnabled)
|
|
155
206
|
this._telegramLogger.error(message, optionalParams, null);
|
|
207
|
+
if (this._cloudwatchEnabled)
|
|
208
|
+
this._cloudwatchLogger.error(message, optionalParams, null);
|
|
156
209
|
}
|
|
157
210
|
}
|
|
158
211
|
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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"}
|