const bunyan = require('bunyan'); // will be replaced to browser-bunyan on browser by webpack const minimatch = require('minimatch'); const isBrowser = typeof window !== 'undefined'; const isProd = process.env.NODE_ENV === 'production'; let config = require('@root/config').logger; let stream = isProd ? require('./stream.prod') : require('./stream.dev'); // logger store let loggers = {}; // merge configuration from environment variables const envLevelMap = { INFO: 'info', DEBUG: 'debug', WARN: 'warn', TRACE: 'trace', ERROR: 'error', }; Object.keys(envLevelMap).forEach(envName => { // ['INFO', 'DEBUG', ...].forEach const envVars = process.env[envName]; // process.env.DEBUG should have a value like 'growi:routes:page,growi:models.page,...' if (envVars != null) { const level = envLevelMap[envName]; envVars.split(',').forEach(ns => { // ['growi:routes:page', 'growi:models.page', ...].forEach config[ns.trim()] = level; }); } }); /** * determine logger level * @param {string} name Logger name */ function determineLoggerLevel(name) { if (isBrowser && isProd) { 'error'; } let level = config.default; // retrieve configured level Object.keys(config).some(key => { // breakable forEach // test whether 'name' matches to 'key'(blob) if (minimatch(name, key)) { level = config[key]; return; // break if match } }); return level; } module.exports = (name) => { // create logger instance if absent if (loggers[name] == null) { loggers[name] = bunyan.createLogger({ name, stream, level: determineLoggerLevel(name), }); } return loggers[name]; };