@felixpy/logger
Version:
A simple javascript logger for web developers.
123 lines (94 loc) • 2.55 kB
JavaScript
import TYPOR from '../util/typor'
import { LEVELS } from './enum'
import { generateConfig, generateAppender } from './config'
import { formatAppenderArgs } from './formatter'
let lid = 0
class Logger {
lid
name
config
static instance = null
static get (options = {}) {
const T = this
if (!T.instance || options.isNew) {
T.instance = new T(options)
}
return T.instance
}
constructor (options = {}) {
options = TYPOR.str(options) ? {
name: options
} : options
this.lid = lid++
this.name = options.name || `Logger#${this.lid}`
this.init(options)
}
init (options) {
const config = generateConfig(options.config || {})
this.setLevel(config.level)
this.setPrefix(config.prefix)
this.setSeparator(config.separator)
this.setDateFormatter(config.dateFormatter)
this.setAppender(config.appenders)
}
setConfig (key, value) {
this.config = this.config || {}
this.config[key] = value
}
setLevel (level) {
this.setConfig('level', level)
}
setPrefix (prefix) {
this.setConfig('prefix', prefix)
}
setSeparator (separator) {
this.setConfig('separator', separator)
}
setDateFormatter (formatter) {
this.setConfig('dateFormatter', formatter)
}
setAppender (appenders) {
appenders = TYPOR.arr(appenders) ? appenders : [appenders]
appenders = appenders.map((appender) => {
return generateAppender(appender)
}).filter(appender => !!appender)
this.setConfig('appenders', appenders)
}
log () {
this._invoke('LOG', arguments)
}
debug () {
this._invoke('DEBUG', arguments)
}
info () {
this._invoke('INFO', arguments)
}
warn () {
this._invoke('WARN', arguments)
}
error () {
this._invoke('ERROR', arguments)
}
_invoke (level, args) {
let splittedArgs
args = Array.prototype.slice.call(args)
splittedArgs = {
method: args.length > 1 ? args.shift() : null,
messages: args
}
this.config.appenders.forEach((appender) => {
this._append(appender, level, splittedArgs.method, splittedArgs.messages)
})
}
_append (appender, level, method, messages) {
const name = this.name
const config = this.config
const appenderLevel = appender.level || config.level
if (LEVELS[level] >= LEVELS[appenderLevel]) {
if (TYPOR.func(appender.handler)) {
appender.handler(level, formatAppenderArgs({ name, config, appender, level, method, messages }))
}
}
}
}
export default Logger