Skip to content

Commit

Permalink
feat: add object as special context (allow key name search)
Browse files Browse the repository at this point in the history
  • Loading branch information
Alex-Werner committed Jan 20, 2024
1 parent be1866a commit 7b9b703
Show file tree
Hide file tree
Showing 10 changed files with 110 additions and 60 deletions.
80 changes: 63 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,18 +37,6 @@ listenerLogger.debug("Message received!");
#### `new Logger(options)`
Create a new logger instance.

##### `context(name)`
Create a new context logger with the given context name.

##### `module(name)`
Create a new module logger with the given module name.

##### `listener(name)`
Create a new listener sublogger with the given listener name.

##### `method(name)`
Create a new method sublogger with the given method name.

#### Level methods

##### `log(message, level)`
Expand All @@ -72,20 +60,78 @@ Log a message with the error level.
##### `fatal(message)`
Log a message with the fatal level.

#### Context methods

##### `context(name)`
Create a new context logger with the given context name.

##### `module(name)`
Create a new module logger with the given module name.

##### `listener(name)`
Create a new listener sublogger with the given listener name.

##### `method(name)`
Create a new method sublogger with the given method name.

##### `child(name)`
Create a new child logger with the given child name.

##### `object(object)`
Create a new object logger with the given object.

#### Other methods

#### `clone(opts)`
Clone the logger. The `opts` object can have the following properties:
- keepHistory: Whether to keep the history of the logger. Default: `false` (unique falsy one).
- keepContext: Whether to keep the context of the logger. Default: `true`.
- keepModule: Whether to keep the module of the logger. Default: `true`.
- keepListener: Whether to keep the listener of the logger. Default: `true`.
- keepMethod: Whether to keep the method of the logger. Default: `true`.
- keepObject: Whether to keep the object of the logger. Default: `true`.
- keepChild: Whether to keep the child of the logger. Default: `true`.
- keepLevel: Whether to keep the level of the logger. Default: `true`.
- keepColors: Whether to keep the colors of the logger. Default: `true`.
- keepDate: Whether to keep the date of the logger. Default: `true`.

#### constructor options
The `options` object can have the following properties:

level: The default log level. Can be one of 'fatal', 'error', 'warn', 'info', 'debug', 'trace'.
colors: An object where each key is a log level and the value is an array of colors for different parts of the log message. The array should have the following order: [date color, type color, context color, module color, listener color, method color, object color, string color, function color, number/default color].
date: A date-compatible format
##### `date`
A date-compatible format. Default: `YYYY-MM-DD HH:mm:ss.SSS`.

##### `level`
A default log level. Can be one of 'fatal', 'error', 'warn', 'info', 'debug', 'trace'. Default: `info`.

##### `history`
The history of the logger. Default: `[]`.

##### `contextName`
The context name of the logger. Default: `null`.

##### `moduleName`
The module name of the logger. Default: `null`.

##### `listenerName`
The listener name of the logger. Default: `null`.

##### `methodName`
The method name of the logger. Default: `null`.

##### `objectName`
The object name of the logger. Default: `null`.

##### `colors`
An object where each key is a log level and the value is an array of colors for different parts of the log message. The array should have the following order: [date color, type color, context color, module color, listener color, method color, object color, string color, function color, number/default color].

