如何在项目中使用log4.js的方法步骤


Posted in Javascript onJuly 16, 2019

pm2中自带的日志内容是不能满足日常的需求的,因此需要在项目中加上日志管理,这里研究了下log4的使用方法,效果挺好的,想要查看的都可以找到,记录下简单的使用步骤

log4的配合

// config.js

let path = require('path');

// 日志根目录
let baseLogPath = path.resolve(__dirname, '../../../logs');
// 请求日志目录
let reqPath = '/request';
// 请求日志文件名
let reqFileName = 'request';
// 请求日志输出完整路径
let reqLogPath = baseLogPath + reqPath + '/' + reqFileName;


// 响应日志目录
let resPath = '/response';
// 响应日志文件名
let resFileName = 'response';
// 响应日志输出完整路径
let resLogPath = baseLogPath + resPath + '/' + resFileName;

// 错误日志目录
let errPath = '/error';
// 错误日志文件名
let errFileName = 'error';
// 错误日志输出完整路径
let errLogPath = baseLogPath + errPath + '/' + errFileName;


module.exports = {
  appenders: {
    // 所有的日志
    'console': {type: 'console'},
    // 请求日志
    'reqLogger': {
      type: 'dateFile', // 日志类型
      filename: reqLogPath, // 输出文件名
      pattern: '-yyyy-MM-dd-hh.log', // 后缀
      alwaysIncludePattern: true, // 上面两个参数是否合并
      encoding: 'utf-8', // 编码格式
      maxLogSize: 1000, // 最大存储内容
    },
    // 响应日志
    'resLogger': {
      type: 'dateFile',
      filename: resLogPath,
      pattern: '-yyyy-MM-dd-hh.log',
      alwaysIncludePattern: true,
      encoding: 'utf-8',
      maxLogSize: 1000,
    },
    // 错误日志
    'errLogger': {
      type: 'dateFile',
      filename: errLogPath,
      pattern: '-yyyy-MM-dd-hh.log',
      alwaysIncludePattern: true,
      encoding: 'utf-8',
      maxLogSize: 1000,
    }
  },
  // 分类以及日志等级
  categories: {
    default: {
      appenders: ['console'],
      level: 'all'
    },
    reqLogger: {
      appenders: ['reqLogger'],
      level: 'info'
    },
    resLogger: {
      appenders: ['resLogger'],
      level: 'info'
    },
    errLogger: {
      appenders: ['errLogger'],
      level: 'error'
    }
  },
}

log4的日志封装

这里是把log4封装成一个中间件,在app.js中直接调用就可以了

// 先安装log4js

// log4.js

const log4Config = require('./config')
const log4js = require('log4js')

// 调用配置文件
log4js.configure(log4Config)


class CommonHandle {
  constructor(){}
  // 格式化请求日志
  static formatReqLog(ctx, time){
    let text = '------------request start------------'
    let method = ctx.method
    text += `request method: ${method} \n request url: ${ctx.originalUrl } \n`

    if(method = 'GET'){
      text += `request data: ${JSON.stringify(ctx.query)} \n`
    }else{
      text += `request data: ${JSON.stringify(ctx.body)} \n`
    }
    text += `ctx all: ${JSON.stringify(ctx)}`
    return text
  }
  // 格式化相应日志
  static formatResLog(ctx,time){
    let text = '------------response start------------'
    text += `response result: ${JSON.stringify(ctx.response.body)} \n`

    text += `response all: ${JSON.stringify(ctx)} \n`

    text += `response time: ${time} \n`
    return text
  }
  // 格式化错误日志
  static formatErrorLog(ctx,error,time){
    let text = '------------error start------------'
    text += this.formatResLog(ctx,time)
    text += `error content: ${JSON.stringify(error)}`

    return text
  }
}

class HandleLogger extends CommonHandle{
  constructor(){
    super()
  }

  // 请求日志
  static reqLogger(ctx){
    log4js.getLogger('reqLogger').info(this.formatReqLog(ctx))
  }

  // 相应日志
  static resLogger(ctx, time){
    log4js.getLogger('resLogger').info(this.formatResLog(ctx,time))
  }

  // 错误日志
  static errorLogger(ctx, error, time){
    log4js.getLogger('errLogger').info(this.formatErrorLog(ctx,error,time))
  }

}





module.exports = (options) => {
  return async (ctx,next) => {
    const startTime = new Date()
    let period;
    try{
      // 请求日志
      HandleLogger.reqLogger(ctx)
      await next()
      period = new Date() - startTime
      // 响应日志
      HandleLogger.resLogger(ctx,period)
    }catch(err){
      period = new Date() - startTime
      // 错误日志
      HandleLogger.errorLogger(ctx, err, period)
    }
  }
}

