logger.mjs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import chalk from 'chalk'
  2. import EventEmitter from 'node: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. export default {
  13. loggers: {},
  14. init () {
  15. const primaryLogger = new Logger()
  16. let ignoreNextLevels = false
  17. primaryLogger.ws = new EventEmitter()
  18. LEVELS.forEach(lvl => {
  19. primaryLogger[lvl] = (...args) => {
  20. primaryLogger.emit(lvl, ...args)
  21. }
  22. if (!ignoreNextLevels) {
  23. primaryLogger.on(lvl, (msg) => {
  24. let formatted = ''
  25. if (WIKI.config.logFormat === 'json') {
  26. formatted = JSON.stringify({
  27. timestamp: new Date().toISOString(),
  28. instance: WIKI.INSTANCE_ID,
  29. level: lvl,
  30. message: msg
  31. })
  32. } else {
  33. if (msg instanceof Error) {
  34. msg = msg.stack
  35. }
  36. formatted = `${new Date().toISOString()} ${chalk.dim('[' + WIKI.INSTANCE_ID + ']')} ${chalk[LEVELCOLORS[lvl]].bold(lvl)}: ${msg}`
  37. }
  38. console.log(formatted)
  39. primaryLogger.ws.emit('log', formatted)
  40. })
  41. }
  42. if (lvl === WIKI.config.logLevel) {
  43. ignoreNextLevels = true
  44. }
  45. })
  46. LEVELSIGNORED.forEach(lvl => {
  47. primaryLogger[lvl] = () => {}
  48. })
  49. return primaryLogger
  50. }
  51. }