Nodejs + log4js对日志进行管理调试

2,737 阅读2分钟

引言

日志的作用:

(1)、清除的记录用户请求的接口

(2)、请求接口时是否发生错误

(3)、错误日志,便于及时修复错误

(4)、利于复现错误,调试等

这里我们就用log4js来对日志进行处理

log4js配置

(1)、安装log4js

npm install log4js --save

(2)、配置 新建config/logConfig.js

const express = require('express')
const log4js = require('log4js') // 加载log4js模块
const path = require('path')
const app = express()

log4js.configure({
  appenders: {
    // 控制台输出
    console: { type: 'console' },
    // 全部日志文件
    app: { 
      type: 'file', 
      filename: path.join(__dirname, '../logs/app'),
      maxLogSize: 1024 * 500, //一个文件的大小,超出后会自动新生成一个文件
      backups: 2, // 备份的文件数量
      pattern: "_yyyy-MM-dd.log",
      alwaysIncludePattern: true,
    },
    // 错误日志文件
    errorFile: { 
      type: 'file',
      filename: path.join(__dirname, '../logs/error'),
      maxLogSize: 1024 * 500, // 一个文件的大小,超出后会自动新生成一个文件
      backups: 2, // 备份的文件数量
      pattern: "_yyyy-MM-dd.log",
      alwaysIncludePattern: true,
    }
  },
  categories: {
    // 默认日志,输出debug 及以上级别的日志
    default: { appenders: [ 
      'app', 
      'console' // 不向控制台输出 
    ], level: 'debug' },
    // 错误日志,输出error 及以上级别的日志
    error: { appenders: [ 'errorFile' ], level: 'error' },
  },
  replaceConsole: true,   // 替换console.log  
});

// 获取默认日志
const defaultLogger = log4js.getLogger()
// 获取错误级别日志
const errorLogger = log4js.getLogger('error')

// 日志代理,同时调用默认日志和错误日志
const loggerProxy = {};
const levels = log4js.levels.levels;
levels.forEach(level => {
    const curLevel = level.levelStr.toLowerCase();
    loggerProxy[curLevel] = (...params) => {
        defaultLogger[curLevel](...params);
        errorLogger[curLevel](...params);
    }
});

module.exports = loggerProxy

这里的配置文件注释已经非常明晰,就不多做解释,然后把我们项目中用console.log的地方替换一下

重新运行,项目根目录已经生成logs目录,并有了两个日志文件,打开看,日志记录非常清晰,什么时间请求,请求参数是什么

然后我们看看错误,/api/user/info接口需要传入id的,我们不传试试看,这里的id为空,就会执行utils.sendError()方法

if(!params.id){
  utils.sendError(res, '用户ID不能为空')
  return
}

utils.js里面的sendError方法实现如下:

sendError(res, message, code = 500){
  logger.error(typeof message, message)
  if(typeof message === 'string'){
    return res.status(500).send({
      code: code,
      message: message
    })
  }

  if(typeof message === 'object'){
    return res.status(500).send(message)
  }
}

日志记录错误,并且接口返回500错误或者自定义错误码,和错误message

结语

日志是我们日常开发项目中,必不可少的一部分,不管是开发还是生产环境都需要,所以大家都可以应用到自己的项目中去。

《前端玩转后台》