@quatrain/log 1.1.6 → 1.1.8
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 +26 -10
- package/dist/AbstractLoggerAdapter.d.ts +2 -1
- package/dist/AbstractLoggerAdapter.d.ts.map +1 -1
- package/dist/AbstractLoggerAdapter.js +6 -2
- package/dist/AbstractLoggerAdapter.js.map +1 -1
- package/dist/DefaultLoggerAdapter.d.ts.map +1 -1
- package/dist/DefaultLoggerAdapter.js +14 -2
- package/dist/DefaultLoggerAdapter.js.map +1 -1
- package/package.json +1 -1
- package/src/AbstractLoggerAdapter.ts +12 -2
- package/src/DefaultLoggerAdapter.test.ts +8 -3
- package/src/DefaultLoggerAdapter.ts +16 -2
package/README.md
CHANGED
|
@@ -1,26 +1,42 @@
|
|
|
1
1
|
# @quatrain/log
|
|
2
2
|
|
|
3
|
-
A
|
|
3
|
+
A centralized logging system for Quatrain applications, providing flexible log levels, adapter-based outputs, and structured logging capabilities.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Introduction
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
The `@quatrain/log` package acts as the unified logging interface for all components within the Quatrain ecosystem. Rather than scattering `console.log` statements throughout your code, this package offers a structured approach to debugging, warning, and tracing errors, with the ability to route logs to different destinations via custom adapters.
|
|
8
|
+
|
|
9
|
+
## Key Concepts
|
|
10
|
+
|
|
11
|
+
- **`Log`**: The static registry and main interface for logging messages.
|
|
12
|
+
- **`LogLevel`**: Enum defining severity (`TRACE`, `DEBUG`, `INFO`, `WARN`, `ERROR`, `SILENT`).
|
|
13
|
+
- **`AbstractLoggerAdapter`**: The base class for creating custom log outputs.
|
|
14
|
+
- **`DefaultLoggerAdapter`**: The built-in adapter that outputs colorized logs to the console using `chalk`.
|
|
11
15
|
|
|
12
16
|
## Installation
|
|
13
17
|
|
|
14
18
|
```bash
|
|
15
19
|
npm install @quatrain/log
|
|
20
|
+
# or
|
|
21
|
+
yarn add @quatrain/log
|
|
22
|
+
# or
|
|
23
|
+
bun add @quatrain/log
|
|
16
24
|
```
|
|
17
25
|
|
|
18
|
-
##
|
|
26
|
+
## Configuration
|
|
27
|
+
|
|
28
|
+
By default, `@quatrain/log` initializes a `DefaultLoggerAdapter` with the `INFO` level.
|
|
29
|
+
No configuration is required for basic usage.
|
|
30
|
+
|
|
31
|
+
If you need to change the log level globally or register custom loggers, you can do so early in your application lifecycle:
|
|
19
32
|
|
|
20
33
|
```typescript
|
|
21
34
|
import { Log, LogLevel } from '@quatrain/log'
|
|
22
|
-
import { ConsoleLoggerAdapter } from '@quatrain/log' // Example adapter
|
|
23
35
|
|
|
24
|
-
|
|
25
|
-
|
|
36
|
+
// Set the default logger level to DEBUG
|
|
37
|
+
Log.getLogger().setLevel(LogLevel.DEBUG)
|
|
26
38
|
```
|
|
39
|
+
|
|
40
|
+
## License
|
|
41
|
+
|
|
42
|
+
AGPL-3.0-only
|
|
@@ -21,7 +21,8 @@ export declare abstract class AbstractLoggerAdapter implements LoggerType {
|
|
|
21
21
|
protected _logger: any;
|
|
22
22
|
constructor(prefix?: string, level?: LogLevel);
|
|
23
23
|
logLevel(level: LogLevel): void;
|
|
24
|
-
|
|
24
|
+
clone(suffix: string): this;
|
|
25
|
+
formatLogMessage: (messages: any[], loglevel?: LogLevel, tag?: string) => string;
|
|
25
26
|
log(...messages: any[]): void;
|
|
26
27
|
debug(...messages: any[]): void;
|
|
27
28
|
warn(...messages: any[]): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractLoggerAdapter.d.ts","sourceRoot":"","sources":["../src/AbstractLoggerAdapter.ts"],"names":[],"mappings":"AAAA,oBAAY,QAAQ;IACjB,KAAK,IAAI;IACT,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;IACT,MAAM,IAAI;CACZ;AAED,MAAM,WAAW,UAAU;IACxB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAC9B;AAED,eAAO,MAAM,aAAa,UAOzB,CAAA;AAED,8BAAsB,qBAAsB,YAAW,UAAU;IAC9D,SAAS,CAAC,GAAG,EAAE,MAAM,CAAK;IAC1B,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAgB;IAC7C,SAAS,CAAC,OAAO,EAAE,GAAG,CAAY;gBAEtB,MAAM,SAAK,EAAE,KAAK,GAAE,QAAwB;IAIxD,QAAQ,CAAC,KAAK,EAAE,QAAQ;
|
|
1
|
+
{"version":3,"file":"AbstractLoggerAdapter.d.ts","sourceRoot":"","sources":["../src/AbstractLoggerAdapter.ts"],"names":[],"mappings":"AAAA,oBAAY,QAAQ;IACjB,KAAK,IAAI;IACT,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;IACT,MAAM,IAAI;CACZ;AAED,MAAM,WAAW,UAAU;IACxB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAC9B;AAED,eAAO,MAAM,aAAa,UAOzB,CAAA;AAED,8BAAsB,qBAAsB,YAAW,UAAU;IAC9D,SAAS,CAAC,GAAG,EAAE,MAAM,CAAK;IAC1B,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAgB;IAC7C,SAAS,CAAC,OAAO,EAAE,GAAG,CAAY;gBAEtB,MAAM,SAAK,EAAE,KAAK,GAAE,QAAwB;IAIxD,QAAQ,CAAC,KAAK,EAAE,QAAQ;IAQxB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK3B,gBAAgB,aACH,GAAG,EAAE,aACL,QAAQ,QACb,MAAM,KACX,MAAM,CAgBR;IAOD,GAAG,CAAC,GAAG,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI;IAI7B,KAAK,CAAC,GAAG,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI;IAI/B,IAAI,CAAC,GAAG,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI;IAI9B,IAAI,CAAC,GAAG,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI;IAI9B,KAAK,CAAC,GAAG,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI;IAI/B,KAAK,CAAC,GAAG,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI;CAGjC"}
|
|
@@ -28,9 +28,13 @@ class AbstractLoggerAdapter {
|
|
|
28
28
|
logLevel(level) {
|
|
29
29
|
this._logLevel = level;
|
|
30
30
|
}
|
|
31
|
-
|
|
31
|
+
clone(suffix) {
|
|
32
|
+
const newPrefix = this._me ? `${this._me}][${suffix}` : suffix;
|
|
33
|
+
return new this.constructor(newPrefix, this._logLevel);
|
|
34
|
+
}
|
|
35
|
+
formatLogMessage = (messages, loglevel = LogLevel.INFO, tag = '') => {
|
|
32
36
|
const flatMessages = messages.flat();
|
|
33
|
-
const prefix = `${new Date().toISOString()} - [${this._me}]`;
|
|
37
|
+
const prefix = `${new Date().toISOString()}${tag} - [${this._me}]`;
|
|
34
38
|
const strs = flatMessages.map((message) => {
|
|
35
39
|
if (message instanceof Error) {
|
|
36
40
|
return message.stack || message.message;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractLoggerAdapter.js","sourceRoot":"","sources":["../src/AbstractLoggerAdapter.ts"],"names":[],"mappings":";;;AAAA,IAAY,QAOX;AAPD,WAAY,QAAQ;IACjB,yCAAS,CAAA;IACT,yCAAS,CAAA;IACT,uCAAQ,CAAA;IACR,uCAAQ,CAAA;IACR,yCAAS,CAAA;IACT,2CAAU,CAAA;AACb,CAAC,EAPW,QAAQ,wBAAR,QAAQ,QAOnB;AAWY,QAAA,aAAa,GAAG;IAC1B,OAAO;IACP,OAAO;IACP,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;CACV,CAAA;AAED,MAAsB,qBAAqB;IAC9B,GAAG,GAAW,EAAE,CAAA;IAChB,SAAS,GAAa,QAAQ,CAAC,IAAI,CAAA;IACnC,OAAO,GAAQ,SAAS,CAAA;IAElC,YAAY,MAAM,GAAG,EAAE,EAAE,QAAkB,QAAQ,CAAC,IAAI;QACrD,IAAI,CAAC,GAAG,GAAG,MAAM,CAAA;IACpB,CAAC;IAED,QAAQ,CAAC,KAAe;QACrB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;IACzB,CAAC;IAED,gBAAgB,GAAG,CAChB,QAAe,EACf,WAAqB,QAAQ,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"AbstractLoggerAdapter.js","sourceRoot":"","sources":["../src/AbstractLoggerAdapter.ts"],"names":[],"mappings":";;;AAAA,IAAY,QAOX;AAPD,WAAY,QAAQ;IACjB,yCAAS,CAAA;IACT,yCAAS,CAAA;IACT,uCAAQ,CAAA;IACR,uCAAQ,CAAA;IACR,yCAAS,CAAA;IACT,2CAAU,CAAA;AACb,CAAC,EAPW,QAAQ,wBAAR,QAAQ,QAOnB;AAWY,QAAA,aAAa,GAAG;IAC1B,OAAO;IACP,OAAO;IACP,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;CACV,CAAA;AAED,MAAsB,qBAAqB;IAC9B,GAAG,GAAW,EAAE,CAAA;IAChB,SAAS,GAAa,QAAQ,CAAC,IAAI,CAAA;IACnC,OAAO,GAAQ,SAAS,CAAA;IAElC,YAAY,MAAM,GAAG,EAAE,EAAE,QAAkB,QAAQ,CAAC,IAAI;QACrD,IAAI,CAAC,GAAG,GAAG,MAAM,CAAA;IACpB,CAAC;IAED,QAAQ,CAAC,KAAe;QACrB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;IACzB,CAAC;IAMD,KAAK,CAAC,MAAc;QACjB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAA;QAC9D,OAAO,IAAK,IAAI,CAAC,WAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;IAClE,CAAC;IAED,gBAAgB,GAAG,CAChB,QAAe,EACf,WAAqB,QAAQ,CAAC,IAAI,EAClC,MAAc,EAAE,EACT,EAAE;QAET,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAA;QAEpC,MAAM,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,GAAG,GAAG,OAAO,IAAI,CAAC,GAAG,GAAG,CAAA;QAClE,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,OAAY,EAAE,EAAE;YAC5C,IAAI,OAAO,YAAY,KAAK,EAAE,CAAC;gBAC5B,OAAO,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,OAAO,CAAA;YAC1C,CAAC;YACD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACnD,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;YACjC,CAAC;YACD,OAAO,MAAM,CAAC,OAAO,CAAC,CAAA;QACzB,CAAC,CAAC,CAAA;QAEF,OAAO,GAAG,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAA;IACvC,CAAC,CAAA;IAOD,GAAG,CAAC,GAAG,QAAe;QACnB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;IACvE,CAAC;IAED,KAAK,CAAC,GAAG,QAAe;QACrB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;IACvE,CAAC;IAED,IAAI,CAAC,GAAG,QAAe;QACpB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;IACvE,CAAC;IAED,IAAI,CAAC,GAAG,QAAe;QACpB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;IACvE,CAAC;IAED,KAAK,CAAC,GAAG,QAAe;QACrB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;IACvE,CAAC;IAED,KAAK,CAAC,GAAG,QAAe;QACrB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;IACvE,CAAC;CACH;AAxED,sDAwEC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DefaultLoggerAdapter.d.ts","sourceRoot":"","sources":["../src/DefaultLoggerAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAIzE,qBAAa,oBAAqB,SAAQ,qBAAqB;gBAChD,MAAM,SAAK,EAAE,KAAK,GAAE,QAAyB;IAWzD,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,KAAK,GAAE,QAAyB,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"DefaultLoggerAdapter.d.ts","sourceRoot":"","sources":["../src/DefaultLoggerAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAIzE,qBAAa,oBAAqB,SAAQ,qBAAqB;gBAChD,MAAM,SAAK,EAAE,KAAK,GAAE,QAAyB;IAWzD,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,KAAK,GAAE,QAAyB,GAAG,IAAI;IAuC5D,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAK/B,KAAK,CAAC,GAAG,QAAQ,EAAE,GAAG,GAAG,IAAI;IAI7B,IAAI,CAAC,GAAG,QAAQ,EAAE,GAAG,GAAG,IAAI;IAI5B,IAAI,CAAC,GAAG,QAAQ,EAAE,GAAG,GAAG,IAAI;IAI5B,KAAK,CAAC,GAAG,QAAQ,EAAE,GAAG,GAAG,IAAI;IAI7B,KAAK,CAAC,GAAG,QAAQ,EAAE,GAAG,GAAG,IAAI;CAG/B"}
|
|
@@ -14,7 +14,19 @@ class DefaultLoggerAdapter extends AbstractLoggerAdapter_1.AbstractLoggerAdapter
|
|
|
14
14
|
this._logger.setLevel(level);
|
|
15
15
|
}
|
|
16
16
|
log(messages, level = this._logLevel) {
|
|
17
|
-
|
|
17
|
+
let tag = '';
|
|
18
|
+
if (chalk_1.default.level === 0) {
|
|
19
|
+
const levelNames = {
|
|
20
|
+
[AbstractLoggerAdapter_1.LogLevel.TRACE]: '[TRC]',
|
|
21
|
+
[AbstractLoggerAdapter_1.LogLevel.DEBUG]: '[DBG]',
|
|
22
|
+
[AbstractLoggerAdapter_1.LogLevel.INFO]: '[INF]',
|
|
23
|
+
[AbstractLoggerAdapter_1.LogLevel.WARN]: '[WRN]',
|
|
24
|
+
[AbstractLoggerAdapter_1.LogLevel.ERROR]: '[ERR]',
|
|
25
|
+
[AbstractLoggerAdapter_1.LogLevel.SILENT]: ''
|
|
26
|
+
};
|
|
27
|
+
tag = ` ${levelNames[level] || '[...]'} `;
|
|
28
|
+
}
|
|
29
|
+
const message = this.formatLogMessage(messages, level, tag);
|
|
18
30
|
switch (level) {
|
|
19
31
|
case AbstractLoggerAdapter_1.LogLevel.TRACE:
|
|
20
32
|
this._logger.trace(chalk_1.default.grey(message));
|
|
@@ -29,7 +41,7 @@ class DefaultLoggerAdapter extends AbstractLoggerAdapter_1.AbstractLoggerAdapter
|
|
|
29
41
|
this._logger.warn(chalk_1.default.red(message));
|
|
30
42
|
break;
|
|
31
43
|
case AbstractLoggerAdapter_1.LogLevel.ERROR:
|
|
32
|
-
this._logger.error(chalk_1.default.
|
|
44
|
+
this._logger.error(chalk_1.default.bgRed.white.bold(message));
|
|
33
45
|
break;
|
|
34
46
|
default:
|
|
35
47
|
this._logger.log(message);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DefaultLoggerAdapter.js","sourceRoot":"","sources":["../src/DefaultLoggerAdapter.ts"],"names":[],"mappings":";;;;;;AAAA,mEAAyE;AACzE,wDAA6B;AAC7B,kDAAyB;AAEzB,MAAa,oBAAqB,SAAQ,6CAAqB;IAC5D,YAAY,MAAM,GAAG,EAAE,EAAE,QAAkB,gCAAQ,CAAC,KAAK;QACtD,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QACpB,IAAI,CAAC,OAAO,GAAG,kBAAM,CAAA;QACrB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC/B,CAAC;IAOD,GAAG,CAAC,QAAe,EAAE,QAAkB,IAAI,CAAC,SAAS;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"DefaultLoggerAdapter.js","sourceRoot":"","sources":["../src/DefaultLoggerAdapter.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -38,14 +38,24 @@ export abstract class AbstractLoggerAdapter implements LoggerType {
|
|
|
38
38
|
this._logLevel = level
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
+
/**
|
|
42
|
+
* Renvoie un clone de l'adaptateur avec un préfixe concatené
|
|
43
|
+
* Ex: new Logger("Queue").clone("MyQueue") => Logger("Queue][MyQueue") -> qui s'affichera [Queue][MyQueue]
|
|
44
|
+
*/
|
|
45
|
+
clone(suffix: string): this {
|
|
46
|
+
const newPrefix = this._me ? `${this._me}][${suffix}` : suffix
|
|
47
|
+
return new (this.constructor as any)(newPrefix, this._logLevel)
|
|
48
|
+
}
|
|
49
|
+
|
|
41
50
|
formatLogMessage = (
|
|
42
51
|
messages: any[],
|
|
43
|
-
loglevel: LogLevel = LogLevel.INFO
|
|
52
|
+
loglevel: LogLevel = LogLevel.INFO,
|
|
53
|
+
tag: string = ''
|
|
44
54
|
): string => {
|
|
45
55
|
// Flatten nested arrays (from rest parameter spreading)
|
|
46
56
|
const flatMessages = messages.flat()
|
|
47
57
|
|
|
48
|
-
const prefix = `${new Date().toISOString()} - [${this._me}]`
|
|
58
|
+
const prefix = `${new Date().toISOString()}${tag} - [${this._me}]`
|
|
49
59
|
const strs = flatMessages.map((message: any) => {
|
|
50
60
|
if (message instanceof Error) {
|
|
51
61
|
return message.stack || message.message
|
|
@@ -13,12 +13,17 @@ jest.mock('loglevel', () => ({
|
|
|
13
13
|
log: jest.fn(),
|
|
14
14
|
}))
|
|
15
15
|
|
|
16
|
+
const mockBold = jest.fn((s) => s)
|
|
17
|
+
const mockWhite = { bold: mockBold }
|
|
18
|
+
const mockBgRed = { white: mockWhite }
|
|
19
|
+
|
|
16
20
|
jest.mock('chalk', () => ({
|
|
21
|
+
level: 1,
|
|
17
22
|
grey: jest.fn((s) => s),
|
|
18
23
|
yellow: jest.fn((s) => s),
|
|
19
24
|
green: jest.fn((s) => s),
|
|
20
25
|
red: jest.fn((s) => s),
|
|
21
|
-
|
|
26
|
+
bgRed: mockBgRed,
|
|
22
27
|
}))
|
|
23
28
|
|
|
24
29
|
describe('DefaultLoggerAdapter', () => {
|
|
@@ -85,12 +90,12 @@ describe('DefaultLoggerAdapter', () => {
|
|
|
85
90
|
expect(chalk.red).toHaveBeenCalled()
|
|
86
91
|
})
|
|
87
92
|
|
|
88
|
-
it('should log error messages with
|
|
93
|
+
it('should log error messages with bgRed.white.bold color', () => {
|
|
89
94
|
adapter.error('error message')
|
|
90
95
|
expect(logger.error).toHaveBeenCalledWith(
|
|
91
96
|
'2023-01-01T00:00:00.000Z - [TEST] error message'
|
|
92
97
|
)
|
|
93
|
-
expect(chalk.
|
|
98
|
+
expect((chalk as any).bgRed.white.bold).toHaveBeenCalled()
|
|
94
99
|
})
|
|
95
100
|
|
|
96
101
|
it('should log trace messages with grey color', () => {
|
|
@@ -15,7 +15,21 @@ export class DefaultLoggerAdapter extends AbstractLoggerAdapter {
|
|
|
15
15
|
* @param level LogLevel
|
|
16
16
|
*/
|
|
17
17
|
log(messages: any[], level: LogLevel = this._logLevel): void {
|
|
18
|
-
|
|
18
|
+
let tag = ''
|
|
19
|
+
if (chalk.level === 0) {
|
|
20
|
+
// Terminal sans support couleur (fallback)
|
|
21
|
+
const levelNames: Record<number, string> = {
|
|
22
|
+
[LogLevel.TRACE]: '[TRC]',
|
|
23
|
+
[LogLevel.DEBUG]: '[DBG]',
|
|
24
|
+
[LogLevel.INFO]: '[INF]',
|
|
25
|
+
[LogLevel.WARN]: '[WRN]',
|
|
26
|
+
[LogLevel.ERROR]: '[ERR]',
|
|
27
|
+
[LogLevel.SILENT]: ''
|
|
28
|
+
}
|
|
29
|
+
tag = ` ${levelNames[level] || '[...]'} `
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const message = this.formatLogMessage(messages, level, tag)
|
|
19
33
|
|
|
20
34
|
switch (level) {
|
|
21
35
|
case LogLevel.TRACE:
|
|
@@ -31,7 +45,7 @@ export class DefaultLoggerAdapter extends AbstractLoggerAdapter {
|
|
|
31
45
|
this._logger.warn(chalk.red(message))
|
|
32
46
|
break
|
|
33
47
|
case LogLevel.ERROR:
|
|
34
|
-
this._logger.error(chalk.
|
|
48
|
+
this._logger.error(chalk.bgRed.white.bold(message))
|
|
35
49
|
break
|
|
36
50
|
default:
|
|
37
51
|
this._logger.log(message)
|