轻量的记录格式化和输出组件

功能

  1. 格式化、带颜色地打印输出到控制台。
  2. 格式化并输出到文件。

优点

  1. 不用改动代码,直接替换console。
  2. 零依赖,直接引入代码。

代码

const util = require('util');

const levels = ['log', 'info', 'warn', 'error'];

const colorCodeMap = {
  red: 31,
  green: 32,
  yellow: 33,
  blue: 34,
  purple: 35,
  cyan: 36,
  gray: 37,
};

const levelColorMap = {
  info: 'green',
  warn: 'yellow',
  error: 'red',
};

function coloring(str, color) {
  const colorCode = colorCodeMap[color];
  return `\x1b[${colorCode}m${str}\x1b[0m`;
}

function getTimeString() {
  function pad(num, n) {
    num = ~~num;
    return Array((n - num.toString().length + 1)).join(0) + num;
  }
  const now = new Date();
  return `${pad(now.getHours(), 2)}:${pad(now.getMinutes(), 2)}:`
    + `${pad(now.getSeconds(), 2)}:${pad(now.getMilliseconds(), 3)}`;
}

module.exports = (options) => {
  options = options || { console: true };
  for (let level of levels) {
    global.console[level] = (...args) => {
      if (!options.console && !options.file) {
        return;
      }
      level = level === 'log' ? 'info' : level;
      const prefix = `[${getTimeString()}]`;
      const levelStr = `[${level.toUpperCase()}]`;
      const base = util.format.apply(null, args) + '\n';
      const color = levelColorMap[level];
      const output = coloring(prefix + levelStr + ' - ', color) + base;
      if (options.console) {
        process.stdout.write(output);
      }
      if (options.file) {
        require('fs').appendFile(options.file, prefix + levelStr + ' ' + base, 'utf-8', () => {});
      }
    };
  }
};

使用

require('./logger')({ file: 'output.log' }); // 输出到console和文件
require('./logger')(); // 只输出到console
require('./logger')({ console: false }); // 不输出(用于生产环境)

你可能感兴趣的:(轻量的记录格式化和输出组件)