```js
{
const options = {
date: new Date('2024-01-01T00:01:01.001Z')},
date: new Date('2024-01-01T00:01:01.001Z'),
level: 'info', // Set the default log level
colors: { // Set the colors for different parts of the log message
colors: {
// Set the colors for different parts of the log message
fatal: [chalk.gray, chalk.red, chalk.blueBright, chalk.gray, chalk.cyan, chalk.yellow, chalk.magenta, chalk.white, chalk.blue, chalk.cyan],
error: [chalk.gray, chalk.red, chalk.blueBright, chalk.gray, chalk.cyan, chalk.yellow, chalk.red, chalk.yellow, chalk.green, chalk.blue],
warn: [chalk.gray, chalk.red, chalk.blueBright, chalk.gray, chalk.cyan, chalk.yellow, chalk.yellow, chalk.blue, chalk.magenta, chalk.red],
Expand Down
37 changes: 29 additions & 8 deletions src/Logger.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,22 @@ import fatal from "./methods/fatal.js";
import child from "./methods/child.js";

import LOG_COLORS from "./LOG_COLORS.js";
import object from "./methods/object.js";
class Logger {
constructor(props = {}) {
this.level = props.level ?? 'info';
if (!LOG_LEVELS.hasOwnProperty(this.level)) {
throw new Error(`Unknown log level ${this.level}`)
}

this.history = [];
this.history = props.history ?? [];

this.contextName = props.contextName ?? null;
this.methodName = props.methodName ?? null;
this.moduleName = props.moduleName ?? null;
this.listenerName = props.listenerName ?? null;
this.objectName = props.objectName ?? null;

this.contextName = null
this.methodName = null
this.moduleName = null
this.listenerName = null
if (props.date) {
this.date = props.date;
}
Expand All @@ -38,10 +41,27 @@ class Logger {
console.log(message)
}

clone() {
clone(opts = {}) {
const keepHistory = opts?.keepHistory ?? false;
const keepLevel = opts?.keepLevel ?? true;
const keepDate = opts?.keepDate ?? true;
const keepColors = opts?.keepColors ?? true;
const keepContext = opts?.keepContext ?? true;
const keepMethod = opts?.keepMethod ?? true;
const keepModule = opts?.keepModule ?? true;
const keepListener = opts?.keepListener ?? true;
const keepObject = opts?.keepObject ?? true;

return new Logger({
level: this.level,
date: this.date,
level: (keepLevel) ? this.level : opts.level ?? this.level,
date: (keepDate) ? this.date : opts.date ?? null,
history: keepHistory ? this.history : [],
colors: (keepColors) ? this.LOG_COLORS : opts.colors ?? this.LOG_COLORS,
contextName: (keepContext) ? this.contextName : opts.contextName ?? null,
methodName: (keepMethod) ? this.methodName : opts.methodName ?? null,
moduleName: (keepModule) ? this.moduleName : opts.moduleName ?? null,
listenerName: (keepListener) ? this.listenerName : opts.listenerName ?? null,
objectName: (keepObject) ? this.objectName : opts.objectName ?? null,
})
}

Expand All @@ -55,6 +75,7 @@ Logger.prototype.info = info;
Logger.prototype.listener = listener;
Logger.prototype.log = log;
Logger.prototype.method = method;
Logger.prototype.object = object;
Logger.prototype.module = module;
Logger.prototype.trace = trace;
Logger.prototype.warn = warn;
Expand Down
1 change: 1 addition & 0 deletions src/Logger.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ describe('Logger', () => {
})
it('should handle level', function () {
const levelLogger = new Logger({level: 'error'})
levelLogger._log = () => {}
levelLogger.error('Hello');
assert.equal(levelLogger.history.length, 1)
levelLogger.warn('Hello');
Expand Down
4 changes: 0 additions & 4 deletions src/methods/context.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,6 @@ import Logger from "../Logger.js";
export default function context(_context) {
const logger = this.clone();
logger.contextName = _context;
logger.methodName = this.methodName;
logger.moduleName = this.moduleName;
logger.listenerName = this.listenerName;

logger._log = this._log.bind(logger);
return logger;
}
2 changes: 0 additions & 2 deletions src/methods/listener.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ import Logger from "../Logger.js";

export default function listener(_listener) {
const logger = this.clone();
logger.moduleName = this.moduleName;
logger.contextName = this.contextName;
logger.listenerName = _listener;
logger._log = this._log.bind(logger);
return logger;
Expand Down
3 changes: 0 additions & 3 deletions src/methods/method.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,6 @@ import Logger from "../Logger.js";

export default function method(_method) {
const logger = this.clone();
logger.moduleName = this.moduleName;
logger.contextName = this.contextName;
logger.listenerName = this.listenerName;
logger.methodName = _method;
logger._log = this._log.bind(logger);
return logger;
Expand Down
6 changes: 1 addition & 5 deletions src/methods/module.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
import Logger from "../Logger.js";

export default function module(_module) {
export default function module(_module) {
const logger = this.clone();
logger.methodName = this.methodName;
logger.moduleName = _module;
logger.contextName = this.contextName;
logger.listenerName = this.listenerName;

logger._log = this._log.bind(logger);
return logger;
}
8 changes: 8 additions & 0 deletions src/methods/object.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import Logger from "../Logger.js";

export default function object(_context) {
const logger = this.clone();
logger.objectName = _context;
logger._log = this._log.bind(logger);
return logger;
}
7 changes: 7 additions & 0 deletions src/utils/log.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ export default function log(level, args, context) {
message = `[${colors[0](date.toISOString())}]`;
}


// TODO: It would be neat to just have a single parents array that would be used
// to generate the context string.
if(context.contextName){
message += ` context: ${colors[2](context.contextName)} |`;
}
Expand All @@ -22,6 +25,10 @@ export default function log(level, args, context) {
if(context.methodName){
message += ` method: ${colors[5](context.methodName)} |`;
}
if(context.objectName){
message += ` Object[${colors[6](context.objectName)}] |`;
}

if(message.endsWith(' |')){
message = message.slice(0, -1);
}
Expand Down
22 changes: 1 addition & 21 deletions usage.example.js
Original file line number Diff line number Diff line change
@@ -1,31 +1,11 @@
import Logger from './src/Logger.js';


const logger = new Logger({
level: 'trace',
});

// {
// room: 'CANDLE',
// message: {
// payload: Candle {
// market: [Market],
// interval: '1m',
// open: '41303.70',
// close: '41305.60',
// low: '41301.00',
// high: '41308.50',
// volume: [Object],
// openTime: [Epoch],
// closeTime: [Epoch],
// trades: '223',
// id: '8e884b29'
// },
// topic: 'CANDLE'
// }
// }


logger.context('APIContext').module('Websocket Server').listener('onMessage').method('processIncomingMessage').log('Hello World');

const contextLogger = logger.context('APIContext')
contextLogger.log('Started API');
Expand Down

0 comments on commit 7b9b703

Please sign in to comment.