UNPKG

domotz-remote-pawn

Version:

Domotz Agent

136 lines (121 loc) 3.94 kB
const HierarchyLogger = require('./hierarchy_logger').HierarchyLogger; const DOMOTZ_LEVELS = require('../logging').DOMOTZ_LEVELS; var _tree = null; var lowLevelLogger = console; var oldConsole = null; function registry() { function getLogger(path) { if (path === undefined || path === null || path === '') { path = []; } else { path = String(path).split('.'); } return _getPath(path); } function setLevel(loggerName, newLevel) { if (DOMOTZ_LEVELS[newLevel] === undefined && newLevel !== null) { throw new Error('Unknown log level: ' + newLevel); } var logger = getLogger(loggerName); if (newLevel === null) { _getWriter().info("Resetting level of logger `%s` to parent's", String(loggerName)); } else { _getWriter().info("Changing level of logger `%s` from '%s' to '%s'", String(loggerName), logger.level(), newLevel); } logger.setLevel(newLevel); if (logger.isRoot() && oldConsole !== null) { replaceConsoleWithRootLogger(); } } function replaceConsoleWithWriter(logger) { if (oldConsole !== null) { throw new Error('`console` was already replaced'); } lowLevelLogger = logger; _reset(); replaceConsoleWithRootLogger(); } function replaceConsoleWithRootLogger() { var rootLogger = getLogger(''); _getWriter().info('Replacing console methods with methods from root logger, with level %s', rootLogger.level()); oldConsole = {}; for (var level in DOMOTZ_LEVELS) { if (DOMOTZ_LEVELS.hasOwnProperty(level)) { oldConsole[level] = console[level]; console[level] = rootLogger.level; } } } function getStructure() { return _describe(_tree); } function _describe(tree) { var ret = { $: tree.$.level(), }; for (var child in tree) { if (tree.hasOwnProperty(child) && child !== '$') { ret[child] = _describe(tree[child]); } } return ret; } function _getPath(path, index, subTree, parent) { if (index === undefined) { index = 0; } if (subTree === undefined) { subTree = _tree; } var currentLogger = subTree.$; if (currentLogger === undefined) { currentLogger = _buildLoggerInSubtree(path, index, parent, subTree); } if (index >= path.length) { return currentLogger; } else { var nextStep = path[index]; var nextTree = subTree[nextStep]; if (nextTree === undefined) { nextTree = subTree[nextStep] = {}; } index++; return _getPath(path, index, nextTree, currentLogger); } } function _getWriter() { return lowLevelLogger; } function _buildLoggerInSubtree(path, index, parent, subTree) { var name = path.slice(0, index).join('.'); subTree.$ = HierarchyLogger(lowLevelLogger, name, parent, subTree); return subTree.$; } return { getLogger: getLogger, setLevel: setLevel, replaceConsoleWithWriter: replaceConsoleWithWriter, getStructure: getStructure, }; } function _reset() { _tree = {}; _tree.$ = HierarchyLogger(lowLevelLogger, '', undefined, _tree); if (oldConsole !== null) { for (var level in DOMOTZ_LEVELS) { if (DOMOTZ_LEVELS.hasOwnProperty(level)) { console[level] = oldConsole.level; } } oldConsole = null; } } _reset(); module.exports = { registry: registry, // for testing purposes only _tree: function () { return _tree; }, _reset: _reset, };