调用封装好的日志函数

这里直接以中间件的形式调用就可以了

// app.js

const Koa = require('koa')
const app = new Koa()
const LogJS = require('./common/log/log4')

// log4.js引入
app.use(LogJS())

最后部署上线之后就能直接在根目录下的logs文件夹下查看对应的日志内容。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery帮助之CSS尺寸(五)outerHeight、outerWidth
Nov 14 Javascript
JQuery Tab选项卡效果代码改进版
Apr 01 Javascript
jQuery与ExtJS之选择实例分析
Aug 19 Javascript
jQuery UI Dialog控件中的表单无法正常提交的解决方法
Dec 19 Javascript
更优雅的事件触发兼容
Oct 24 Javascript
Javasipt:操作radio标签详解
Dec 30 Javascript
Javascript核心读书有感之词法结构
Feb 01 Javascript
jQuery实现的图文高亮滚动切换特效实例
Aug 10 Javascript
JS实现无限级网页折叠菜单(类似树形菜单)效果代码
Sep 17 Javascript
bootstrap栅格系统示例代码分享
May 22 Javascript
小程序实现选择题选择效果
Nov 04 Javascript
js时间转换毫秒的实例代码
Aug 21 Javascript
JAVA面试题 static关键字详解
Jul 16 #Javascript
微信小程序实现下拉框功能
Jul 16 #Javascript
javascript中的this作用域详解
Jul 15 #Javascript
微信小程序页面上下滚动效果
Nov 18 #Javascript
node.js实现上传文件功能
Jul 15 #Javascript
js canvas实现5张图片合成一张图片
Jul 15 #Javascript
js使用文件流下载csv文件的实现方法
Jul 15 #Javascript
You might like
PHP如何透过ODBC来存取数据库
2006/10/09 PHP
解析PHP中$_FILES的使用以及注意事项
2013/07/05 PHP
PHP生成word文档的三种实现方式
2016/11/14 PHP
利用php生成验证码
2017/02/23 PHP
js实现字符串的16进制编码不加密
2014/04/25 Javascript
JavaScript 学习笔记之操作符(续)
2015/01/14 Javascript
jQuery实现带有洗牌效果的动画分页实例
2015/08/31 Javascript
JS随机洗牌算法之数组随机排序
2016/03/23 Javascript
BootStrap modal模态弹窗使用小结
2016/10/26 Javascript
jquery 多个radio的click事件实例
2016/12/03 Javascript
vue2.0实现导航菜单切换效果
2017/05/08 Javascript
微信小程序 websocket 实现SpringMVC+Spring+Mybatis
2017/08/04 Javascript
Vue数组更新及过滤排序功能
2017/08/10 Javascript
webpack vue项目开发环境局域网访问方法
2018/03/20 Javascript
vuejs+element UI table表格中实现禁用部分复选框的方法
2019/09/20 Javascript
JS实现图片懒加载(lazyload)过程详解
2020/04/02 Javascript
JS如何操作DOM基于表格动态展示数据
2020/10/15 Javascript
[31:01]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS Orenda
2014/05/23 DOTA
浅谈Python处理PDF的方法
2017/11/10 Python
在python中获取div的文本内容并和想定结果进行对比详解
2019/01/02 Python
Python-while 计算100以内奇数和的方法
2019/06/11 Python
使用Matplotlib 绘制精美的数学图形例子
2019/12/13 Python
下载与当前Chrome对应的chromedriver.exe(用于python+selenium)
2020/01/14 Python
python爬虫开发之urllib模块详细使用方法与实例全解
2020/03/09 Python
解决pycharm不能自动补全第三方库的函数和属性问题
2020/03/12 Python
Python键鼠操作自动化库PyAutoGUI简介(小结)
2020/05/17 Python
解析Tensorflow之MNIST的使用
2020/06/30 Python
通过实例了解Python异常处理机制底层实现
2020/07/23 Python
让你相见恨晚的十个Python骚操作
2020/11/18 Python
Python爬虫+tkinter界面实现历史天气查询的思路详解
2021/02/22 Python
css3实现文字扫光渐变动画效果的示例
2017/11/07 HTML / CSS
Vince官网:全球著名设计师品牌,休闲而优雅的服饰
2017/01/15 全球购物
《我不是最弱小的》教学反思
2014/02/23 职场文书
工程类专业自荐信范文
2014/03/09 职场文书
当幸福来敲门观后感
2015/06/01 职场文书
幽灵公主观后感
2015/06/09 职场文书