Bootstrap

log4js实现不同级别的日志输出至不同文件

log4js基本使用

安装log4js

npm install log4js

配置控制台输出和文件输出

const log4js = require('log4js')

log4js.configure({
  appenders: {
    consoleOut: {
      type: 'console', // 控制台输出
      layout: {
        type: 'colored', // 使用color模式让控制台输出分类更加鲜明
      },
    },
    fileOut: {
      type: 'file',
      filename: `${__dirname}/../../logs/logger`, // 要打入到文件的位置
      pattern: 'yyyy-MM-dd.log', // 使用正则将日志分按天或者月分为不同文件
      alwaysIncludePattern: true, // 当为 true 时,log 文件名会包含之前设置的 pattern 信息 (默认为 false,但是强烈建议开启)
    },
  },
  categories: {
    default: {
      appenders: ['consoleOut', 'fileOut'],
      // 通过环境变量设置不同的日志级别
      level: process.env.NODE_ENV === 'development' ? 'all' : 'info',
    },
  },
})

const logger = log4js.getLogger('default')

logger.debug('debug log')
logger.info('info log')
logger.warn('warn log')
logger.error('error log')
logger.fatal('fatal log')

结果:

在这里插入图片描述
在这里插入图片描述

log4js配置介绍

通过上边的示例,我们能看到配置中包含了 appender(输出位置)和 category(策略),下面分别介绍这两个的配置

appender(输出位置)

appenders: {
    consoleOut: {
      type: 'console',
      layout: {
        type: 'colored', // 使用color模式让控制台输出分类更加鲜明
      },
    },
    fileOut: {
      type: 'file', // 输出到文件
      filename: `${__dirname}/../../logs/logger`, // 输出位置
      pattern: 'yyyy-MM-dd.log', // 配置保存的规则,可以将日志按照不同规则分为不同文件
      alwaysIncludePattern: true, // 当为 true 时,log 文件名会包含之前设置的 pattern 信息 (默认为 false,但是强烈建议开启)
    },
    error: {
      type: 'file',
      filename: `${__dirname}/../../logs/error.log`,
      alwaysIncludePattern: true,
    },
  },
  • 每个对象名称(key)是对输出方式的一种定义,名称可以自定义,比如这里的‘consoleOut’和‘default’;

  • type 指的是日志输出方式,有控制台输出和文件输出,分别对应 ‘console’,‘file’;

  • layout 是log4js提供给用户定义输出内容的自定义功能,包括其中包括4个属性;

    • messagePassThrough:仅仅输出日志的内容;
    • basic:在日志的内容前面会加上时间、日志的级别和类别,通常日志的默认 layout;
    • colored/coloured:在 basic 的基础上给日志加上颜色,appender Console 默认使用的就是这个 layout;
    • pattern:这是一种特殊类型,可以通过它来定义任何你想要的格式。
  • filename, type为file时规定的输出日志文件位置及名称;

  • pattern 对输出文件名称的定义,可以按照示例中将日志文件按照日期来划分;

  • alwaysIncludePattern 配合pattern使用,让文件名称保函pattern内容;

categories(策略)

categories: {
   default: {
     appenders: ['consoleOut', 'fileOut'],
     // 通过环境变量设置不同的日志级别
     level: process.env.NODE_ENV === 'development' ? 'all' : 'info',
   },
}
  • 同样的,每个对象名称(key)是对策略的一种定义,如这里的‘default’;
  • appenders,数组,可以将appenders中定义的名称写到这里,也就说明使用当前策略的话,则采用你定义的这两种输出方式;
  • level, 输出日志的级别,具体级别参数如下图所示,向高级别包含,若level设置为info,则包含:info、warn、error、fatal、mark
    在这里插入图片描述

不同级别的日志输出至不同文件

若是需要将不同级别的日志输出到不同文件内,则首先我们需要配置不同的策略,并设置不同的级别,然后设置两个logger,并将两个logger整合到一起,这样外部使用就可以不用特意选择logger,这里我需要将日志从warn分为两种,代码如下:

封装logger.js

// logger.js

const log4js = require('log4js')

log4js.configure({
  appenders: {
    consoleOut: {
      type: 'console',
      layout: {
        type: 'colored',
      },
    },
    default: {
      type: 'file',
      filename: `${__dirname}/../../logs/logger`,
      pattern: 'yyyy-MM-dd.log',
      alwaysIncludePattern: true, // 当为 true 时,log 文件名会包含之前设置的 pattern 信息 (默认为 false,但是强烈建议开启)
    },
    error: {
      type: 'file',
      filename: `${__dirname}/../../logs/error.log`,
      alwaysIncludePattern: true,
    },
  },
  categories: {
    default: {
      appenders: ['consoleOut', 'default'],
      level: 'all',
    },
    error: {
      appenders: ['consoleOut', 'error'],
      level: 'warn',
    },
  },
})

const defaultLogger = log4js.getLogger('default') // 普通级别的logger,输出到控制台和日期分类的文件
const errorLogger = log4js.getLogger('error') // 错误信息的logger,输出到控制台和error.log中

module.exports = {
  // info及以下级别的日志采用default策略,使用call函数改变this指向,否则会导致logger内部this指向报错
  trace() {
    return defaultLogger.trace.call(defaultLogger, ...arguments)
  },
  debug() {
    return defaultLogger.debug.call(defaultLogger, ...arguments)
  },
  info() {
    return defaultLogger.info.call(defaultLogger, ...arguments)
  },

  // warn及以上的日志采用error策略
  warn() {
    errorLogger.warn.call(errorLogger, ...arguments)
  },
  error() {
    errorLogger.error.call(errorLogger, ...arguments)
  },
  fatal() {
    errorLogger.fatal.call(errorLogger, ...arguments)
  },
  mark() {
    errorLogger.mark.call(errorLogger, ...arguments)
  },
}

使用

// index.js

const logger = require('./src/utils/logger')

logger.trace('trace log')
logger.debug('debug log')
logger.info('info log')
logger.warn('warn log')
logger.error('error log')
logger.fatal('fatal log')
logger.mark('mark log')

结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
搞定,拿走不谢。

;