@quartic/bokehjs
Version:
Interactive, novel data visualization
92 lines (71 loc) • 2.48 kB
text/coffeescript
# This is based on https://github.com/pimterry/loglevel
import {isString} from "./util/types"
noop = () ->
_method_factory = (method_name, logger_name) ->
if console[method_name]?
return console[method_name].bind(console, logger_name)
else if console.log?
return console.log.bind(console, logger_name)
else
return noop
_loggers = {}
class LogLevel
constructor: (name, level) ->
= name
= level
export class Logger
: new LogLevel("trace", 0)
: new LogLevel("debug", 1)
: new LogLevel("info", 2)
: new LogLevel("warn", 6)
: new LogLevel("error", 7)
: new LogLevel("fatal", 8)
: new LogLevel("off", 9)
: {
trace:
debug:
info:
warn:
error:
fatal:
off:
}
Object.defineProperty(this, 'levels', { get: () -> Object.keys(Logger.log_levels) })
(name, level=Logger.INFO) ->
if isString(name) and name.length > 0
logger = _loggers[name]
if not logger?
logger = _loggers[name] = new Logger(name, level)
return logger
else
throw new TypeError("Logger.get() expects a string name and an optional log-level")
constructor: (name, level=Logger.INFO) ->
= name
Object.defineProperty(this.prototype, 'level', { get: () -> })
get_level: () ->
set_level: (log_level) ->
if log_level instanceof LogLevel
= log_level
else if isString(log_level) and Logger.log_levels[log_level]?
= Logger.log_levels[log_level]
else
throw new Error("Logger.set_level() expects a log-level object or a string name of a log-level")
logger_name = "[#{@_name}]"
for __, log_level of Logger.log_levels
if log_level == Logger.OFF
break
else
method_name = log_level.name
if log_level.level < .level
@[method_name] = noop
else
@[method_name] = _method_factory(method_name, logger_name)
export logger = Logger.get("bokeh")
export set_log_level = (level) ->
if level not in Logger.levels
console.log("[bokeh] unrecognized logging level '#{level}' passed to Bokeh.set_log_level(), ignoring")
console.log("[bokeh] valid log levels are: #{Logger.levels.join(', ')}")
else
console.log("[bokeh] setting log level to: '#{level}'")
logger.set_level(level)