@wgtechlabs/log-engine 2.2.2 โ 2.3.0-dev.8fdf09c
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 +234 -37
- package/dist/cjs/formatter/emoji-data.cjs +87 -0
- package/dist/cjs/formatter/emoji-data.d.ts +18 -0
- package/dist/cjs/formatter/emoji-data.d.ts.map +1 -0
- package/dist/cjs/formatter/emoji-data.js.map +1 -0
- package/dist/cjs/formatter/emoji-selector.cjs +209 -0
- package/dist/cjs/formatter/emoji-selector.d.ts +74 -0
- package/dist/cjs/formatter/emoji-selector.d.ts.map +1 -0
- package/dist/cjs/formatter/emoji-selector.js.map +1 -0
- package/dist/cjs/formatter/index.cjs +6 -1
- package/dist/cjs/formatter/index.d.ts +2 -0
- package/dist/cjs/formatter/index.d.ts.map +1 -1
- package/dist/cjs/formatter/index.js.map +1 -1
- package/dist/cjs/formatter/message-formatter.cjs +24 -3
- package/dist/cjs/formatter/message-formatter.d.ts +3 -2
- package/dist/cjs/formatter/message-formatter.d.ts.map +1 -1
- package/dist/cjs/formatter/message-formatter.js.map +1 -1
- package/dist/cjs/index.cjs +36 -16
- package/dist/cjs/index.d.ts +29 -12
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/logger/core.cjs +43 -22
- package/dist/cjs/logger/core.d.ts +22 -11
- package/dist/cjs/logger/core.d.ts.map +1 -1
- package/dist/cjs/logger/core.js.map +1 -1
- package/dist/cjs/types/index.d.ts +59 -15
- package/dist/cjs/types/index.d.ts.map +1 -1
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/esm/formatter/emoji-data.d.ts +18 -0
- package/dist/esm/formatter/emoji-data.d.ts.map +1 -0
- package/dist/esm/formatter/emoji-data.js +84 -0
- package/dist/esm/formatter/emoji-data.js.map +1 -0
- package/dist/esm/formatter/emoji-selector.d.ts +74 -0
- package/dist/esm/formatter/emoji-selector.d.ts.map +1 -0
- package/dist/esm/formatter/emoji-selector.js +205 -0
- package/dist/esm/formatter/emoji-selector.js.map +1 -0
- package/dist/esm/formatter/index.d.ts +2 -0
- package/dist/esm/formatter/index.d.ts.map +1 -1
- package/dist/esm/formatter/index.js +2 -0
- package/dist/esm/formatter/index.js.map +1 -1
- package/dist/esm/formatter/message-formatter.d.ts +3 -2
- package/dist/esm/formatter/message-formatter.d.ts.map +1 -1
- package/dist/esm/formatter/message-formatter.js +24 -3
- package/dist/esm/formatter/message-formatter.js.map +1 -1
- package/dist/esm/index.d.ts +29 -12
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +32 -15
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/logger/core.d.ts +22 -11
- package/dist/esm/logger/core.d.ts.map +1 -1
- package/dist/esm/logger/core.js +44 -23
- package/dist/esm/logger/core.js.map +1 -1
- package/dist/esm/types/index.d.ts +59 -15
- package/dist/esm/types/index.d.ts.map +1 -1
- package/dist/esm/types/index.js.map +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -1,35 +1,27 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @wgtechlabs/log-engine
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
[](https://github.com/wgtechlabs/log-engine)
|
|
3
|
+

|
|
4
|
+
<!-- Created with GitHub Repo Banner by Waren Gonzaga: https://ghrb.waren.build -->
|
|
6
5
|
|
|
7
|
-
|
|
6
|
+
[](https://codecov.io/gh/wgtechlabs/log-engine) [](https://www.npmjs.com/package/@wgtechlabs/log-engine) [](https://github.com/sponsors/wgtechlabs) [](https://github.com/wgtechlabs/log-engine/releases) [](https://github.com/wgtechlabs/log-engine/stargazers) [](https://github.com/wgtechlabs/log-engine/blob/main/license)
|
|
8
7
|
|
|
9
|
-
|
|
8
|
+
Log Engine is a lightweight, zero-dependency logging library for Node.js, built because logging should protect sensitive data and just work, without complex configs or security afterthoughts. Through automatic environment detection, **built-in PII redaction**, **configurable output routing**, color-coded console output, and full TypeScript support, it delivers enterprise-grade logging for Discord bots, web servers, APIs, and any server-side application. Proven in production environments like the [Unthread Discord Bot](https://github.com/wgtechlabs/unthread-discord-bot/).
|
|
10
9
|
|
|
11
10
|
## โฃ๏ธ Motivation
|
|
12
11
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
Log Engine transforms your development experience from chaotic debugging sessions into confident, data-driven problem solving. No more guessing what went wrong, no more drowning in irrelevant logs, no more manual configuration headaches. Just clear, contextual information exactly when and where you need it. Because great applications deserve great logging, and great developers deserve tools that just work.
|
|
12
|
+
I created Log Engine after too many 2 AM debugging sessions, staring at terminals flooded with noise while hunting for the one error that matters. Every developer deserves clear, contextual logs that just work, no guessing, no configuration headaches, no drowning in irrelevant output. Great applications deserve great logging.
|
|
16
13
|
|
|
17
14
|
## โจ Key Features
|
|
18
15
|
|
|
19
|
-
- **๐ Advanced Data Redaction
|
|
20
|
-
- **๐ฏ Configurable Output Handlers
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
- **๐๏ธ Multiple Log Modes**: Support for DEBUG, INFO, WARN, ERROR, SILENT, OFF, and special LOG levels with smart filtering - just set your mode and let it handle the rest.
|
|
29
|
-
- **โ๏ธ Auto-Configuration**: Intelligent environment-based setup using NODE_ENV variables. No config files, initialization scripts, or manual setup - Log Engine works perfectly out of the box.
|
|
30
|
-
- **โจ Enhanced Formatting**: Structured log entries with dual timestamps (ISO + human-readable) and colored level indicators for maximum readability.
|
|
31
|
-
- **๐ Zero Dependencies**: No external dependencies for maximum compatibility and security - keeps your bundle clean and your project simple.
|
|
32
|
-
- **๐ Easy Integration**: Simple API that works seamlessly with existing Node.js applications. Just `import` and start logging - no middleware, plugins, or configuration required.
|
|
16
|
+
- **๐ Advanced Data Redaction** โ Built-in PII protection with custom regex patterns, dynamic field management, and environment-based configuration. Security-first logging by default.
|
|
17
|
+
- **๐ฏ Configurable Output Handlers** โ Route logs to any destination: files, HTTP endpoints, databases, or multiple outputs simultaneously.
|
|
18
|
+
- **๐จ Context-Aware Emoji** โ Intelligent emoji selection based on log content with 37 curated gitmoji mappings, fully customizable.
|
|
19
|
+
- **๐ Color-Coded Console Output** โ ANSI color-coded levels and timestamps for instant severity recognition.
|
|
20
|
+
- **๐๏ธ Multiple Log Modes** โ DEBUG, INFO, WARN, ERROR, SILENT, OFF, and a special always-visible LOG level.
|
|
21
|
+
- **โ๏ธ Auto-Configuration** โ Detects `NODE_ENV` and sets appropriate log levels automatically. No setup required.
|
|
22
|
+
- **๐ Full TypeScript Support** โ 15+ type definitions and interfaces for complete IDE support.
|
|
23
|
+
- **๐ Zero Dependencies** โ No external dependencies. Lightweight with automated bundle size monitoring under 1MB.
|
|
24
|
+
- **๐ Simple API** โ Just `import` and start logging. No middleware, plugins, or configuration files needed.
|
|
33
25
|
|
|
34
26
|
## โ ๏ธ Breaking Changes Notice
|
|
35
27
|
|
|
@@ -327,15 +319,15 @@ LogEngine.log('Critical message'); // โ Hidden with OFF - complete silence!
|
|
|
327
319
|
|
|
328
320
|
### Log Format
|
|
329
321
|
|
|
330
|
-
Log messages are
|
|
322
|
+
Log messages are formatted with colorized timestamps, levels, context-aware emoji, and smart terminal output:
|
|
331
323
|
|
|
332
324
|
```bash
|
|
333
325
|
# Example colorized output (colors visible in terminal)
|
|
334
|
-
[2025-05-29T16:57:45.678Z][4:57PM][DEBUG]: Debugging application flow
|
|
335
|
-
[2025-05-29T16:57:46.123Z][4:57PM][INFO]: Server started successfully
|
|
336
|
-
[2025-05-29T16:57:47.456Z][4:57PM][WARN]: API rate limit approaching
|
|
337
|
-
[2025-05-29T16:57:48.789Z][4:57PM][ERROR]: Database connection failed
|
|
338
|
-
[2025-05-29T16:57:49.012Z][4:57PM][LOG]: Application startup complete
|
|
326
|
+
[2025-05-29T16:57:45.678Z][4:57PM][DEBUG][๐]: Debugging application flow
|
|
327
|
+
[2025-05-29T16:57:46.123Z][4:57PM][INFO][๐]: Server started successfully
|
|
328
|
+
[2025-05-29T16:57:47.456Z][4:57PM][WARN][โก๏ธ]: API rate limit approaching
|
|
329
|
+
[2025-05-29T16:57:48.789Z][4:57PM][ERROR][๐๏ธ]: Database connection failed
|
|
330
|
+
[2025-05-29T16:57:49.012Z][4:57PM][LOG][โ
]: Application startup complete
|
|
339
331
|
```
|
|
340
332
|
|
|
341
333
|
**Color Scheme:**
|
|
@@ -346,6 +338,7 @@ Log messages are beautifully formatted with colorized timestamps, levels, and sm
|
|
|
346
338
|
- ๐ด **ERROR**: Red - Error messages requiring immediate action
|
|
347
339
|
- ๐ข **LOG**: Green - Critical messages that always display
|
|
348
340
|
- โซ **Timestamps**: Gray (ISO) and Cyan (local time) for easy scanning
|
|
341
|
+
- ๐จ **Emoji**: Context-aware emoji selected based on log content (can be disabled via `includeEmoji: false`)
|
|
349
342
|
|
|
350
343
|
### Customizing Log Elements
|
|
351
344
|
|
|
@@ -353,10 +346,11 @@ Log messages are beautifully formatted with colorized timestamps, levels, and sm
|
|
|
353
346
|
|
|
354
347
|
#### Available Customization Options
|
|
355
348
|
|
|
356
|
-
You can control the inclusion of
|
|
349
|
+
You can control the inclusion of these elements:
|
|
357
350
|
|
|
358
351
|
- **ISO Timestamp**: `[2025-05-29T16:57:45.678Z]` - Precise UTC timestamp
|
|
359
352
|
- **Local Time**: `[4:57PM]` - Human-readable local time
|
|
353
|
+
- **Emoji**: `[๐]` - Context-aware emoji indicator (enabled by default)
|
|
360
354
|
- **Log Level**: `[INFO]` - Always included (non-customizable as per design)
|
|
361
355
|
|
|
362
356
|
#### Format Configuration Examples
|
|
@@ -364,10 +358,10 @@ You can control the inclusion of timestamp elements:
|
|
|
364
358
|
```typescript
|
|
365
359
|
import { LogEngine, LogMode } from '@wgtechlabs/log-engine';
|
|
366
360
|
|
|
367
|
-
// Default format (backward compatible)
|
|
361
|
+
// Default format (backward compatible - emoji enabled by default)
|
|
368
362
|
LogEngine.configure({ mode: LogMode.DEBUG });
|
|
369
363
|
LogEngine.info('Server started');
|
|
370
|
-
// Output: [2025-05-29T16:57:45.678Z][4:57PM][INFO]: Server started
|
|
364
|
+
// Output: [2025-05-29T16:57:45.678Z][4:57PM][INFO][๐]: Server started
|
|
371
365
|
|
|
372
366
|
// Only ISO timestamp
|
|
373
367
|
LogEngine.configure({
|
|
@@ -378,7 +372,7 @@ LogEngine.configure({
|
|
|
378
372
|
}
|
|
379
373
|
});
|
|
380
374
|
LogEngine.info('Database connected');
|
|
381
|
-
// Output: [2025-05-29T16:57:45.678Z][INFO]: Database connected
|
|
375
|
+
// Output: [2025-05-29T16:57:45.678Z][INFO][๐๏ธ]: Database connected
|
|
382
376
|
|
|
383
377
|
// Only local time
|
|
384
378
|
LogEngine.configure({
|
|
@@ -389,14 +383,15 @@ LogEngine.configure({
|
|
|
389
383
|
}
|
|
390
384
|
});
|
|
391
385
|
LogEngine.warn('Rate limit approaching');
|
|
392
|
-
// Output: [4:57PM][WARN]: Rate limit approaching
|
|
386
|
+
// Output: [4:57PM][WARN][โก๏ธ]: Rate limit approaching
|
|
393
387
|
|
|
394
|
-
// Minimal format (no timestamps)
|
|
388
|
+
// Minimal format (no timestamps, no emoji)
|
|
395
389
|
LogEngine.configure({
|
|
396
390
|
mode: LogMode.DEBUG,
|
|
397
391
|
format: {
|
|
398
392
|
includeIsoTimestamp: false,
|
|
399
|
-
includeLocalTime: false
|
|
393
|
+
includeLocalTime: false,
|
|
394
|
+
includeEmoji: false
|
|
400
395
|
}
|
|
401
396
|
});
|
|
402
397
|
LogEngine.error('Connection failed');
|
|
@@ -413,6 +408,207 @@ LogEngine.error('Connection failed');
|
|
|
413
408
|
|
|
414
409
|
**Note**: Log levels (`[DEBUG]`, `[INFO]`, `[WARN]`, `[ERROR]`, `[LOG]`) are always included regardless of configuration to maintain log clarity and filtering capabilities.
|
|
415
410
|
|
|
411
|
+
## ๐จ Context-Aware Emoji Support
|
|
412
|
+
|
|
413
|
+
**LogEngine features intelligent emoji support that enhances log readability by adding visual context to each log message.** The emoji engine analyzes your log content (level + message + data) and automatically selects the most relevant emoji, making it easier to visually parse large logs and instantly identify the type of each log line.
|
|
414
|
+
|
|
415
|
+
### Features
|
|
416
|
+
|
|
417
|
+
- **๐ฏ Context-Aware Selection**: Automatically analyzes message content and data to select appropriate emoji
|
|
418
|
+
- **๐ฆ Rich Emoji Set**: Based on [gitmoji](https://gitmoji.dev) with 40+ curated emoji mappings
|
|
419
|
+
- **๐ Smart Fallback**: Uses level-specific emoji when no context match is found
|
|
420
|
+
- **๐ ๏ธ Fully Customizable**: Extend or override emoji mappings and fallback behavior
|
|
421
|
+
- **โ
Enabled by Default**: Emoji are automatically included in logs (can be disabled via `includeEmoji: false`)
|
|
422
|
+
|
|
423
|
+
### Quick Start
|
|
424
|
+
|
|
425
|
+
```typescript
|
|
426
|
+
import { LogEngine } from '@wgtechlabs/log-engine';
|
|
427
|
+
|
|
428
|
+
// Emoji are enabled by default - just start logging!
|
|
429
|
+
LogEngine.error('Database connection failed');
|
|
430
|
+
// Output: [2026-02-11T14:00:00.000Z][2:00PM][ERROR][๐๏ธ]: Database connection failed
|
|
431
|
+
|
|
432
|
+
LogEngine.info('Deployed to production successfully');
|
|
433
|
+
// Output: [2026-02-11T14:00:01.000Z][2:00PM][INFO][๐]: Deployed to production successfully
|
|
434
|
+
|
|
435
|
+
LogEngine.warn('Performance degradation detected');
|
|
436
|
+
// Output: [2026-02-11T14:00:02.000Z][2:00PM][WARN][โก๏ธ]: Performance degradation detected
|
|
437
|
+
|
|
438
|
+
LogEngine.info('Unknown event happened');
|
|
439
|
+
// Output: [2026-02-11T14:00:03.000Z][2:00PM][INFO][โน๏ธ]: Unknown event happened (fallback)
|
|
440
|
+
|
|
441
|
+
// Disable emoji if needed
|
|
442
|
+
LogEngine.configure({
|
|
443
|
+
format: {
|
|
444
|
+
includeEmoji: false
|
|
445
|
+
}
|
|
446
|
+
});
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
### Context-Aware Emoji Mappings
|
|
450
|
+
|
|
451
|
+
LogEngine intelligently matches keywords in your log messages to select appropriate emoji:
|
|
452
|
+
|
|
453
|
+
| Context | Keywords | Emoji | Example |
|
|
454
|
+
|---------|----------|-------|---------|
|
|
455
|
+
| **Database** | database, db, sql, query, mongo, postgres | ๐๏ธ | "Database query failed" |
|
|
456
|
+
| **Deployment** | deploy, release, launched, production | ๐ | "Deployed to production" |
|
|
457
|
+
| **Performance** | performance, speed, optimize, latency | โก๏ธ | "Performance issues detected" |
|
|
458
|
+
| **Security** | security, vulnerability, auth, permission | ๐๏ธ | "Security breach detected" |
|
|
459
|
+
| **Critical** | critical, urgent, emergency, crash | ๐๏ธ | "Critical system failure" |
|
|
460
|
+
| **Bugs** | bug, fix, defect, issue | ๐ | "Fixed bug in login" |
|
|
461
|
+
| **Network** | network, http, api, endpoint | ๐ | "API request failed" |
|
|
462
|
+
| **Testing** | tests, testing, validation | โ
| "All tests passed" |
|
|
463
|
+
|
|
464
|
+
### Fallback Emoji by Level
|
|
465
|
+
|
|
466
|
+
When no context-specific emoji matches, LogEngine uses these fallback emoji:
|
|
467
|
+
|
|
468
|
+
| Log Level | Emoji | Description |
|
|
469
|
+
|-----------|-------|-------------|
|
|
470
|
+
| `DEBUG` | ๐ | Debugging information |
|
|
471
|
+
| `INFO` | โน๏ธ | General information |
|
|
472
|
+
| `WARN` | โ ๏ธ | Warning messages |
|
|
473
|
+
| `ERROR` | โ | Error messages |
|
|
474
|
+
| `LOG` | โ
| Critical log messages |
|
|
475
|
+
|
|
476
|
+
### Custom Emoji Configuration
|
|
477
|
+
|
|
478
|
+
#### Custom Context Mappings
|
|
479
|
+
|
|
480
|
+
Add your own emoji mappings for custom contexts:
|
|
481
|
+
|
|
482
|
+
```typescript
|
|
483
|
+
LogEngine.configure({
|
|
484
|
+
format: {
|
|
485
|
+
emoji: {
|
|
486
|
+
customMappings: [
|
|
487
|
+
{
|
|
488
|
+
emoji: '๐ฏ',
|
|
489
|
+
code: ':dart:',
|
|
490
|
+
description: 'Goal achieved',
|
|
491
|
+
keywords: ['goal', 'target', 'achieved', 'milestone']
|
|
492
|
+
},
|
|
493
|
+
{
|
|
494
|
+
emoji: '๐ฐ',
|
|
495
|
+
code: ':moneybag:',
|
|
496
|
+
description: 'Payment operations',
|
|
497
|
+
keywords: ['payment', 'transaction', 'billing', 'invoice']
|
|
498
|
+
}
|
|
499
|
+
]
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
});
|
|
503
|
+
|
|
504
|
+
LogEngine.info('Payment processed successfully');
|
|
505
|
+
// Output: [INFO][๐ฐ]: Payment processed successfully
|
|
506
|
+
|
|
507
|
+
LogEngine.info('Sales target achieved');
|
|
508
|
+
// Output: [INFO][๐ฏ]: Sales target achieved
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
#### Custom Fallback Emoji
|
|
512
|
+
|
|
513
|
+
Override the default fallback emoji for each log level:
|
|
514
|
+
|
|
515
|
+
```typescript
|
|
516
|
+
LogEngine.configure({
|
|
517
|
+
format: {
|
|
518
|
+
emoji: {
|
|
519
|
+
customFallbacks: {
|
|
520
|
+
DEBUG: '๐',
|
|
521
|
+
INFO: '๐ข',
|
|
522
|
+
WARN: '๐จ',
|
|
523
|
+
ERROR: '๐',
|
|
524
|
+
LOG: '๐'
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
});
|
|
529
|
+
|
|
530
|
+
LogEngine.info('Generic info message');
|
|
531
|
+
// Output: [INFO][๐ข]: Generic info message
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
#### Use Custom Mappings Exclusively
|
|
535
|
+
|
|
536
|
+
Use only your custom mappings and ignore the built-in set:
|
|
537
|
+
|
|
538
|
+
```typescript
|
|
539
|
+
LogEngine.configure({
|
|
540
|
+
format: {
|
|
541
|
+
emoji: {
|
|
542
|
+
useCustomOnly: true,
|
|
543
|
+
customMappings: [
|
|
544
|
+
// Your custom mappings only
|
|
545
|
+
]
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
});
|
|
549
|
+
```
|
|
550
|
+
|
|
551
|
+
### Data Context Analysis
|
|
552
|
+
|
|
553
|
+
The emoji selector also analyzes data objects for context:
|
|
554
|
+
|
|
555
|
+
```typescript
|
|
556
|
+
LogEngine.info('Operation completed', {
|
|
557
|
+
database: 'postgres',
|
|
558
|
+
table: 'users',
|
|
559
|
+
rows: 1000
|
|
560
|
+
});
|
|
561
|
+
// Output: [INFO][๐๏ธ]: Operation completed { database: 'postgres', ... }
|
|
562
|
+
|
|
563
|
+
LogEngine.warn('Issue detected', {
|
|
564
|
+
performance: 'degraded',
|
|
565
|
+
latency: '500ms'
|
|
566
|
+
});
|
|
567
|
+
// Output: [WARN][โก๏ธ]: Issue detected { performance: 'degraded', ... }
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
### Programmatic Access
|
|
571
|
+
|
|
572
|
+
Access emoji utilities directly for advanced use cases:
|
|
573
|
+
|
|
574
|
+
```typescript
|
|
575
|
+
import { EmojiSelector, EMOJI_MAPPINGS, FALLBACK_EMOJI } from '@wgtechlabs/log-engine';
|
|
576
|
+
|
|
577
|
+
// Check all available emoji mappings
|
|
578
|
+
console.log(EMOJI_MAPPINGS);
|
|
579
|
+
// [{ emoji: '๐', code: ':bug:', description: 'Fix a bug', keywords: [...] }, ...]
|
|
580
|
+
|
|
581
|
+
// Check fallback emoji
|
|
582
|
+
console.log(FALLBACK_EMOJI);
|
|
583
|
+
// { DEBUG: '๐', INFO: 'โน๏ธ', WARN: 'โ ๏ธ', ERROR: 'โ', LOG: 'โ
' }
|
|
584
|
+
|
|
585
|
+
// Configure emoji selector directly (for customization)
|
|
586
|
+
EmojiSelector.configure({
|
|
587
|
+
customMappings: [...]
|
|
588
|
+
});
|
|
589
|
+
```
|
|
590
|
+
|
|
591
|
+
### Output Format
|
|
592
|
+
|
|
593
|
+
With emoji (enabled by default), the log format is:
|
|
594
|
+
|
|
595
|
+
```text
|
|
596
|
+
[ISO_TIMESTAMP][LOCAL_TIME][LEVEL][EMOJI]: message [data]
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
Example:
|
|
600
|
+
```text
|
|
601
|
+
[2026-02-11T14:00:00.000Z][2:00PM][ERROR][๐๏ธ]: Database connection failed
|
|
602
|
+
```
|
|
603
|
+
|
|
604
|
+
### Benefits
|
|
605
|
+
|
|
606
|
+
- **๐๏ธ Visual Clarity**: Instantly identify log context at a glance
|
|
607
|
+
- **๐ฏ Better Debugging**: Quickly locate specific types of logs in large outputs
|
|
608
|
+
- **๐จ Enhanced UX**: More engaging and pleasant logging experience
|
|
609
|
+
- **๐ง Flexible**: Fully customizable to match your project's needs
|
|
610
|
+
- **๐ Compatibility Note**: Enabled by default โ existing log output will include emojis; disable or customize emoji behavior via configuration to preserve prior formats
|
|
611
|
+
|
|
416
612
|
## ๐ Advanced Data Redaction
|
|
417
613
|
|
|
418
614
|
**LogEngine features comprehensive built-in PII protection with advanced customization capabilities that automatically redacts sensitive information from your logs.** This security-first approach prevents accidental exposure of passwords, tokens, emails, and other sensitive data while maintaining full debugging capabilities with enterprise-grade flexibility.
|
|
@@ -901,7 +1097,8 @@ Contributions are welcome, create a pull request to this repo and I will review
|
|
|
901
1097
|
- `pnpm lint:security` - Run security-focused linting
|
|
902
1098
|
- `pnpm secure` - Run comprehensive security checks
|
|
903
1099
|
- `pnpm build` - Build the TypeScript project
|
|
904
|
-
- `pnpm
|
|
1100
|
+
- `pnpm size:check` - Check bundle size to maintain lightweight feature
|
|
1101
|
+
- `pnpm validate` - Run full validation (lint + test + build + size check)
|
|
905
1102
|
|
|
906
1103
|
Read the project's [contributing guide](./CONTRIBUTING.md) for detailed development setup, testing guidelines, and contribution requirements.
|
|
907
1104
|
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Emoji data for context-aware logging
|
|
4
|
+
* Based on gitmoji.dev emoji set
|
|
5
|
+
* Each entry maps emoji to keywords that help identify when to use it
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.FALLBACK_EMOJI = exports.EMOJI_MAPPINGS = void 0;
|
|
9
|
+
/**
|
|
10
|
+
* Curated emoji mappings for context-aware logging
|
|
11
|
+
* Based on the gitmoji set from https://gitmoji.dev
|
|
12
|
+
* Ordered by specificity - more specific keywords first
|
|
13
|
+
*/
|
|
14
|
+
exports.EMOJI_MAPPINGS = [
|
|
15
|
+
// More specific contexts first
|
|
16
|
+
// Database (specific)
|
|
17
|
+
{ emoji: '๐๏ธ', code: ':card_file_box:', description: 'Database related', keywords: ['database', 'db', 'sql', 'query', 'table', 'schema', 'migration', 'mongo', 'postgres', 'mysql'] },
|
|
18
|
+
// Deployment and releases (specific)
|
|
19
|
+
{ emoji: '๐', code: ':rocket:', description: 'Deploy or release', keywords: ['deploy', 'deployed', 'deployment', 'release', 'launched', 'production'] },
|
|
20
|
+
// Performance (specific)
|
|
21
|
+
{ emoji: 'โก๏ธ', code: ':zap:', description: 'Improve performance', keywords: ['performance', 'speed', 'optimize', 'fast', 'slow', 'latency', 'throughput'] },
|
|
22
|
+
// Security (specific)
|
|
23
|
+
{ emoji: '๐๏ธ', code: ':lock:', description: 'Fix security issues', keywords: ['security', 'secure', 'vulnerability', 'exploit', 'auth', 'authentication', 'authorization', 'permission'] },
|
|
24
|
+
// Critical issues (specific)
|
|
25
|
+
{ emoji: '๐๏ธ', code: ':ambulance:', description: 'Critical hotfix', keywords: ['critical', 'hotfix', 'urgent', 'emergency', 'crash', 'fatal'] },
|
|
26
|
+
// Bugs and fixes (specific)
|
|
27
|
+
{ emoji: '๐', code: ':bug:', description: 'Fix a bug', keywords: ['bug', 'fix', 'fixed', 'fixing', 'defect', 'issue'] },
|
|
28
|
+
// Less specific/generic contexts last
|
|
29
|
+
// Errors and failures (generic)
|
|
30
|
+
{ emoji: 'โ', code: ':x:', description: 'Error or failure', keywords: ['error', 'fail', 'failed', 'failure', 'exception', 'reject'] },
|
|
31
|
+
{ emoji: '๐ฅ', code: ':fire:', description: 'Remove code or files', keywords: ['remove', 'delete', 'deprecated', 'obsolete'] },
|
|
32
|
+
{ emoji: '๐', code: ':snail:', description: 'Slow performance', keywords: ['timeout', 'hang', 'freeze'] },
|
|
33
|
+
{ emoji: '๐๏ธ', code: ':unlock:', description: 'Unlock or access', keywords: ['unlock', 'access', 'grant', 'allow'] },
|
|
34
|
+
{ emoji: '๐พ', code: ':floppy_disk:', description: 'Save or persist data', keywords: ['save', 'saved', 'saving', 'persist', 'write', 'store'] },
|
|
35
|
+
{ emoji: '๐', code: ':tada:', description: 'Initial commit or milestone', keywords: ['initial', 'milestone', 'celebrate', 'success', 'complete'] },
|
|
36
|
+
// Configuration
|
|
37
|
+
{ emoji: '๐ง', code: ':wrench:', description: 'Configuration changes', keywords: ['config', 'configuration', 'setting', 'settings', 'configure'] },
|
|
38
|
+
{ emoji: 'โ๏ธ', code: ':gear:', description: 'Configuration or settings', keywords: ['setup', 'init', 'initialize'] },
|
|
39
|
+
// API and network
|
|
40
|
+
{ emoji: '๐', code: ':globe_with_meridians:', description: 'Network or internet', keywords: ['network', 'internet', 'http', 'https', 'request', 'response', 'api', 'endpoint'] },
|
|
41
|
+
{ emoji: '๐', code: ':electric_plug:', description: 'Connection or plugin', keywords: ['connect', 'connection', 'disconnect', 'plugin', 'integration'] },
|
|
42
|
+
// Testing
|
|
43
|
+
{ emoji: 'โ
', code: ':white_check_mark:', description: 'Tests passing', keywords: ['tests', 'testing', 'pass', 'passed', 'validation', 'validate'] },
|
|
44
|
+
{ emoji: '๐งช', code: ':test_tube:', description: 'Running tests', keywords: ['experiment', 'trial', 'spec'] },
|
|
45
|
+
// Documentation
|
|
46
|
+
{ emoji: '๐', code: ':memo:', description: 'Add or update documentation', keywords: ['document', 'documentation', 'docs', 'readme', 'comment'] },
|
|
47
|
+
{ emoji: '๐ก', code: ':bulb:', description: 'New idea or insight', keywords: ['idea', 'insight', 'suggestion', 'tip', 'hint'] },
|
|
48
|
+
// Dependencies
|
|
49
|
+
{ emoji: 'โ', code: ':heavy_plus_sign:', description: 'Add dependency', keywords: ['add', 'added', 'adding', 'install', 'dependency', 'package'] },
|
|
50
|
+
{ emoji: 'โ', code: ':heavy_minus_sign:', description: 'Remove dependency', keywords: ['uninstall', 'removed'] },
|
|
51
|
+
{ emoji: 'โฌ๏ธ', code: ':arrow_up:', description: 'Upgrade dependencies', keywords: ['upgrade', 'update', 'updated'] },
|
|
52
|
+
{ emoji: 'โฌ๏ธ', code: ':arrow_down:', description: 'Downgrade dependencies', keywords: ['downgrade', 'rollback'] },
|
|
53
|
+
// Files and structure
|
|
54
|
+
{ emoji: '๐ฆ', code: ':package:', description: 'Update compiled files', keywords: ['package', 'build', 'compile', 'bundle'] },
|
|
55
|
+
{ emoji: '๐', code: ':truck:', description: 'Move or rename files', keywords: ['move', 'moved', 'rename', 'renamed', 'relocate'] },
|
|
56
|
+
// Work in progress
|
|
57
|
+
{ emoji: '๐ง', code: ':construction:', description: 'Work in progress', keywords: ['wip', 'progress', 'working', 'ongoing', 'incomplete'] },
|
|
58
|
+
// Breaking changes
|
|
59
|
+
{ emoji: '๐ฅ', code: ':boom:', description: 'Breaking changes', keywords: ['breaking', 'break', 'incompatible'] },
|
|
60
|
+
// Accessibility
|
|
61
|
+
{ emoji: 'โฟ๏ธ', code: ':wheelchair:', description: 'Improve accessibility', keywords: ['accessibility', 'a11y', 'accessible'] },
|
|
62
|
+
// Internationalization
|
|
63
|
+
{ emoji: '๐', code: ':earth_africa:', description: 'Internationalization', keywords: ['i18n', 'localization', 'l10n', 'translation', 'language'] },
|
|
64
|
+
// UI and styling
|
|
65
|
+
{ emoji: '๐', code: ':lipstick:', description: 'Update UI and style', keywords: ['ui', 'style', 'css', 'design', 'interface', 'layout'] },
|
|
66
|
+
{ emoji: '๐จ', code: ':art:', description: 'Improve structure', keywords: ['refactor', 'refactoring', 'restructure', 'format'] },
|
|
67
|
+
// Logging and monitoring
|
|
68
|
+
{ emoji: '๐', code: ':loud_sound:', description: 'Add or update logs', keywords: ['logging', 'trace'] },
|
|
69
|
+
{ emoji: '๐', code: ':mute:', description: 'Remove logs', keywords: ['silent', 'quiet', 'mute'] },
|
|
70
|
+
{ emoji: '๐', code: ':bar_chart:', description: 'Analytics or metrics', keywords: ['analytics', 'metrics', 'stats', 'statistics', 'monitor', 'monitoring'] },
|
|
71
|
+
// Code review
|
|
72
|
+
{ emoji: '๐', code: ':ok_hand:', description: 'Code review changes', keywords: ['review', 'approve', 'approved', 'lgtm'] },
|
|
73
|
+
// Catch-all for new features (put last)
|
|
74
|
+
{ emoji: 'โจ', code: ':sparkles:', description: 'New feature', keywords: ['feature', 'new', 'enhancement', 'improve', 'improved'] },
|
|
75
|
+
];
|
|
76
|
+
/**
|
|
77
|
+
* Default fallback emoji for each log level
|
|
78
|
+
* These are used when no context-specific emoji matches
|
|
79
|
+
*/
|
|
80
|
+
exports.FALLBACK_EMOJI = {
|
|
81
|
+
DEBUG: '๐',
|
|
82
|
+
INFO: 'โน๏ธ',
|
|
83
|
+
WARN: 'โ ๏ธ',
|
|
84
|
+
ERROR: 'โ',
|
|
85
|
+
LOG: 'โ
'
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=emoji-data.js.map
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Emoji data for context-aware logging
|
|
3
|
+
* Based on gitmoji.dev emoji set
|
|
4
|
+
* Each entry maps emoji to keywords that help identify when to use it
|
|
5
|
+
*/
|
|
6
|
+
import { EmojiMapping } from '../types';
|
|
7
|
+
/**
|
|
8
|
+
* Curated emoji mappings for context-aware logging
|
|
9
|
+
* Based on the gitmoji set from https://gitmoji.dev
|
|
10
|
+
* Ordered by specificity - more specific keywords first
|
|
11
|
+
*/
|
|
12
|
+
export declare const EMOJI_MAPPINGS: EmojiMapping[];
|
|
13
|
+
/**
|
|
14
|
+
* Default fallback emoji for each log level
|
|
15
|
+
* These are used when no context-specific emoji matches
|
|
16
|
+
*/
|
|
17
|
+
export declare const FALLBACK_EMOJI: Record<'DEBUG' | 'INFO' | 'WARN' | 'ERROR' | 'LOG', string>;
|
|
18
|
+
//# sourceMappingURL=emoji-data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emoji-data.d.ts","sourceRoot":"","sources":["../../../src/formatter/emoji-data.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,YAAY,EAsFxC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,EAAE,MAAM,CAMtF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emoji-data.js","sourceRoot":"","sources":["../../../src/formatter/emoji-data.ts"],"names":[],"mappings":"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"}
|