@theshelf/logging 0.3.2 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
 
2
- # Logging | The Shelf
2
+ # Logging core | The Shelf
3
3
 
4
- The logging package provides a universal interaction layer with an actual logging solution.
4
+ This package contains the definition of the logging operations. It uses a interchangeable driver system for performing the actual operations. A console, in-memory and void driver is included.
5
5
 
6
6
  ## Installation
7
7
 
@@ -9,31 +9,20 @@ The logging package provides a universal interaction layer with an actual loggin
9
9
  npm install @theshelf/logging
10
10
  ```
11
11
 
12
- ## Drivers
13
-
14
- Currently, there are three drivers available:
15
-
16
- * **Void** - dummy driver that doesn't log anything (suited for testing).
17
- * **Memory** - in memory logging (suited for testing).
18
- * **Console** - driver based on the Node.js console.
19
- * **Database** - driver that logs messages into a database.
20
-
21
12
  ## How to use
22
13
 
23
14
  The basic set up looks like this.
24
15
 
25
16
  ```ts
26
- import Logger, { VoidDriver | MemoryDriver | ConsoleDriver as SelectedDriver } from '@theshelf/logging';
17
+ import Logger, { MemoryDriver } from '@theshelf/logging';
27
18
 
28
- const driver = new SelectedDriver(/* configuration */);
19
+ const driver = new MemoryDriver();
29
20
  const logger = new Logger(driver);
30
21
 
31
22
  // Perform operations with the logger instance
32
23
  ```
33
24
 
34
- ### Configuration
35
-
36
- #### Logger
25
+ ## Configuration
37
26
 
38
27
  The logger has a configurable log level.
39
28
 
@@ -43,59 +32,32 @@ import { LogLevels } from '@theshelf/logging';
43
32
  logger.logLevel = LogLevels.DEBUG; // default level
44
33
  ```
45
34
 
