Home Reference Source

js/util/createLogger.js

let inGroup = false
let disabled = false

const methodToColorMap = {
  debug: '#7f8c8d', // Gray
  log: '#3498db', // Blue
  warn: '#f39c12', // Yellow
  error: '#c0392b', // Red
  groupCollapsed: '#3498db', // Blue
  groupEnd: null // No colored prefix on groupEnd
}

/**
 * 뱃지와 함께 로그를 찍습니다.
 * @param {'debug'|'log'|'warn'|'error'|'groupCollapsed'|'groupEnd'} method 사용할 로그 함수의 이름
 * @param {string} src 로그를 찍는 주체.
 * @param  {...any} args 찍을 로그의 내용들.
 */
function log (method, src, ...args) {
  if (disabled) return

  // prefix 뱃지 만들기
  const prefixStyle = [
    `background: ${methodToColorMap[method]}`,
    'border-radius: 0.5em',
    'color: white',
    'font-weight: bold',
    'padding: 2px 0.5em'
  ]

  // group안에 있을때는 뱃지를 숨겨야 함
  const logPrefix = inGroup ? [] : [`%c${src}`, prefixStyle.join(';')]

  // 로그 찍기
  console[method](...logPrefix, ...args)

  if (method === 'groupCollapsed') {
    inGroup = true
  } else if (method === 'groupEnd') {
    inGroup = false
  }
}

export default function createLogger (src) {
  return {
    debug: (...args) => log('debug', src, ...args),
    log: (...args) => log('log', src, ...args),
    warn: (...args) => log('warn', src, ...args),
    error: (...args) => log('error', src, ...args),
    groupCollapsed: (...args) => log('groupCollapsed', src, ...args),
    groupEnd: (...args) => log('groupEnd', src, ...args)
  }
}

export function disableLog () {
  disabled = true
}