zario 0.3.6 → 0.4.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/README.md +102 -359
- package/dist/cjs/aggregation/LogAggregator.js +14 -6
- package/dist/cjs/core/Logger.js +36 -11
- package/dist/cjs/index.js +4 -1
- package/dist/cjs/transports/CircuitBreakerTransport.js +171 -0
- package/dist/cjs/transports/DeadLetterQueue.js +129 -0
- package/dist/cjs/transports/FileTransport.js +78 -7
- package/dist/cjs/transports/HttpTransport.js +15 -3
- package/dist/cjs/transports/RetryTransport.js +199 -0
- package/dist/cjs/transports/index.js +3 -0
- package/dist/cjs/types/TypeInterfaces.js +2 -0
- package/dist/esm/aggregation/LogAggregator.d.ts +4 -2
- package/dist/esm/aggregation/LogAggregator.js +14 -6
- package/dist/esm/core/Logger.d.ts +11 -2
- package/dist/esm/core/Logger.js +36 -11
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/index.js +2 -2
- package/dist/esm/transports/CircuitBreakerTransport.d.ts +43 -0
- package/dist/esm/transports/CircuitBreakerTransport.js +167 -0
- package/dist/esm/transports/DeadLetterQueue.d.ts +34 -0
- package/dist/esm/transports/DeadLetterQueue.js +92 -0
- package/dist/esm/transports/FileTransport.d.ts +4 -0
- package/dist/esm/transports/FileTransport.js +78 -7
- package/dist/esm/transports/HttpTransport.d.ts +2 -0
- package/dist/esm/transports/HttpTransport.js +15 -3
- package/dist/esm/transports/RetryTransport.d.ts +67 -0
- package/dist/esm/transports/RetryTransport.js +195 -0
- package/dist/esm/transports/Transport.d.ts +1 -0
- package/dist/esm/transports/index.d.ts +3 -0
- package/dist/esm/transports/index.js +3 -0
- package/dist/esm/types/TypeInterfaces.d.ts +7 -0
- package/dist/esm/types/TypeInterfaces.js +1 -0
- package/package.json +87 -72
package/README.md
CHANGED
|
@@ -1,359 +1,102 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
|
72
|
-
|
|
|
73
|
-
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
})
|
|
104
|
-
]
|
|
105
|
-
});
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
#### HTTP Transport
|
|
109
|
-
|
|
110
|
-
```js
|
|
111
|
-
import { Logger, HttpTransport } from "zario";
|
|
112
|
-
|
|
113
|
-
const logger = new Logger({
|
|
114
|
-
transports: [
|
|
115
|
-
new HttpTransport({
|
|
116
|
-
url: 'https://api.example.com/logs',
|
|
117
|
-
method: 'POST',
|
|
118
|
-
headers: {
|
|
119
|
-
'Content-Type': 'application/json',
|
|
120
|
-
'Authorization': 'Bearer your-token-here'
|
|
121
|
-
},
|
|
122
|
-
timeout: 10000, // Request timeout in ms
|
|
123
|
-
retries: 3 // Number of retry attempts
|
|
124
|
-
})
|
|
125
|
-
]
|
|
126
|
-
});
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
### Advanced Filtering
|
|
130
|
-
|
|
131
|
-
Filter logs based on various criteria using built-in filter classes:
|
|
132
|
-
|
|
133
|
-
```js
|
|
134
|
-
import {
|
|
135
|
-
Logger,
|
|
136
|
-
ConsoleTransport,
|
|
137
|
-
LevelFilter,
|
|
138
|
-
PrefixFilter,
|
|
139
|
-
MetadataFilter,
|
|
140
|
-
CompositeFilter,
|
|
141
|
-
OrFilter,
|
|
142
|
-
PredicateFilter
|
|
143
|
-
} from "zario";
|
|
144
|
-
|
|
145
|
-
// Level filter - only allow specific log levels
|
|
146
|
-
const levelFilter = new LevelFilter(['info', 'error']);
|
|
147
|
-
|
|
148
|
-
// Prefix filter - only allow logs with specific prefixes
|
|
149
|
-
const prefixFilter = new PrefixFilter(['[API]', '[DB]']);
|
|
150
|
-
|
|
151
|
-
// Metadata filter - only allow logs with specific metadata
|
|
152
|
-
const metadataFilter = new MetadataFilter({ userId: 123 });
|
|
153
|
-
|
|
154
|
-
// Composite filter - combines multiple filters with AND logic
|
|
155
|
-
// Note: With an empty array, CompositeFilter allows all logs (vacuous truth)
|
|
156
|
-
const compositeFilter = new CompositeFilter([levelFilter, prefixFilter]);
|
|
157
|
-
|
|
158
|
-
// Or filter - combines multiple filters with OR logic
|
|
159
|
-
// Note: With an empty array, OrFilter blocks all logs (no matching conditions)
|
|
160
|
-
const orFilter = new OrFilter([levelFilter, metadataFilter]);
|
|
161
|
-
|
|
162
|
-
// Predicate filter - custom filtering function
|
|
163
|
-
const predicateFilter = new PredicateFilter((logData) => {
|
|
164
|
-
return logData.level !== 'debug'; // Filter out debug messages
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
// Create logger with filters
|
|
168
|
-
const filteredLogger = new Logger({
|
|
169
|
-
level: 'debug',
|
|
170
|
-
transports: [new ConsoleTransport()],
|
|
171
|
-
filters: [compositeFilter, predicateFilter] // Apply multiple filters
|
|
172
|
-
});
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
### Structured Logging Extensions
|
|
176
|
-
|
|
177
|
-
Enhance your logs with additional metadata using structured logging extensions:
|
|
178
|
-
|
|
179
|
-
```js
|
|
180
|
-
import {
|
|
181
|
-
Logger,
|
|
182
|
-
ConsoleTransport,
|
|
183
|
-
LogEnrichmentPipeline,
|
|
184
|
-
MetadataEnricher
|
|
185
|
-
} from "zario";
|
|
186
|
-
|
|
187
|
-
// Create enrichers to add metadata to logs
|
|
188
|
-
const staticEnricher = MetadataEnricher.addStaticFields({
|
|
189
|
-
service: 'user-service',
|
|
190
|
-
version: '1.0.0'
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
const dynamicEnricher = MetadataEnricher.addDynamicFields(() => ({
|
|
194
|
-
processId: process.pid,
|
|
195
|
-
memoryUsage: process.memoryUsage().heapUsed
|
|
196
|
-
}));
|
|
197
|
-
|
|
198
|
-
const processEnricher = MetadataEnricher.addProcessInfo();
|
|
199
|
-
const envEnricher = MetadataEnricher.addEnvironmentInfo();
|
|
200
|
-
|
|
201
|
-
// Create a pipeline with multiple enrichers
|
|
202
|
-
const enricherPipeline = new LogEnrichmentPipeline([
|
|
203
|
-
staticEnricher,
|
|
204
|
-
dynamicEnricher,
|
|
205
|
-
processEnricher,
|
|
206
|
-
envEnricher
|
|
207
|
-
]);
|
|
208
|
-
|
|
209
|
-
// Create logger with enrichers
|
|
210
|
-
const enrichedLogger = new Logger({
|
|
211
|
-
level: 'info',
|
|
212
|
-
transports: [new ConsoleTransport()],
|
|
213
|
-
enrichers: enricherPipeline
|
|
214
|
-
});
|
|
215
|
-
|
|
216
|
-
enrichedLogger.info('User login', { userId: 123 });
|
|
217
|
-
// Output will include additional metadata fields
|
|
218
|
-
|
|
219
|
-
// Add enrichers dynamically
|
|
220
|
-
enrichedLogger.addEnricher((logData) => {
|
|
221
|
-
return {
|
|
222
|
-
...logData,
|
|
223
|
-
timestamp: new Date().toISOString(),
|
|
224
|
-
additionalField: 'some-value'
|
|
225
|
-
};
|
|
226
|
-
});
|
|
227
|
-
```
|
|
228
|
-
|
|
229
|
-
### Log Aggregation
|
|
230
|
-
|
|
231
|
-
Aggregate logs in batches or based on time intervals:
|
|
232
|
-
|
|
233
|
-
```js
|
|
234
|
-
import {
|
|
235
|
-
Logger,
|
|
236
|
-
ConsoleTransport,
|
|
237
|
-
BatchAggregator,
|
|
238
|
-
TimeBasedAggregator,
|
|
239
|
-
CompositeAggregator
|
|
240
|
-
} from "zario";
|
|
241
|
-
|
|
242
|
-
// Batch aggregator - flushes when batch size is reached
|
|
243
|
-
const batchAggregator = new BatchAggregator(10, (logs) => {
|
|
244
|
-
// Process batch of 10 logs
|
|
245
|
-
console.log(`Processing ${logs.length} logs`);
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
// Time-based aggregator - flushes after time interval
|
|
249
|
-
const timeAggregator = new TimeBasedAggregator(5000, (logs) => {
|
|
250
|
-
// Process logs every 5 seconds
|
|
251
|
-
console.log(`Processing ${logs.length} logs`);
|
|
252
|
-
});
|
|
253
|
-
|
|
254
|
-
// Create logger with aggregators
|
|
255
|
-
const aggregatedLogger = new Logger({
|
|
256
|
-
level: 'info',
|
|
257
|
-
transports: [new ConsoleTransport()],
|
|
258
|
-
aggregators: [batchAggregator]
|
|
259
|
-
});
|
|
260
|
-
|
|
261
|
-
// Manually flush aggregators
|
|
262
|
-
aggregatedLogger.flushAggregators();
|
|
263
|
-
|
|
264
|
-
// Stop time-based aggregator timer
|
|
265
|
-
// timeAggregator.stop(); // Available for TimeBasedAggregator
|
|
266
|
-
```
|
|
267
|
-
|
|
268
|
-
### Methods
|
|
269
|
-
|
|
270
|
-
- `logger.debug(message, metadata?)` - Debug-level logging
|
|
271
|
-
- `logger.info(message, metadata?)` - Info-level logging
|
|
272
|
-
- `logger.warn(message, metadata?)` - Warning-level logging
|
|
273
|
-
- `logger.error(message, metadata?)` - Error-level logging
|
|
274
|
-
- `logger.logWithLevel(level, message, metadata?)` - Log a message at an arbitrary/custom level
|
|
275
|
-
- `logger.createChild(options)` - Creates a child logger with inherited settings
|
|
276
|
-
- `logger.setLevel(level)` - Change the logger level at runtime
|
|
277
|
-
- `logger.setFormat(format)` - Set the output format to text or json
|
|
278
|
-
- `logger.addFilter(filter)` - Add a filter to the logger (LevelFilter, PrefixFilter, MetadataFilter, etc.)
|
|
279
|
-
- `logger.removeFilter(filter)` - Remove a filter from the logger
|
|
280
|
-
- `logger.addAggregator(aggregator)` - Add an aggregator to the logger (BatchAggregator, TimeBasedAggregator, etc.)
|
|
281
|
-
- `logger.removeAggregator(aggregator)` - Remove an aggregator from the logger
|
|
282
|
-
- `logger.flushAggregators()` - Manually flush all aggregators
|
|
283
|
-
- `logger.addEnricher(enricher)` - Add an enricher to the logger for structured logging
|
|
284
|
-
- `logger.startTimer(name)` - Create a performance timer
|
|
285
|
-
|
|
286
|
-
## Usage Examples
|
|
287
|
-
|
|
288
|
-
### Basic Usage
|
|
289
|
-
|
|
290
|
-
```js
|
|
291
|
-
import { Logger, ConsoleTransport } from "zario";
|
|
292
|
-
|
|
293
|
-
const logger = new Logger({
|
|
294
|
-
level: "info",
|
|
295
|
-
colorize: true,
|
|
296
|
-
transports: [new ConsoleTransport()]
|
|
297
|
-
});
|
|
298
|
-
|
|
299
|
-
logger.info("Application started");
|
|
300
|
-
logger.error("Something went wrong", { userId: 123 });
|
|
301
|
-
```
|
|
302
|
-
|
|
303
|
-
### JSON Format
|
|
304
|
-
|
|
305
|
-
```js
|
|
306
|
-
const logger = new Logger({ json: true });
|
|
307
|
-
```
|
|
308
|
-
|
|
309
|
-
### Custom Levels & Colors
|
|
310
|
-
|
|
311
|
-
```js
|
|
312
|
-
import { Logger, ConsoleTransport } from "zario";
|
|
313
|
-
|
|
314
|
-
const logger = new Logger({
|
|
315
|
-
level: 'info',
|
|
316
|
-
customLevels: {
|
|
317
|
-
'success': 6, // Higher priority than error (5).
|
|
318
|
-
'verbose': 1, // Lower priority than debug (2).
|
|
319
|
-
'critical': 7, // Highest priority.
|
|
320
|
-
},
|
|
321
|
-
customColors: {
|
|
322
|
-
'success': 'green',
|
|
323
|
-
'verbose': 'cyan',
|
|
324
|
-
'critical': 'brightRed',
|
|
325
|
-
},
|
|
326
|
-
transports: [
|
|
327
|
-
new ConsoleTransport()
|
|
328
|
-
]
|
|
329
|
-
});
|
|
330
|
-
|
|
331
|
-
// Using custom levels.
|
|
332
|
-
logger.logWithLevel('success', 'This is a success message in green!');
|
|
333
|
-
logger.logWithLevel('verbose', 'This is a verbose message in cyan');
|
|
334
|
-
logger.logWithLevel('critical', 'This is a critical message in bright red');
|
|
335
|
-
```
|
|
336
|
-
|
|
337
|
-
### Child Loggers
|
|
338
|
-
|
|
339
|
-
```js
|
|
340
|
-
const main = new Logger({ prefix: "[APP]" });
|
|
341
|
-
const db = main.createChild({ prefix: "[DB]" });
|
|
342
|
-
|
|
343
|
-
main.info("App initialized");
|
|
344
|
-
db.error("Connection timeout");
|
|
345
|
-
```
|
|
346
|
-
|
|
347
|
-
### Multiple Transports
|
|
348
|
-
|
|
349
|
-
```js
|
|
350
|
-
import { Logger, ConsoleTransport, FileTransport } from "zario";
|
|
351
|
-
|
|
352
|
-
const logger = new Logger({
|
|
353
|
-
level: 'info',
|
|
354
|
-
transports: [
|
|
355
|
-
new ConsoleTransport(),
|
|
356
|
-
new FileTransport({ path: './logs/app.log' })
|
|
357
|
-
]
|
|
358
|
-
});
|
|
359
|
-
```
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
<a id="top"></a>
|
|
4
|
+
|
|
5
|
+
# 📝 Zario
|
|
6
|
+
|
|
7
|
+
### A Minimal Logging Solution for TypeScript
|
|
8
|
+
|
|
9
|
+
[](https://www.npmjs.com/package/zario)
|
|
10
|
+
[](./LICENSE)
|
|
11
|
+
[](https://www.npmjs.com/package/zario)
|
|
12
|
+
[](https://bundlephobia.com/package/zario)
|
|
13
|
+
](https://github.com/Dev-Dami/zario/actions)
|
|
14
|
+
|
|
15
|
+
**Built on January 8, 2026**
|
|
16
|
+
|
|
17
|
+
<br/>
|
|
18
|
+
|
|
19
|
+
**Fast** • **Lightweight** • **Zero Dependencies** • **TypeScript Native**
|
|
20
|
+
|
|
21
|
+
<br/>
|
|
22
|
+
|
|
23
|
+
[📖 Documentation](#-documentation) · [⚡ Quick Start](#-quick-start) · [✨ Features](#-features) · [🤝 Contributing](#-contributing)
|
|
24
|
+
|
|
25
|
+
<br/>
|
|
26
|
+
|
|
27
|
+

|
|
28
|
+
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
<br/>
|
|
32
|
+
|
|
33
|
+
## Features
|
|
34
|
+
|
|
35
|
+
- **Lightweight** — minimal footprint, fast execution
|
|
36
|
+
- **Simple API** — intuitive methods like `info()`, `warn()`, `error()`
|
|
37
|
+
- **Flexible formatting** — plain text or structured JSON
|
|
38
|
+
- **Multiple transports** — Console, File (streaming rotation), HTTP (async retry), CircuitBreaker, and DeadLetterQueue
|
|
39
|
+
- **Child loggers** — scoped logging for modules or requests
|
|
40
|
+
- **Async mode** — non-blocking writes for high-performance applications
|
|
41
|
+
- **Memory safe** — bounded queues and memory-efficient streaming
|
|
42
|
+
- **Customizable** — custom log levels, colors, and filtering
|
|
43
|
+
|
|
44
|
+
## 📦 Installation
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
npm install zario
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## 🚀 Quick Start
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
import { Logger, ConsoleTransport } from "zario";
|
|
54
|
+
|
|
55
|
+
const logger = new Logger({
|
|
56
|
+
level: "info",
|
|
57
|
+
colorize: true,
|
|
58
|
+
transports: [new ConsoleTransport()],
|
|
59
|
+
prefix: "[MyApp]",
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
logger.info("🚀 Server started on port 3000");
|
|
63
|
+
logger.warn("⚠️ High memory usage detected");
|
|
64
|
+
logger.error("❌ Database connection failed", { code: 500 });
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## 📖 Documentation
|
|
68
|
+
|
|
69
|
+
Documentation:
|
|
70
|
+
|
|
71
|
+
| Section | Description |
|
|
72
|
+
| --------------------------------------------------- | ----------------------------------------------------------------------------- |
|
|
73
|
+
| [📘 **Introduction**](./docs/introduction.md) | Philosophy, core features, and common use cases. |
|
|
74
|
+
| [🚀 **Getting Started**](./docs/getting-started.md) | Detailed installation and environment auto-configuration. |
|
|
75
|
+
| [⚙️ **Configuration**](./docs/configuration.md) | Full reference for all logger options, custom levels, and colors. |
|
|
76
|
+
| [📖 **API Reference**](./docs/api-reference.md) | Detailed API documentation for the Logger class and utilities. |
|
|
77
|
+
| [📁 **Transports**](./docs/transports.md) | Guide to Console, File, HTTP, CircuitBreaker, and DeadLetterQueue transports. |
|
|
78
|
+
| [🧩 **Advanced Usage**](./docs/advanced-usage.md) | Filters, Enrichers (Structured Logging), and Aggregators. |
|
|
79
|
+
| [📊 **Log Formats**](./docs/log-formats.md) | Specification for Text and JSON output formats. |
|
|
80
|
+
| [🗺️ **Roadmap**](./docs/roadmap.md) | Future plans and upcoming features. |
|
|
81
|
+
|
|
82
|
+
## 🤝 Contributing
|
|
83
|
+
|
|
84
|
+
We welcome contributions! Whether it's bug reports, feature requests, or code contributions. Please see our [Contributing Guide](./CONTRIBUTING.md) for more details.
|
|
85
|
+
|
|
86
|
+
## 📄 License
|
|
87
|
+
|
|
88
|
+
This project is licensed under the **MIT License** - see the [LICENSE](./LICENSE) file for full details.
|
|
89
|
+
|
|
90
|
+
<br/>
|
|
91
|
+
|
|
92
|
+
<div align="center">
|
|
93
|
+
|
|
94
|
+
### Developed for developers
|
|
95
|
+
|
|
96
|
+
⭐ Star this repository to show your support
|
|
97
|
+
|
|
98
|
+
</div>
|
|
99
|
+
|
|
100
|
+
<br/>
|
|
101
|
+
|
|
102
|
+
[⬆ Back to Top](#top)
|
|
@@ -3,13 +3,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.CompositeAggregator = exports.TimeBasedAggregator = exports.BatchAggregator = void 0;
|
|
4
4
|
//Aggregates logs in memory and flushes them in batches
|
|
5
5
|
class BatchAggregator {
|
|
6
|
-
constructor(maxSize = 100, flushCallback) {
|
|
6
|
+
constructor(maxSize = 100, flushCallback, maxQueueSize = 10000) {
|
|
7
7
|
this.logs = [];
|
|
8
8
|
this.pendingFlush = null;
|
|
9
9
|
this.maxSize = maxSize;
|
|
10
|
+
this.maxQueueSize = maxQueueSize;
|
|
10
11
|
this.flushCallback = flushCallback;
|
|
11
12
|
}
|
|
12
13
|
aggregate(logData, formatter) {
|
|
14
|
+
if (this.logs.length >= this.maxQueueSize) {
|
|
15
|
+
this.logs.shift();
|
|
16
|
+
}
|
|
13
17
|
this.logs.push({ logData, formatter });
|
|
14
18
|
if (this.logs.length >= this.maxSize && !this.pendingFlush) {
|
|
15
19
|
const result = this.flush();
|
|
@@ -48,19 +52,23 @@ class BatchAggregator {
|
|
|
48
52
|
exports.BatchAggregator = BatchAggregator;
|
|
49
53
|
//Aggregates logs based on a time interval
|
|
50
54
|
class TimeBasedAggregator {
|
|
51
|
-
constructor(flushInterval, flushCallback) {
|
|
55
|
+
constructor(flushInterval, flushCallback, maxQueueSize = 10000) {
|
|
52
56
|
this.logs = [];
|
|
53
57
|
this.timer = null;
|
|
54
58
|
this.flushInterval = flushInterval;
|
|
59
|
+
this.maxQueueSize = maxQueueSize;
|
|
55
60
|
this.flushCallback = flushCallback;
|
|
56
61
|
}
|
|
57
62
|
aggregate(logData, formatter) {
|
|
63
|
+
if (this.logs.length >= this.maxQueueSize) {
|
|
64
|
+
this.logs.shift();
|
|
65
|
+
}
|
|
58
66
|
this.logs.push({ logData, formatter });
|
|
59
|
-
// Start
|
|
67
|
+
// Start timer if it's not already running
|
|
60
68
|
if (!this.timer) {
|
|
61
69
|
this.timer = setTimeout(() => {
|
|
62
70
|
const result = this.flush();
|
|
63
|
-
// Handle
|
|
71
|
+
// Handle case where flush returns a Promise (async flushCallback)
|
|
64
72
|
if (result instanceof Promise) {
|
|
65
73
|
result.catch((error) => {
|
|
66
74
|
console.error("Error in TimeBasedAggregator flush callback:", error);
|
|
@@ -71,7 +79,7 @@ class TimeBasedAggregator {
|
|
|
71
79
|
}
|
|
72
80
|
flush() {
|
|
73
81
|
if (this.logs.length > 0) {
|
|
74
|
-
// Clear
|
|
82
|
+
// Clear timer if it exists
|
|
75
83
|
if (this.timer) {
|
|
76
84
|
clearTimeout(this.timer);
|
|
77
85
|
this.timer = null;
|
|
@@ -94,7 +102,7 @@ class TimeBasedAggregator {
|
|
|
94
102
|
}
|
|
95
103
|
}
|
|
96
104
|
}
|
|
97
|
-
//Stop
|
|
105
|
+
//Stop aggregator and cancel any pending timer without flushing
|
|
98
106
|
stop() {
|
|
99
107
|
if (this.timer) {
|
|
100
108
|
clearTimeout(this.timer);
|
package/dist/cjs/core/Logger.js
CHANGED
|
@@ -3,26 +3,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.Logger = void 0;
|
|
4
4
|
const Formatter_js_1 = require("./Formatter.js");
|
|
5
5
|
const ConsoleTransport_js_1 = require("../transports/ConsoleTransport.js");
|
|
6
|
+
const RetryTransport_js_1 = require("../transports/RetryTransport.js");
|
|
6
7
|
const StructuredExtensions_js_1 = require("../structured/StructuredExtensions.js");
|
|
7
8
|
const index_js_1 = require("../utils/index.js");
|
|
8
|
-
|
|
9
|
+
const events_1 = require("events");
|
|
10
|
+
class Logger extends events_1.EventEmitter {
|
|
9
11
|
constructor(options = {}) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
this.
|
|
13
|
-
const { level, colorize, json, transports = [], timestampFormat = "YYYY-MM-DD HH:mm:ss", prefix, timestamp, context = {}, parent, asyncMode, customLevels = {}, customColors = {}, filters = [], aggregators = [], enrichers, } = options;
|
|
14
|
-
this.parent = parent; // Set parent
|
|
12
|
+
const { level, colorize, json, transports = [], timestampFormat = "YYYY-MM-DD HH:mm:ss", prefix, timestamp, context = {}, parent, asyncMode, async, customLevels = {}, customColors = {}, filters = [], aggregators = [], enrichers, } = options;
|
|
13
|
+
super();
|
|
14
|
+
this.parent = parent;
|
|
15
15
|
this.context = { ...context }; // Init context
|
|
16
16
|
this.customLevels = customLevels; // custom log store
|
|
17
17
|
this.asyncMode = false;
|
|
18
18
|
this.filters = [...filters]; // Copy filters
|
|
19
19
|
this.aggregators = [...aggregators]; // Copy aggregators
|
|
20
|
-
this.enrichers = enrichers ?? new StructuredExtensions_js_1.LogEnrichmentPipeline();
|
|
20
|
+
this.enrichers = enrichers ?? new StructuredExtensions_js_1.LogEnrichmentPipeline();
|
|
21
|
+
this.deadLetterQueue = options.deadLetterQueue;
|
|
22
|
+
this.retryOptions = options.retryOptions;
|
|
21
23
|
if (this.parent) {
|
|
22
24
|
this.level = level ?? this.parent.level;
|
|
23
25
|
this.prefix = prefix ?? this.parent.prefix;
|
|
24
26
|
this.timestamp = timestamp ?? this.parent.timestamp;
|
|
25
|
-
this.asyncMode = asyncMode ?? this.parent.asyncMode;
|
|
27
|
+
this.asyncMode = (async ?? asyncMode) ?? this.parent.asyncMode;
|
|
26
28
|
this.transports =
|
|
27
29
|
transports && transports.length > 0
|
|
28
30
|
? this.initTransports(transports)
|
|
@@ -68,7 +70,7 @@ class Logger {
|
|
|
68
70
|
const defaultTransports = transports && transports.length > 0
|
|
69
71
|
? transports
|
|
70
72
|
: this.getDefaultTransports(isProd);
|
|
71
|
-
this.asyncMode = asyncMode ?? this.getDefaultAsyncMode(isProd);
|
|
73
|
+
this.asyncMode = (async ?? asyncMode) ?? this.getDefaultAsyncMode(isProd);
|
|
72
74
|
this.transports = this.initTransports(defaultTransports);
|
|
73
75
|
this.formatter = new Formatter_js_1.Formatter({
|
|
74
76
|
colorize: this.getDefaultColorizeValue(colorize),
|
|
@@ -115,7 +117,15 @@ class Logger {
|
|
|
115
117
|
const initializedTransports = [];
|
|
116
118
|
for (const transportConfig of transportConfigs) {
|
|
117
119
|
if (this.isTransport(transportConfig)) {
|
|
118
|
-
|
|
120
|
+
let transport = transportConfig;
|
|
121
|
+
// Check if transport is already a RetryTransport to avoid double-wrapping
|
|
122
|
+
if (this.retryOptions && !(transport instanceof RetryTransport_js_1.RetryTransport)) {
|
|
123
|
+
transport = new RetryTransport_js_1.RetryTransport({
|
|
124
|
+
...this.retryOptions,
|
|
125
|
+
wrappedTransport: transport
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
initializedTransports.push(transport);
|
|
119
129
|
}
|
|
120
130
|
}
|
|
121
131
|
return initializedTransports;
|
|
@@ -172,7 +182,14 @@ class Logger {
|
|
|
172
182
|
prefix: this.prefix,
|
|
173
183
|
};
|
|
174
184
|
// Apply enrichers to the log data
|
|
175
|
-
|
|
185
|
+
try {
|
|
186
|
+
logData = this.enrichers.process(logData);
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
console.error('Error in enrichers:', error);
|
|
190
|
+
this.emit('error', { type: 'enricher', error });
|
|
191
|
+
// Continue with original logData if enrichment fails
|
|
192
|
+
}
|
|
176
193
|
// Check if the log should be emitted based on filters
|
|
177
194
|
// Use a copy to prevent concurrent modification issues if filters are modified during logging
|
|
178
195
|
const currentFilters = [...this.filters];
|
|
@@ -187,6 +204,7 @@ class Logger {
|
|
|
187
204
|
if (transport.writeAsync) {
|
|
188
205
|
transport.writeAsync(logData, this.formatter).catch((error) => {
|
|
189
206
|
console.error("Error during async logging:", error);
|
|
207
|
+
this.emit('error', { type: 'transport', error });
|
|
190
208
|
});
|
|
191
209
|
}
|
|
192
210
|
else {
|
|
@@ -209,6 +227,7 @@ class Logger {
|
|
|
209
227
|
}
|
|
210
228
|
catch (error) {
|
|
211
229
|
console.error('Error in aggregator:', error);
|
|
230
|
+
this.emit('error', { type: 'aggregator', error });
|
|
212
231
|
}
|
|
213
232
|
}
|
|
214
233
|
}
|
|
@@ -225,6 +244,9 @@ class Logger {
|
|
|
225
244
|
error(message, metadata) {
|
|
226
245
|
this.log("error", message, metadata);
|
|
227
246
|
}
|
|
247
|
+
fatal(message, metadata) {
|
|
248
|
+
this.log("fatal", message, metadata);
|
|
249
|
+
}
|
|
228
250
|
silent(message, metadata) {
|
|
229
251
|
this.log("silent", message, metadata);
|
|
230
252
|
}
|
|
@@ -317,6 +339,9 @@ class Logger {
|
|
|
317
339
|
}
|
|
318
340
|
await Promise.all(flushPromises);
|
|
319
341
|
}
|
|
342
|
+
getTransports() {
|
|
343
|
+
return this.transports;
|
|
344
|
+
}
|
|
320
345
|
}
|
|
321
346
|
exports.Logger = Logger;
|
|
322
347
|
Logger.defaultTransportsFactory = null;
|
package/dist/cjs/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Timer = exports.LogEnrichmentPipeline = exports.MetadataEnricher = exports.CompositeAggregator = exports.TimeBasedAggregator = exports.BatchAggregator = exports.FieldFilter = exports.MetadataFilter = exports.PrefixFilter = exports.LevelFilter = exports.PredicateFilter = exports.NotFilter = exports.OrFilter = exports.CompositeFilter = exports.FilterableTransport = exports.HttpTransport = exports.FileTransport = exports.ConsoleTransport = exports.Logger = void 0;
|
|
3
|
+
exports.Timer = exports.LogEnrichmentPipeline = exports.MetadataEnricher = exports.CompositeAggregator = exports.TimeBasedAggregator = exports.BatchAggregator = exports.FieldFilter = exports.MetadataFilter = exports.PrefixFilter = exports.LevelFilter = exports.PredicateFilter = exports.NotFilter = exports.OrFilter = exports.CompositeFilter = exports.DeadLetterQueue = exports.CircuitBreakerTransport = exports.RetryTransport = exports.FilterableTransport = exports.HttpTransport = exports.FileTransport = exports.ConsoleTransport = exports.Logger = void 0;
|
|
4
4
|
const Logger_js_1 = require("./core/Logger.js");
|
|
5
5
|
Object.defineProperty(exports, "Logger", { enumerable: true, get: function () { return Logger_js_1.Logger; } });
|
|
6
6
|
const index_js_1 = require("./transports/index.js");
|
|
@@ -8,6 +8,9 @@ Object.defineProperty(exports, "ConsoleTransport", { enumerable: true, get: func
|
|
|
8
8
|
Object.defineProperty(exports, "FileTransport", { enumerable: true, get: function () { return index_js_1.FileTransport; } });
|
|
9
9
|
Object.defineProperty(exports, "HttpTransport", { enumerable: true, get: function () { return index_js_1.HttpTransport; } });
|
|
10
10
|
Object.defineProperty(exports, "FilterableTransport", { enumerable: true, get: function () { return index_js_1.FilterableTransport; } });
|
|
11
|
+
Object.defineProperty(exports, "RetryTransport", { enumerable: true, get: function () { return index_js_1.RetryTransport; } });
|
|
12
|
+
Object.defineProperty(exports, "CircuitBreakerTransport", { enumerable: true, get: function () { return index_js_1.CircuitBreakerTransport; } });
|
|
13
|
+
Object.defineProperty(exports, "DeadLetterQueue", { enumerable: true, get: function () { return index_js_1.DeadLetterQueue; } });
|
|
11
14
|
const index_js_2 = require("./filters/index.js");
|
|
12
15
|
Object.defineProperty(exports, "CompositeFilter", { enumerable: true, get: function () { return index_js_2.CompositeFilter; } });
|
|
13
16
|
Object.defineProperty(exports, "OrFilter", { enumerable: true, get: function () { return index_js_2.OrFilter; } });
|