如何在项目中使用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 相关文章推荐
JS类定义原型方法的两种实现的区别评论很多
Sep 12 Javascript
JS 面向对象的5钟写法
Jul 31 Javascript
基于jquery实现后台左侧菜单点击上下滑动显示
Apr 11 Javascript
js中一个函数获取另一个函数返回值问题探讨
Nov 21 Javascript
jquery和ajax的关系详细介绍
Nov 29 Javascript
深入理解Javascript中this的作用域
Aug 12 Javascript
学习Bootstrap组件之下拉菜单
Jul 28 Javascript
JS敏感词过滤代码
Dec 23 Javascript
jquery实现多次上传同一张图片
Jan 09 Javascript
react-native 圆弧拖动进度条实现的示例代码
Apr 12 Javascript
Vue.set() this.$set()引发的视图更新思考及注意事项
Aug 30 Javascript
详解如何构建Promise队列实现异步函数顺序执行
Oct 23 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写的获取各搜索蜘蛛爬行记录代码
2012/08/21 PHP
php根据分类合并数组的方法实例详解
2013/11/06 PHP
php通过正则表达式记取数据来读取xml的方法
2015/03/09 PHP
php 实现一个字符串加密解密的函数实例代码
2016/11/01 PHP
php array_walk 对数组中的每个元素应用用户自定义函数详解
2016/11/18 PHP
JS 容错处理代码, 屏蔽错误信息
2021/03/09 Javascript
js获取url参数的使用扩展实例
2007/12/29 Javascript
获取URL地址中的文件名和参数的javascript代码
2009/09/02 Javascript
分享JavaScript获取网页关闭与取消关闭的事件
2013/12/13 Javascript
jQuery搜索同辈元素方法
2015/02/10 Javascript
jQuery实现弹出窗口中切换登录与注册表单
2015/06/05 Javascript
js判断手机端(Android手机还是iPhone手机)
2015/07/22 Javascript
easyui-combobox 实现简单的自动补全功能示例
2016/11/08 Javascript
利用JS实现页面删除并重新排序功能
2016/12/09 Javascript
Bootstrap的modal拖动效果
2016/12/25 Javascript
vue.js数据绑定的方法(单向、双向和一次性绑定)
2017/07/13 Javascript
layui 动态设置checbox 选中状态的例子
2019/09/02 Javascript
python中实现字符串翻转的方法
2018/07/11 Python
Python格式化输出字符串方法小结【%与format】
2018/10/29 Python
python后端接收前端回传的文件方法
2019/01/02 Python
Python 操作 ElasticSearch的完整代码
2019/08/04 Python
python3.8与pyinstaller冲突问题的快速解决方法
2020/01/16 Python
Python根据字典的值查询出对应的键的方法
2020/09/30 Python
Python3爬虫ChromeDriver的安装实例
2021/02/06 Python
8款使用 CSS3 实现超炫的 Loading(加载)的动画效果
2015/03/17 HTML / CSS
腾讯技术类校园招聘笔试试题
2014/05/06 面试题
毕业生机械建模求职信
2013/10/14 职场文书
天地会口号
2014/06/17 职场文书
理财计划书
2014/08/14 职场文书
校运动会广播稿300字
2014/10/07 职场文书
大学生操行评语大全
2014/12/31 职场文书
小学六一儿童节活动总结
2015/05/05 职场文书
遗失证明范文
2015/06/19 职场文书
公共场所卫生管理制度
2015/08/05 职场文书
Go 自定义package包设置与导入操作
2021/05/06 Golang
Redis特殊数据类型Geospatial地理空间
2022/06/01 Redis