node从入门到放弃系列之(9)log4js日志管理

奉上代码: node服务demo代码=》koa2-server项目代码;vue前端demo代码=》 vue-client项目代码
如果git登不上可以换gitee=》koa2-server项目代码;vue前端demo代码=》 vue-client项目代码

日志输出

需要用到的依赖log4js
官方推荐的参看案例=》log4js-example
详细的介绍=》Node.js 之 log4js 完全讲解

log配置

详细js文件地址=》日志配置
日志格式设置在appenders对象里

appenders: {
    'rule-console': { type: 'console' },
    handleLogger: {
      type: 'dateFile',
      filename: handleLogPath,
      pattern: '-yyyy-MM-dd.log', // 文件名,每天一个日志文件
      alwaysIncludePattern: true,
      encoding: 'utf-8',
      maxLogSize: 10485760, // 日志文件大小最大1M,单位字节,超出后自动新增一个
      numBackups: 3,
      path: handlePath // 生成路径
    }
 },
 // 配置不用日志种类
 categories: {
 	handleLogger: { appenders: ['handleLogger'], level: 'all' },
 }

日志使用

详细js文件地址=》日志使用

const log4js = require('log4js');
const logsConfig = require('../config/logs.js');
// 加载配置文件
log4js.configure(logsConfig);
// 调用预先定义的日志名称
const resLogger = log4js.getLogger('resLogger');
const errorLogger = log4js.getLogger('errorLogger');
const handleLogger = log4js.getLogger('handleLogger');
const consoleLogger = log4js.getLogger();

// 格式化日志文本 加上日志头尾和换行方便查看 ==>  普通日志、请求日志、响应日志、操作日志、错误日志
const formatText = {
  info: function (info) {
    let logText = '';
    // 响应日志头信息
    logText += '\n' + '***************info log start ***************' + '\n';
    // 响应内容
    logText += 'info detail: ' + '\n' + JSON.stringify(info) + '\n';
    // 响应日志结束信息
    logText += '*************** info log end ***************' + '\n';
    return logText;
  },
  request: function (req, resTime) {
    let logText = '';
    const method = req.method;
    // 访问方法
    logText += 'request method: ' + method + '\n';
    // 请求原始地址
    logText += 'request originalUrl:  ' + req.originalUrl + '\n';
    // 客户端ip
    logText += 'request client ip:  ' + req.ip + '\n';
    // 开始时间
    let 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;
  },
  response: function (ctx, resTime) {
    let logText = '';
    // 响应日志开始
    logText += '\n' + '*************** response log start ***************' + '\n';
    // 添加请求日志
    logText += formatText.request(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;
  },
  handle: function (info) {
    let logText = '';
    // 响应日志开始
    logText += '\n' + '***************info log start ***************' + '\n';
    // 响应内容
    logText += 'handle info detail: ' + '\n' + JSON.stringify(info).replace(/\\n/g, '\n') + '\n';
    // 响应日志结束
    logText += '*************** info log end ***************' + '\n';
    return logText;
  },
  error: function (ctx, err, resTime) {
    let logText = '';
    // 错误信息开始
    logText += '\n' + '*************** error log start ***************' + '\n';
    // 添加请求日志
    logText += formatText.request(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;
  }
};

module.exports = {
  // 封装普通日志-未使用
  logInfo: function (info) {
    if (info) {
      consoleLogger.info(formatText.info(info));
    }
  },
  // 封装响应日志
  logResponse: function (ctx, resTime) {
    if (ctx) {
      resLogger.info(formatText.response(ctx, resTime));
    }
  },
  // 封装操作日志
  logHandle: function (res) {
    if (res) {
      handleLogger.info(formatText.handle(res));
    }
  },
  // 封装错误日志
  logError: function (ctx, error, resTime) {
    if (ctx && error) {
      errorLogger.error(formatText.error(ctx, error, resTime));
    }
  }
};

首先引用并使用配置,然后在formatText 定义输出日志的格式,最后封装日志。调用的时候只需要像调用公共方法一样就行了,比如:

const logsUtil = require('xxx'); // 引用日志文件
...
...
logsUtil.logError(ctx, err, ms); // 记录异常日志

这样每次项目跑起来就会生成当天的日志文件
在这里插入图片描述
日志文本
在这里插入图片描述

上一篇:node从入门到放弃系列之(8)koa2 swagger的使用
下一篇:node从入门到放弃系列之(10)图形验证功能

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值