Skip to content

Commit d1d36e4

Browse files
committed
Refactor lib, export loglevel's Logger subclass
1 parent a94014e commit d1d36e4

1 file changed

Lines changed: 51 additions & 33 deletions

File tree

lib/log.js

Lines changed: 51 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,6 @@ const logLevel = require('loglevel')
44
const chalk = require('chalk')
55
const prefix = require('loglevel-plugin-prefix')
66

7-
const getKeyByValue = (object, value) => {
8-
return Object.keys(object).find(key => object[key] === value)
9-
}
10-
117
const colors = Object.freeze({
128
TRACE: chalk.magenta,
139
DEBUG: chalk.cyan,
@@ -16,42 +12,64 @@ const colors = Object.freeze({
1612
ERROR: chalk.red
1713
})
1814

19-
const logConfiguration = {
20-
// template: '[%t] %l %n:',
21-
format(level, name, timestamp) {
22-
return `${chalk.gray(`[${timestamp}]`)} ${colors[level.toUpperCase()](level)} ${chalk.green(`${name}:`)}`
23-
},
24-
timestampFormatter: () => {
25-
const tzOffset = (new Date()).getTimezoneOffset() * 60000 // offset in milliseconds
26-
const localISOTime = (new Date(Date.now() - tzOffset)).toISOString().slice(0, -1) // => '2015-01-26T06:40:36.181'
27-
return localISOTime
28-
}
15+
const defaultTimestampFormatter = (date) => {
16+
const tzOffset = date.getTimezoneOffset() * 60000 // offset in milliseconds
17+
const localISOTime = (new Date(date - tzOffset)).toISOString().slice(0, -1) // => '2015-01-26T06:40:36.181'
18+
return localISOTime
19+
}
20+
21+
const defaultNameFormatter = (name) => {
22+
return chalk.green(name)
23+
}
24+
25+
const defaultLevelFormatter = (level) => {
26+
return colors[level.toUpperCase()](level.toUpperCase())
2927
}
3028

31-
module.exports.levels = logLevel.levels
29+
const defaultTemplate = '[%t] %l [%n]:'
3230

33-
module.exports.monkLog = ({ name = '', level = logLevel.levels.DEBUG, wrap = ['[', ']'] } = {}) => {
34-
if (!Array.isArray(wrap)) {
35-
wrap = ['[', ']']
31+
const defaultOptions = {
32+
levelFormatter: defaultLevelFormatter,
33+
timestampFormatter: defaultTimestampFormatter,
34+
nameFormatter: defaultNameFormatter,
35+
template: defaultTemplate,
36+
level: 'WARN'
37+
}
38+
39+
const _loggersByName = {}
40+
41+
class MonkLogger extends logLevel.constructor {
42+
constructor (name, level, options) {
43+
super(name, level)
44+
this.options = {...defaultOptions}
45+
this.configure(options)
3646
}
3747

38-
if (wrap.length !== 2) {
39-
throw new Error(`Wrong wrap params, expected 2 got ${wrap.length} elements`)
48+
configure (options, reset = false) {
49+
this.options = {
50+
...(reset ? defaultOptions : this.options),
51+
...options,
52+
}
53+
this.setLevel(this.options.level)
54+
prefix.apply(this, this.options)
4055
}
4156

42-
let logger
43-
if (name) {
44-
name = `${wrap[0]}${name}${wrap[1]}`
45-
logger = logLevel.getLogger(name)
46-
} else {
47-
// root name is nasty
48-
logger = logLevel.getLogger('monk-log')
57+
getLogger (name, level, options) {
58+
if (typeof name !== "string" || name === "") {
59+
throw new TypeError("You must supply a name when creating a logger.")
60+
}
61+
let logger = _loggersByName[name]
62+
if (!logger) {
63+
logger = _loggersByName[name] = new MonkLogger(
64+
name, level, {...this.options, ...options})
65+
}
66+
return logger
4967
}
68+
}
5069

51-
prefix.reg(logLevel)
52-
prefix.apply(logger, logConfiguration)
53-
logger.setLevel(level)
54-
logger.info(`Set log level to ${getKeyByValue(logger.levels, level)}`)
70+
prefix.reg(logLevel)
5571

56-
return logger
57-
}
72+
const defaultLogger = new MonkLogger('root')
73+
defaultLogger.getLoggers = () => _loggersByName
74+
75+
module.exports = defaultLogger

0 commit comments

Comments
 (0)