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.
Files changed (33) hide show
  1. package/README.md +102 -359
  2. package/dist/cjs/aggregation/LogAggregator.js +14 -6
  3. package/dist/cjs/core/Logger.js +36 -11
  4. package/dist/cjs/index.js +4 -1
  5. package/dist/cjs/transports/CircuitBreakerTransport.js +171 -0
  6. package/dist/cjs/transports/DeadLetterQueue.js +129 -0
  7. package/dist/cjs/transports/FileTransport.js +78 -7
  8. package/dist/cjs/transports/HttpTransport.js +15 -3
  9. package/dist/cjs/transports/RetryTransport.js +199 -0
  10. package/dist/cjs/transports/index.js +3 -0
  11. package/dist/cjs/types/TypeInterfaces.js +2 -0
  12. package/dist/esm/aggregation/LogAggregator.d.ts +4 -2
  13. package/dist/esm/aggregation/LogAggregator.js +14 -6
  14. package/dist/esm/core/Logger.d.ts +11 -2
  15. package/dist/esm/core/Logger.js +36 -11
  16. package/dist/esm/index.d.ts +2 -2
  17. package/dist/esm/index.js +2 -2
  18. package/dist/esm/transports/CircuitBreakerTransport.d.ts +43 -0
  19. package/dist/esm/transports/CircuitBreakerTransport.js +167 -0
  20. package/dist/esm/transports/DeadLetterQueue.d.ts +34 -0
  21. package/dist/esm/transports/DeadLetterQueue.js +92 -0
  22. package/dist/esm/transports/FileTransport.d.ts +4 -0
  23. package/dist/esm/transports/FileTransport.js +78 -7
  24. package/dist/esm/transports/HttpTransport.d.ts +2 -0
  25. package/dist/esm/transports/HttpTransport.js +15 -3
  26. package/dist/esm/transports/RetryTransport.d.ts +67 -0
  27. package/dist/esm/transports/RetryTransport.js +195 -0
  28. package/dist/esm/transports/Transport.d.ts +1 -0
  29. package/dist/esm/transports/index.d.ts +3 -0
  30. package/dist/esm/transports/index.js +3 -0
  31. package/dist/esm/types/TypeInterfaces.d.ts +7 -0
  32. package/dist/esm/types/TypeInterfaces.js +1 -0
  33. package/package.json +87 -72