46
- Other levels are: `INFO` | `WARN` | `ERROR` | `FATAL`.
47
-
48
- #### Void driver
49
-
50
- No configuration options.
51
-
52
- #### Memory driver
53
-
54
- No configuration options.
55
-
56
- #### Console driver
57
-
58
- No configuration options.
59
-
60
- #### Database driver
61
-
62
- The database driver requires a [database](https://github.com/MaskingTechnology/theshelf/tree/main/packages/database) from @theshelf and a table name (record type) to log messages into.
63
-
64
- ```ts
65
- import { database } from './your-database-instance';
66
-
67
- const recordType = 'logs';
68
- const driver = new DatabaseDriver(database, recordType);
69
-
70
- const logger = new Logger(driver);
71
- ```
72
-
73
- ### Operations
35
+ ## Operations
74
36
 
75
37
  ```ts
76
38
  // Log debug
77
- await logger.logDebug(message);
39
+ await logger.debug(message);
78
40
 
79
41
  // Log info
80
- await logger.logInfo(message);
42
+ await logger.info(message);
81
43
 
82
44
  // Log warning
83
- await logger.logWarn(message);
45
+ await logger.warn(message);
84
46
 
85
47
  // Log error
86
- await logger.logError(message);
48
+ await logger.error(message);
87
49
 
88
50
  // Log fatal
89
- await logger.logFatal(message);
51
+ await logger.fatal(message);
90
52
 
91
53
  // Log multiple messages (works for all levels)
92
- await logger.logInfo(message1, message2, ...);
54
+ await logger.info(message1, message2, ...);
93
55
 
94
56
  // Logging multiple types of values (works for all levels)
95
- await logger.logInfo('string', new Error('Oops...'), 42, [ 'a', 3.14 ], { name: 'John Doe', age: null });
57
+ await logger.info('string', new Error('Oops...'), 42, [ 'a', 3.14 ], { name: 'John Doe', age: null });
96
58
  ```
97
59
 
98
- ### Value interpretation
60
+ ## Value interpretation
99
61
 
100
62
  Currently, the logger has support for the following types of values:
101
63
 
@@ -103,6 +65,27 @@ Currently, the logger has support for the following types of values:
103
65
  * Null / undefined
104
66
  * Errors (its stack if available or else its message)
105
67
  * Arrays (all values will be interpreted and concatenated with a space between them)
106
- * Objects (will be stringyfied)
68
+ * Objects (will be stringified)
107
69
 
108
70
  In case multiple messages are given, they will be concatenated with a space between them.
71
+
72
+ ## Drivers
73
+
74
+ There are three drivers included in this package. Other drivers are available in separate packages.
75
+
76
+ ### Void
77
+
78
+ Dummy driver that doesn't log anything (suited for testing). It doesn't have any configuration options or additional operations.
79
+
80
+ ### Memory
81
+
82
+ In memory logging (suited for testing). It doesn't have any configuration options, but has an additional operation.
83
+
84
+ ```ts
85
+ // Clear the memory
86
+ driver.clear();
87
+ ```
88
+
89
+ ### Console
90
+
91
+ Driver based on the Node.js console. It doesn't have any configuration options or additional operations.
package/dist/Logger.d.ts CHANGED
@@ -1,13 +1,16 @@
1
1
  import type { LogLevel } from './definitions/constants.js';
2
2
  import type { Driver } from './definitions/interfaces.js';
3
- export default class Logger implements Driver {
3
+ import type { Log } from './definitions/types.js';
4
+ export default class Logger {
4
5
  #private;
5
- constructor(driver: Driver);
6
+ constructor(driver: Driver, source?: string);
6
7
  set logLevel(level: LogLevel);
7
8
  get logLevel(): LogLevel;
8
- logDebug(...message: unknown[]): Promise<void>;
9
- logInfo(...message: unknown[]): Promise<void>;
10
- logWarn(...message: unknown[]): Promise<void>;
11
- logError(...message: unknown[]): Promise<void>;
12
- logFatal(...message: unknown[]): Promise<void>;
9
+ for(source: string): Logger;
10
+ log(log: Log): Promise<void>;
11
+ debug(...message: unknown[]): Promise<void>;
12
+ info(...message: unknown[]): Promise<void>;
13
+ warn(...message: unknown[]): Promise<void>;
14
+ error(...message: unknown[]): Promise<void>;
15
+ fatal(...message: unknown[]): Promise<void>;
13
16
  }
package/dist/Logger.js CHANGED
@@ -1,9 +1,11 @@
1
1
  import { LogLevels } from './definitions/constants.js';
2
2
  export default class Logger {
3
3
  #driver;
4
+ #source;
4
5
  #logLevel = LogLevels.DEBUG;
5
- constructor(driver) {
6
+ constructor(driver, source = 'Unknown') {
6
7
  this.#driver = driver;
8
+ this.#source = source;
7
9
  }
8
10
  set logLevel(level) {
9
11
  this.#logLevel = level;
@@ -11,40 +13,55 @@ export default class Logger {
11
13
  get logLevel() {
12
14
  return this.#logLevel;
13
15
  }
14
- logDebug(...message) {
16
+ for(source) {
17
+ const tracedSource = `${this.#source}.${source}`;
18
+ const logger = new Logger(this.#driver, tracedSource);
19
+ logger.logLevel = this.#logLevel;
20
+ return logger;
21
+ }
22
+ log(log) {
23
+ return this.#driver.log(log);
24
+ }
25
+ debug(...message) {
15
26
  if (this.#logLevel > LogLevels.DEBUG) {
16
27
  return Promise.resolve();
17
28
  }
18
- const messageString = this.#createMessage(message);
19
- return this.#driver.logDebug(messageString);
29
+ const log = this.#createLog(LogLevels.DEBUG, message);
30
+ return this.log(log);
20
31
  }
21
- logInfo(...message) {
32
+ info(...message) {
22
33
  if (this.#logLevel > LogLevels.INFO) {
23
34
  return Promise.resolve();
24
35
  }
25
- const messageString = this.#createMessage(message);
26
- return this.#driver.logInfo(messageString);
36
+ const log = this.#createLog(LogLevels.INFO, message);
37
+ return this.log(log);
27
38
  }
28
- logWarn(...message) {
39
+ warn(...message) {
29
40
  if (this.#logLevel > LogLevels.WARN) {
30
41
  return Promise.resolve();
31
42
  }
32
- const messageString = this.#createMessage(message);
33
- return this.#driver.logWarn(messageString);
43
+ const log = this.#createLog(LogLevels.WARN, message);
44
+ return this.log(log);
34
45
  }
35
- logError(...message) {
46
+ error(...message) {
36
47
  if (this.#logLevel > LogLevels.ERROR) {
37
48
  return Promise.resolve();
38
49
  }
39
- const messageString = this.#createMessage(message);
40
- return this.#driver.logError(messageString);
50
+ const log = this.#createLog(LogLevels.ERROR, message);
51
+ return this.log(log);
52
+ }
53
+ fatal(...message) {
54
+ const log = this.#createLog(LogLevels.FATAL, message);
55
+ return this.log(log);
41
56
  }
42
- logFatal(...message) {
43
- const messageString = this.#createMessage(message);
44
- return this.#driver.logFatal(messageString);
57
+ #createLog(level, messages) {
58
+ const timestamp = new Date().toISOString();
59
+ const source = this.#source;
60
+ const message = this.#createMessage(messages);
61
+ return { timestamp, level, source, message };
45
62
  }
46
- #createMessage(message) {
47
- return message.map(value => this.#interpretValue(value)).join(' ');
63
+ #createMessage(messages) {
64
+ return messages.map(message => this.#interpretValue(message)).join(' ');
48
65
  }
49
66
  #interpretValue(value) {
50
67
  switch (typeof value) {
@@ -1,7 +1,4 @@
1
+ import type { Log } from './types.js';
1
2
  export interface Driver {
2
- logDebug(message: string): Promise<void>;
3
- logInfo(message: string): Promise<void>;
4
- logWarn(message: string): Promise<void>;
5
- logError(message: string): Promise<void>;
6
- logFatal(message: string): Promise<void>;
3
+ log(log: Log): Promise<void>;
7
4
  }
@@ -0,0 +1,7 @@
1
+ import type { LogLevel } from './constants.js';
2
+ export type Log = {
3
+ timestamp: string;
4
+ level: LogLevel;
5
+ source: string;
6
+ message: string;
7
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -1,8 +1,6 @@
1
1
  import type { Driver } from '../definitions/interfaces.js';
2
+ import type { Log } from '../definitions/types.js';
2
3
  export default class Console implements Driver {
3
- logDebug(message: string): Promise<void>;
4
- logInfo(message: string): Promise<void>;
5
- logWarn(message: string): Promise<void>;
6
- logError(message: string): Promise<void>;
7
- logFatal(message: string): Promise<void>;
4
+ #private;
5
+ log(log: Log): Promise<void>;
8
6
  }
@@ -1,18 +1,21 @@
1
1
  /* eslint no-console: "off" */
2
+ import { LogLevels } from '../definitions/constants.js';
3
+ import levelToString from '../utils/levelToString.js';
2
4
  export default class Console {
3
- async logDebug(message) {
4
- return console.debug(`[DEBUG] ${message}`);
5
+ async log(log) {
6
+ const message = this.#createLogMessage(log);
7
+ switch (log.level) {
8
+ case LogLevels.DEBUG: return console.debug(message);
9
+ case LogLevels.INFO: return console.info(message);
10
+ case LogLevels.WARN: return console.warn(message);
11
+ default: return console.error(message);
12
+ }
5
13
  }
6
- async logInfo(message) {
7
- return console.info(`[INFO] ${message}`);
8
- }
9
- async logWarn(message) {
10
- return console.warn(`[WARN] ${message}`);
11
- }
12
- async logError(message) {
13
- return console.error(`[ERROR] ${message}`);
14
- }
15
- async logFatal(message) {
16
- return console.error(`[FATAL] ${message}`);
14
+ #createLogMessage(log) {
15
+ const time = log.timestamp;
16
+ const level = levelToString(log.level);
17
+ const source = log.source;
18
+ const message = log.message;
19
+ return `[${time}][${level}][${source}] ${message}`;
17
20
  }
18
21
  }
@@ -1,17 +1,8 @@
1
- import type { LogLevel } from '../definitions/constants.js';
2
1
  import type { Driver } from '../definitions/interfaces.js';
3
- type Log = {
4
- level: LogLevel;
5
- message: string;
6
- };
2
+ import type { Log } from '../definitions/types.js';
7
3
  export default class Memory implements Driver {
8
4
  #private;
9
5
  get logs(): Log[];
10
- logDebug(message: string): Promise<void>;
11
- logInfo(message: string): Promise<void>;
12
- logWarn(message: string): Promise<void>;
13
- logError(message: string): Promise<void>;
14
- logFatal(message: string): Promise<void>;
6
+ log(log: Log): Promise<void>;
15
7
  clear(): void;
16
8
  }
17
- export {};
@@ -1,21 +1,8 @@
1
- import { LogLevels } from '../definitions/constants.js';
2
1
  export default class Memory {
3
2
  #logs = [];
4
3
  get logs() { return this.#logs; }
5
- async logDebug(message) {
6
- this.#logs.push({ level: LogLevels.DEBUG, message });
7
- }
8
- async logInfo(message) {
9
- this.#logs.push({ level: LogLevels.INFO, message });
10
- }
11
- async logWarn(message) {
12
- this.#logs.push({ level: LogLevels.WARN, message });
13
- }
14
- async logError(message) {
15
- this.#logs.push({ level: LogLevels.ERROR, message });
16
- }
17
- async logFatal(message) {
18
- this.#logs.push({ level: LogLevels.FATAL, message });
4
+ async log(log) {
5
+ this.#logs.push(log);
19
6
  }
20
7
  clear() {
21
8
  this.#logs.splice(0);
@@ -1,8 +1,5 @@
1
1
  import type { Driver } from '../definitions/interfaces.js';
2
+ import type { Log } from '../definitions/types.js';
2
3
  export default class Void implements Driver {
3
- logDebug(message: string): Promise<void>;
4
- logInfo(message: string): Promise<void>;
5
- logWarn(message: string): Promise<void>;
6
- logError(message: string): Promise<void>;
7
- logFatal(message: string): Promise<void>;
4
+ log(log: Log): Promise<void>;
8
5
  }
@@ -1,18 +1,6 @@
1
1
  /* eslint @typescript-eslint/no-unused-vars: "off" */
2
2
  export default class Void {
3
- logDebug(message) {
4
- return Promise.resolve();
5
- }
6
- logInfo(message) {
7
- return Promise.resolve();
8
- }
9
- logWarn(message) {
10
- return Promise.resolve();
11
- }
12
- logError(message) {
13
- return Promise.resolve();
14
- }
15
- logFatal(message) {
16
- return Promise.resolve();
3
+ async log(log) {
4
+ return;
17
5
  }
18
6
  }
package/dist/index.d.ts CHANGED
@@ -1,9 +1,9 @@
1
- export * from './definitions/constants.js';
2
- export type * from './definitions/constants.js';
3
- export type * from './definitions/interfaces.js';
1
+ export { LogLevels } from './definitions/constants.js';
2
+ export type { LogLevel } from './definitions/constants.js';
3
+ export type { Driver } from './definitions/interfaces.js';
4
+ export type { Log } from './definitions/types.js';
4
5
  export { default as LogError } from './errors/LogError.js';
5
6
  export { default as ConsoleDriver } from './drivers/Console.js';
6
- export { default as DatabaseDriver } from './drivers/Database.js';
7
7
  export { default as MemoryDriver } from './drivers/Memory.js';
8
8
  export { default as VoidDriver } from './drivers/Void.js';
9
9
  export { default } from './Logger.js';
package/dist/index.js CHANGED
@@ -1,7 +1,6 @@
1
- export * from './definitions/constants.js';
1
+ export { LogLevels } from './definitions/constants.js';
2
2
  export { default as LogError } from './errors/LogError.js';
3
3
  export { default as ConsoleDriver } from './drivers/Console.js';
4
- export { default as DatabaseDriver } from './drivers/Database.js';
5
4
  export { default as MemoryDriver } from './drivers/Memory.js';
6
5
  export { default as VoidDriver } from './drivers/Void.js';
7
6
  export { default } from './Logger.js';
@@ -0,0 +1,2 @@
1
+ import type { LogLevel } from '../definitions/constants.js';
2
+ export default function levelToString(level: LogLevel): string;
@@ -0,0 +1,5 @@
1
+ import { LogLevels } from '../definitions/constants.js';
2
+ const logLevels = new Map(Object.entries(LogLevels).map(([key, value]) => [value, key]));
3
+ export default function levelToString(level) {
4
+ return logLevels.get(level) ?? 'UNKNOWN';
5
+ }
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "@theshelf/logging",
3
3
  "private": false,
4
- "version": "0.3.2",
4
+ "version": "0.4.0",
5
5
  "type": "module",
6
6
  "repository": {
7
7
  "url": "git+https://github.com/MaskingTechnology/theshelf.git"
8
8
  },
9
+ "license": "MIT",
9
10
  "scripts": {
10
11
  "build": "tsc",
11
12
  "clean": "rimraf dist",
@@ -19,14 +20,6 @@
19
20
  "README.md",
20
21
  "dist"
21
22
  ],
22
- "types": "dist/index.d.ts",
23
- "exports": "./dist/index.js",
24
- "peerDependencies": {
25
- "@theshelf/database": "^0.3.0"
26
- },
27
- "peerDependenciesMeta": {
28
- "@theshelf/database": {
29
- "optional": true
30
- }
31
- }
23
+ "types": "./dist/index.d.ts",
24
+ "exports": "./dist/index.js"
32
25
  }
@@ -1,12 +0,0 @@
1
- import type Database from '@theshelf/database';
2
- import type { RecordType } from '@theshelf/database';
3
- import type { Driver } from '../definitions/interfaces.js';
4
- export default class DatabaseDriver implements Driver {
5
- #private;
6
- constructor(database: Database, recordType: RecordType);
7
- logDebug(message: string): Promise<void>;
8
- logInfo(message: string): Promise<void>;
9
- logWarn(message: string): Promise<void>;
10
- logError(message: string): Promise<void>;
11
- logFatal(message: string): Promise<void>;
12
- }
@@ -1,31 +0,0 @@
1
- export default class DatabaseDriver {
2
- #database;
3
- #recordType;
4
- constructor(database, recordType) {
5
- this.#recordType = recordType;
6
- this.#database = database;
7
- }
8
- logDebug(message) {
9
- return this.#logRecord('DEBUG', message);
10
- }
11
- logInfo(message) {
12
- return this.#logRecord('INFO', message);
13
- }
14
- logWarn(message) {
15
- return this.#logRecord('WARN', message);
16
- }
17
- logError(message) {
18
- return this.#logRecord('ERROR', message);
19
- }
20
- logFatal(message) {
21
- return this.#logRecord('FATAL', message);
22
- }
23
- async #logRecord(level, message) {
24
- const data = {
25
- timestamp: new Date().toISOString(),
26
- level,
27
- message
28
- };
29
- await this.#database.createRecord(this.#recordType, data);
30
- }
31
- }