koa中 log4js使用


一、新建一個log4js.js配置文件

let path = require('path');

// 日志根目錄
let baseLogPath = path.resolve(__dirname, '../logs');

// 錯誤日志目錄
let errorPath = '/error';
// 錯誤日志文件名
let errorFileName = 'error';
// 錯誤日志輸出完整路徑
let errorLogPath = baseLogPath + errorPath + '/' + errorFileName;

// 請求日志目錄
let reqPath = '/request';
// 請求日志文件名
let reqFileName = 'request';
// 請求日志輸出完整路徑
let reqLogPath = baseLogPath + reqPath + '/' + reqFileName;

// 響應日志目錄
let responsePath = '/response';
// 響應日志文件名
let responseFileName = 'response';
// 響應日志輸出完整路徑
let responseLogPath = baseLogPath + responsePath + '/' + responseFileName;

module.exports = {
  // 日志格式等設置
  appenders:
    {
      console: {
        type: 'console'

      },
      errorLogger: {
        type: 'dateFile',
        filename: errorLogPath,
        pattern: '-yyyy-MM-dd-hh.log',
        alwaysIncludePattern: true,
        encoding: 'utf-8',
        maxLogSize: 1000,
        numBackups: 3,
        path: errorPath,
        layout: {
          type: 'basic'
        }
      },
      http: {
        type: 'dateFile',
        filename: reqLogPath,
        pattern: '-yyyy-MM-dd-hh.log',
        alwaysIncludePattern: true,
        encoding: 'utf-8',
        maxLogSize: 1000,
        numBackups: 3,
        path: reqPath,
        layout: {
          type: 'basic'// 'messagePassThrough'
        }
      },
      resLogger: {
        type: 'dateFile',
        filename: responseLogPath,
        pattern: '-yyyy-MM-dd-hh.log',
        alwaysIncludePattern: true,
        encoding: 'utf-8',
        maxLogSize: 1000,
        numBackups: 3,
        path: responsePath,
        layout: {
          type: 'basic'
        }
      }
    },
  // 供外部調用的名稱和對應設置定義
  categories: {
    default: {
      appenders: ['console'], level: 'all'
    },
    resLogger: {
      appenders: ['resLogger'], level: 'info'
    },
    errorLogger: {
      appenders: ['errorLogger'], level: 'error'
    },
    http: {
      appenders: ['http'], level: 'info'
    }
  },
  baseLogPath,
  replaceConsole: true
};

二、新建log4Util.js

var log4js = require('log4js');

var logConfig = require('../config/log4js');

// 加載配置文件
log4js.configure(logConfig);

var logUtil = {};
// 調用預先定義的日志名稱
var resLogger = log4js.getLogger('resLogger');
var reqLogger = log4js.getLogger('http');
var errorLogger = log4js.getLogger('errorLogger');
var consoleLogger = log4js.getLogger();

// 封裝錯誤日志
logUtil.logError = function (ctx, error, resTime) {
  if (ctx && error) {
    errorLogger.error(formatError(ctx, error, resTime));
  }
};

// 封裝請求日志
logUtil.reqLog = function (ctx, resTime) {
  if (ctx) {
    reqLogger.info(formatReqLog(ctx, resTime));
  }
};
// 封裝響應日志
logUtil.logResponse = function (ctx, resTime) {
  if (ctx) {
    resLogger.info(formatRes(ctx, resTime));
  }
};

logUtil.logInfo = function (info) {
  if (info) {
    consoleLogger.info(formatInfo(info));
  }
};

var formatInfo = function (info) {
  var logText = '';
  // 響應日志開始
  logText += '\n' + '***************info log start ***************' + '\n';

  // 響應內容
  logText += 'info detail: ' + '\n' + JSON.stringify(info) + '\n';

  // 響應日志結束
  logText += '*************** info log end ***************' + '\n';

  return logText;
};

// 格式化響應日志
var formatRes = function (ctx, resTime) {
  var logText = '';
  // 響應日志開始
  logText += '\n' + '*************** response log start ***************' + '\n';

  // 添加請求日志
  logText += formatReqLog(ctx.request, resTime);

  // 響應狀態碼
  logText += 'response status: ' + ctx.status + '\n';

  // 響應內容
  logText += 'response body: ' + '\n' + JSON.stringify(ctx.body) + '\n';

  // 響應日志結束
  logText += '*************** response log end ***************' + '\n';

  return logText;
};

// 格式化錯誤日志
var formatError = function (ctx, err, resTime) {
  var logText = '';

  // 錯誤信息開始
  logText += '\n' + '*************** error log start ***************' + '\n';

  // 添加請求日志
  logText += formatReqLog(ctx.request, resTime);

  // 錯誤名稱
  logText += 'err name: ' + err.name + '\n';
  // 錯誤信息
  logText += 'err message: ' + err.message + '\n';
  // 錯誤詳情
  logText += 'err stack: ' + err.stack + '\n';

  // 錯誤信息結束
  logText += '*************** error log end ***************' + '\n';

  return logText;
};

// 格式化請求日志
var formatReqLog = function (req, resTime) {
  var logText = '';

  var method = req.method;
  // 訪問方法
  logText += '\n' + 'request method: ' + method + '\n';

  // 請求原始地址
  logText += 'request originalUrl:  ' + req.originalUrl + '\n';

  // 客戶端ip
  logText += 'request client ip:  ' + req.ip + '\n';

  // 開始時間
  //   var startTime;
  // 請求參數
  if (method === 'GET') {
    logText += 'request query:  ' + JSON.stringify(req.query) + '\n';
    // startTime = req.query.requestStartTime;
  } else {
    logText += 'request body: ' + '\n' + JSON.stringify(req.body) + '\n';
    // startTime = req.body.requestStartTime;
  }
  // 服務器響應時間
  logText += 'response time: ' + resTime + '\n';

  return logText;
};

module.exports = () => {
  return async (ctx, next) => {
    ctx.logger = logUtil;
    ctx.logger.reqLog(ctx, 0);
    await next();
  };
};

 三、再app.js引入log4Util.js

// logger
app.use(async (ctx, next) => {
  const start = new Date();
  let ms = new Date() - start;
  await next();
  try {
    // 開始進入到下一個中間件
    if (ctx.status === 404) {
      ctx.throw(404);
    }
    ms = new Date() - start;
    // 記錄響應日志
    ctx.logger.logResponse(ctx, ms);
  } catch (error) {
    ms = new Date() - start;
    // 記錄異常日志
    ctx.logger.logError(ctx, error, ms);
  }
});

// routes
app.use(index.routes());
app.use(index.allowedMethods());

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM