index.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. const bunyan = require('bunyan'); // will be replaced to browser-bunyan on browser by webpack
  2. const minimatch = require('minimatch');
  3. const isBrowser = typeof window !== 'undefined';
  4. const isProd = process.env.NODE_ENV === 'production';
  5. let config = require('@root/config').logger;
  6. let stream = isProd ? require('./stream.prod') : require('./stream.dev');
  7. // logger store
  8. let loggers = {};
  9. // merge configuration from environment variables
  10. const envLevelMap = {
  11. INFO: 'info',
  12. DEBUG: 'debug',
  13. WARN: 'warn',
  14. TRACE: 'trace',
  15. ERROR: 'error',
  16. };
  17. Object.keys(envLevelMap).forEach(envName => { // ['INFO', 'DEBUG', ...].forEach
  18. const envVars = process.env[envName]; // process.env.DEBUG should have a value like 'growi:routes:page,growi:models.page,...'
  19. if (envVars != null) {
  20. const level = envLevelMap[envName];
  21. envVars.split(',').forEach(ns => { // ['growi:routes:page', 'growi:models.page', ...].forEach
  22. config[ns.trim()] = level;
  23. });
  24. }
  25. });
  26. /**
  27. * determine logger level
  28. * @param {string} name Logger name
  29. */
  30. function determineLoggerLevel(name) {
  31. if (isBrowser && isProd) {
  32. 'error';
  33. }
  34. let level = config.default;
  35. // retrieve configured level
  36. Object.keys(config).some(key => { // breakable forEach
  37. // test whether 'name' matches to 'key'(blob)
  38. if (minimatch(name, key)) {
  39. level = config[key];
  40. return; // break if match
  41. }
  42. });
  43. return level;
  44. }
  45. module.exports = (name) => {
  46. // create logger instance if absent
  47. if (loggers[name] == null) {
  48. loggers[name] = bunyan.createLogger({
  49. name,
  50. stream,
  51. level: determineLoggerLevel(name),
  52. });
  53. }
  54. return loggers[name];
  55. };