logger.js 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. const chalk = require('chalk')
  2. const EventEmitter = require('events')
  3. const LEVELS = ['error', 'warn', 'info', 'debug']
  4. const LEVELSIGNORED = ['verbose', 'silly']
  5. const LEVELCOLORS = {
  6. error: 'red',
  7. warn: 'yellow',
  8. info: 'green',
  9. debug: 'cyan'
  10. }
  11. class Logger extends EventEmitter {}
  12. const primaryLogger = new Logger()
  13. let ignoreNextLevels = false
  14. primaryLogger.ws = new EventEmitter()
  15. LEVELS.forEach(lvl => {
  16. primaryLogger[lvl] = (...args) => {
  17. primaryLogger.emit(lvl, ...args)
  18. }
  19. if (!ignoreNextLevels) {
  20. primaryLogger.on(lvl, (msg) => {
  21. let formatted = ''
  22. if (WIKI.config.logFormat === 'json') {
  23. formatted = JSON.stringify({
  24. timestamp: new Date().toISOString(),
  25. instance: WIKI.INSTANCE_ID,
  26. level: lvl,
  27. message: msg
  28. })
  29. } else {
  30. if (msg instanceof Error) {
  31. msg = msg.stack
  32. }
  33. formatted = chalk`${new Date().toISOString()} {dim [${WIKI.INSTANCE_ID}]} {${LEVELCOLORS[lvl]}.bold ${lvl}}: ${msg}`
  34. }
  35. console.log(formatted)
  36. primaryLogger.ws.emit('log', formatted)
  37. })
  38. }
  39. if (lvl === WIKI.config.logLevel) {
  40. ignoreNextLevels = true
  41. }
  42. })
  43. LEVELSIGNORED.forEach(lvl => {
  44. primaryLogger[lvl] = () => {}
  45. })
  46. module.exports = {
  47. loggers: {},
  48. init () {
  49. return primaryLogger
  50. }
  51. }