loggerutil.ts 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import { createLogger, format, transports, Logger } from 'winston'
  2. import { SPLAT as SPLAT_Symbol } from 'triple-beam'
  3. import moment from 'moment'
  4. import { inspect } from 'util'
  5. // Workaround until fixed.
  6. // https://github.com/winstonjs/logform/issues/111
  7. const SPLAT = SPLAT_Symbol as unknown as string
  8. export class LoggerUtil {
  9. public static getLogger(label: string): Logger {
  10. return createLogger({
  11. format: format.combine(
  12. format.label(),
  13. format.colorize(),
  14. format.label({ label }),
  15. format.printf(info => {
  16. if(info[SPLAT]) {
  17. if(info[SPLAT].length === 1 && info[SPLAT][0] instanceof Error) {
  18. const err = info[SPLAT][0] as Error
  19. if(info.message.length > err.message.length && info.message.endsWith(err.message)) {
  20. info.message = info.message.substring(0, info.message.length-err.message.length)
  21. }
  22. } else if(info[SPLAT].length > 0) {
  23. // eslint-disable-next-line @typescript-eslint/no-explicit-any
  24. info.message += ' ' + info[SPLAT].map((it: any) => {
  25. if(typeof it === 'object' && it != null) {
  26. return inspect(it, false, null, true)
  27. }
  28. return it
  29. }).join(' ')
  30. }
  31. }
  32. return `[${moment().format('YYYY-MM-DD hh:mm:ss').trim()}] [${info.level}] [${info.label}]: ${info.message}${info.stack ? `\n${info.stack}` : ''}`
  33. })
  34. ),
  35. level: process.env.NODE_ENV === 'test' ? 'emerg' : 'debug',
  36. transports: [
  37. new transports.Console()
  38. ]
  39. })
  40. }
  41. }