You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
2.6 KiB
132 lines
2.6 KiB
'use strict'; |
|
|
|
const { Console } = require('console'); |
|
const picocolors = require('picocolors'); |
|
|
|
const TRACE = 10; |
|
const DEBUG = 20; |
|
const INFO = 30; |
|
const WARN = 40; |
|
const ERROR = 50; |
|
const FATAL = 60; |
|
|
|
const LEVEL_NAMES = { |
|
10: 'TRACE', |
|
20: 'DEBUG', |
|
30: 'INFO ', |
|
40: 'WARN ', |
|
50: 'ERROR', |
|
60: 'FATAL' |
|
}; |
|
|
|
const LEVEL_COLORS = { |
|
10: 'gray', |
|
20: 'gray', |
|
30: 'green', |
|
40: 'bgYellow', |
|
50: 'bgRed', |
|
60: 'bgRed' |
|
}; |
|
|
|
const console = new Console({ |
|
stdout: process.stdout, |
|
stderr: process.stderr, |
|
colorMode: false |
|
}); |
|
|
|
class Logger { |
|
constructor(options = {}) { |
|
const silent = options.silent || false; |
|
this._debug = options.debug || false; |
|
|
|
this.level = INFO; |
|
|
|
if (silent) { |
|
this.level = FATAL + 10; |
|
} |
|
|
|
if (this._debug) { |
|
this.level = TRACE; |
|
} |
|
} |
|
|
|
_writeLogOutput(level, consoleArgs) { |
|
const fields = consoleArgs[0]; |
|
if (typeof fields === 'object') { |
|
if (fields && consoleArgs.length === 1 && fields.err && fields.err instanceof Error) { |
|
consoleArgs = [fields.err.message]; |
|
} else { |
|
consoleArgs.shift(); |
|
} |
|
} |
|
|
|
if (this._debug) { |
|
const str = new Date().toISOString().substring(11, 23) + ' '; |
|
|
|
if (level === TRACE || level >= WARN) { |
|
process.stderr.write(picocolors[LEVEL_COLORS[DEBUG]](str)); |
|
} else { |
|
process.stdout.write(picocolors[LEVEL_COLORS[DEBUG]](str)); |
|
} |
|
} |
|
|
|
if (level >= this.level) { |
|
const str = picocolors[LEVEL_COLORS[level]](LEVEL_NAMES[level]) + ' '; |
|
if (level === TRACE || level >= WARN) { |
|
process.stderr.write(str); |
|
} else { |
|
process.stdout.write(str); |
|
} |
|
|
|
if (level === TRACE) { |
|
console.trace(...consoleArgs); |
|
} else if (level < INFO) { |
|
console.debug(...consoleArgs); |
|
} else if (level < WARN) { |
|
console.info(...consoleArgs); |
|
} else if (level < ERROR) { |
|
console.warn(...consoleArgs); |
|
} else { |
|
console.error(...consoleArgs); |
|
} |
|
} |
|
} |
|
|
|
trace(...args) { |
|
this._writeLogOutput(TRACE, args); |
|
} |
|
|
|
debug(...args) { |
|
this._writeLogOutput(DEBUG, args); |
|
} |
|
|
|
info(...args) { |
|
this._writeLogOutput(INFO, args); |
|
} |
|
|
|
warn(...args) { |
|
this._writeLogOutput(WARN, args); |
|
} |
|
|
|
error(...args) { |
|
this._writeLogOutput(ERROR, args); |
|
} |
|
|
|
fatal(...args) { |
|
this._writeLogOutput(FATAL, args); |
|
} |
|
} |
|
|
|
function createLogger(options) { |
|
const logger = new Logger(options); |
|
|
|
logger.d = logger.debug; |
|
logger.i = logger.info; |
|
logger.w = logger.warn; |
|
logger.e = logger.error; |
|
logger.log = logger.info; |
|
|
|
return logger; |
|
} |
|
|
|
module.exports = createLogger;
|
|
|