package/README.md CHANGED
@@ -1,359 +1,102 @@
1
- # zario
2
-
3
- A minimal, fast logging library for Node.js with TypeScript support.
4
-
5
- ## What's New in 0.3.5
6
-
7
- - Added advanced filtering capabilities with LevelFilter, PrefixFilter, MetadataFilter, CompositeFilter, OrFilter, and PredicateFilter
8
- - Added structured logging extensions with LogEnrichmentPipeline and MetadataEnricher
9
- - Added TimeBasedAggregator.stop() method for proper timer cleanup
10
- - Improved error handling for aggregators and filters with try-catch protection
11
- - Enhanced thread safety with defensive copying of filters during iteration
12
- - Fixed enricher inheritance in child loggers
13
- - Added documentation for empty array behavior in CompositeFilter (allows all) and OrFilter (blocks all)
14
- - Added note about strict equality in MetadataFilter for complex objects
15
-
16
- ## What's New in 0.2.11
17
-
18
- - Added HTTP transport support with new HttpTransport class
19
- - Added log batching functionality for efficient writes
20
- - Added compression support (.gz for gzip, .zz for deflate) for rotated files
21
- - Enhanced rotation with maxSize, maxFiles, and configurable compression
22
-
23
- ## Installation
24
-
25
- ```bash
26
- npm install zario
27
- ```
28
-
29
- ## Quick Start
30
-
31
- ```js
32
- import { Logger, ConsoleTransport } from "zario";
33
-
34
- const logger = new Logger({
35
- level: "info",
36
- colorize: true,
37
- transports: [new ConsoleTransport()],
38
- prefix: "[MyApp]",
39
- });
40
-
41
- // Start logging
42
- logger.info("🚀 Server started on port 3000");
43
- logger.warn("⚠️ High memory usage detected");
44
- logger.error("❌ Database connection failed", { code: 500 });
45
- ```
46
-
47
- ## API Documentation
48
-
49
- ### Logger Constructor Options
50
-
51
- | Option | Type | Description |
52
- | -------------- | -------- | ----------------------- |
53
- | **level** | `string` | Log level threshold |
54
- | **json** | `boolean`| Output in JSON format |
55
- | **timestamp** | `boolean`| Include timestamps |
56
- | **prefix** | `string` | Prepended label |
57
- | **transports** | `array` | Where logs are written (with transport-specific options like `path`, `maxSize`, `maxFiles`, `compression`, `batchInterval`, `compressOldFiles` for file transport) |
58
- | **customLevels** | `object` | Define custom log levels and their priorities |
59
- | **customColors** | `object` | Assign colors to custom log levels |
60
- | **filters** | `Filter[]` | Array of filters to apply before logging (LevelFilter, PrefixFilter, MetadataFilter, CompositeFilter, OrFilter, PredicateFilter) |
61
- | **aggregators** | `LogAggregator[]` | Array of log aggregators (BatchAggregator, TimeBasedAggregator, CompositeAggregator) |
62
- | **enrichers** | `LogEnrichmentPipeline` | Pipeline for structured logging extensions |
63
-
64
- ### Log Levels
65
-
66
- | Level | Method | Use Case |
67
- |----------|---------------|----------------------------|
68
- | 🔍 DEBUG | `logger.debug()` | Detailed debugging info |
69
- | ✨ INFO | `logger.info()` | General information |
70
- | ⚠️ WARN | `logger.warn()` | Warning messages |
71
- | ❌ ERROR | `logger.error()` | Error messages |
72
- | 🤫 SILENT | `logger.silent()`| Not output to console |
73
- | 📝 BORING | `logger.boring()`| Lowest priority messages |
74
-
75
- ### Transports
76
-
77
- #### Console Transport
78
-
79
- ```js
80
- import { Logger, ConsoleTransport } from "zario";
81
-
82
- const logger = new Logger({
83
- transports: [
84
- new ConsoleTransport({ colorize: true })
85
- ]
86
- });
87
- ```
88
-
89
- #### File Transport
90
-
91
- ```js
92
- import { Logger, FileTransport } from "zario";
93
-
94
- const logger = new Logger({
95
- transports: [
96
- new FileTransport({
97
- path: './logs/app.log',
98
- maxSize: 10485760, // 10MB in bytes
99
- maxFiles: 5,
100
- compression: 'gzip', // 'gzip', 'deflate', or 'none' (default: 'none')
101
- batchInterval: 1000, // Batch interval in ms (0 to disable, default: 0)
102
- compressOldFiles: true // Whether to compress old files during rotation (default: true)
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
+ [![npm version](https://img.shields.io/npm/v/zario?style=for-the-badge&logo=npm&color=CB3837)](https://www.npmjs.com/package/zario)
10
+ [![license](https://img.shields.io/npm/l/zario?style=for-the-badge&color=green)](./LICENSE)
11
+ [![downloads](https://img.shields.io/npm/dt/zario?style=for-the-badge&logo=npm&color=orange)](https://www.npmjs.com/package/zario)
12
+ [![bundle size](https://img.shields.io/bundlephobia/minzip/zario?style=for-the-badge&logo=webpack&color=purple)](https://bundlephobia.com/package/zario)
13
+ ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/Dev-Dami/zario?label=build)](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
+ ![separator](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/rainbow.png)
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 the timer if it's not already running
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 the case where flush returns a Promise (async flushCallback)
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 the timer if it exists
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 the aggregator and cancel any pending timer without flushing
105
+ //Stop aggregator and cancel any pending timer without flushing
98
106
  stop() {
99
107
  if (this.timer) {
100
108
  clearTimeout(this.timer);
@@ -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
- class Logger {
9
+ const events_1 = require("events");
10
+ class Logger extends events_1.EventEmitter {
9
11
  constructor(options = {}) {
10
- this.transports = [];
11
- this.filters = [];
12
- this.aggregators = [];
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(); // Set enrichers, default to new instance
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
- initializedTransports.push(transportConfig);
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
- logData = this.enrichers.process(logData);
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; } });