nodejs 日志模块winston的使用方法


Posted in NodeJs onMay 02, 2018

winston 日志模块

在使用 nodejs winston 模块中,加上相关的两个模块,事倍功半。

  1. express-winston
  2. winston-daily-rotate-file

express-winston

是 express-winston 的 winston 的增加版, 是作为 express 的中间件来打印日志,不仅有请求头信息,并且有响应时间。
作为中间件, 为什么会有响应时间呢? 因为 express-winston 改写了 express 的 res.end 办法, 是请求结束后再打的日志。

代码片段

var end = res.end;
res.end = function(chunk, encoding) {
 res.responseTime = (new Date) - req._startTime;
 res.end = end;
 res.end(chunk, encoding);
 ...
 }

express-winston 没有修改或者扩展 winston 的transport, 而 winston-daily-rotate-file 正是增强了 winston 的transport 办法

winston-daily-rotate-file

winston-daily-rotate-file 是 winston 扩展, 增加了 transport 的办法,使 winston 有滚动日志的能力。

结合使用

我们来一个需求: 如何让 express-winston 打印日志的时候,也打印出接口 /api 的请求参数和响应数据?

  1. 该日志中间件应该在调用链 api 后面, api/* 业务处理之前。 like: app.use('/api', apiRequestLogger, apiHandler)
  2. 要获取到响应数据, 就要在业务处理完后 send 出来后才能捕获到,express 所有的请求响应最后都是走 res.send 我们可以从这里入手捕获响应数据

代码如下

import winston from 'winston'
import expressWinston from 'express-winston'
import 'winston-daily-rotate-file'
import path from 'path'

export let DailyRotateFileTransport = (fileName) => {
 return new (winston.transports.DailyRotateFile)({
 filename: path.join(process.env.LOGPATH, `${fileName}-%DATE%.log`),
 datePattern: 'YYYY-MM-DD-HH',
 // maxSize: '20m',
 maxFiles: '7d',
 timestamp: () => new Date().format('yyyy-MM-dd hh:mm:ss.S')
 })
}

export let pageRequestLogger = expressWinston.logger({
 transports: [
 DailyRotateFileTransport('page-request')
 ],
 meta: true, // optional: control whether you want to log the meta data about the request (default to true)
 msg: 'HTTP {{req.method}} {{req.url}}', // optional: customize the default logging message. E.g. "{{res.statusCode}} {{req.method}} {{res.responseTime}}ms {{req.url}}"
 expressFormat: true, // Use the default Express/morgan request formatting. Enabling this will override any msg if true. Will only output colors with colorize set to true
 colorize: false, // Color the text and status code, using the Express/morgan color palette (text: gray, status: default green, 3XX cyan, 4XX yellow, 5XX red).
 ignoreRoute: function (req, res) {
 // 只打印页面请求信息
 let notPageRequest = false
 let ignoreArr = ['/api', '.js', '.css', '.png', '.jpg', '.gif']
 ignoreArr.forEach(item => {
  if (req.url.indexOf(item) > -1) notPageRequest = true
 })
 return notPageRequest
 } // optional: allows to skip some log messages based on request and/or response
})

export let apiRequestLogger = (req, res, next) => {
 let send = res.send
 let content = ''
 let query = req.query || {}
 let body = req.body || {}
 res.send = function () {
 content = arguments[0]
 send.apply(res, arguments)
 }
 expressWinston.logger({
 transports: [
  DailyRotateFileTransport('api-request')
 ],
 meta: true, // optional: control whether you want to log the meta data about the request (default to true)
 msg () {
  return `HTTP ${req.method} ${req.url} query ${JSON.stringify(query)} body ${JSON.stringify(body)} resData ${content} `
 },
 colorize: true, // Color the text and status code, using the Express/morgan color palette (text: gray, status: default green, 3XX cyan, 4XX yellow, 5XX red).
 ignoreRoute: function (req, res) {
  if (req.headers.self) return true
  return false
 } // optional: allows to skip some log messages based on request and/or response
 })(req, res, next)
}

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

NodeJs 相关文章推荐
基于NodeJS的前后端分离的思考与实践(五)多终端适配
Sep 26 NodeJs
Nodejs实现的一个静态服务器实例
Dec 06 NodeJs
浅谈Nodejs观察者模式
Oct 13 NodeJs
nodejs 中模拟实现 emmiter 自定义事件
Feb 22 NodeJs
详解nodejs实现本地上传图片并预览功能(express4.0+)
Jun 28 NodeJs
windows系统下更新nodejs版本的方案
Nov 24 NodeJs
nodejs实现OAuth2.0授权服务认证
Dec 27 NodeJs
修改Nodejs内置的npm默认配置路径方法
May 13 NodeJs
Mac下通过brew安装指定版本的nodejs教程
May 17 NodeJs
监控Nodejs的性能实例代码
Jul 02 NodeJs
NodeJS实现一个聊天室功能
Nov 25 NodeJs
Nodejs实现WebSocket代码实例
May 19 NodeJs
详解redis在nodejs中的应用
May 02 #NodeJs
nodejs读取并去重excel文件
Apr 22 #NodeJs
nodeJS模块简单用法示例
Apr 21 #NodeJs
NodeJS安装图文教程
Apr 19 #NodeJs
关于Mac下安装nodejs、npm和cnpm的教程
Apr 11 #NodeJs
详解nodejs通过响应回写的方式渲染页面资源
Apr 07 #NodeJs
原生nodejs使用websocket代码分享
Apr 07 #NodeJs
You might like
phpinfo 系统查看参数函数代码
2009/06/05 PHP
php使用Cookie实现和用户会话的方法
2015/01/21 PHP
PHP结合jQuery.autocomplete插件实现输入自动完成提示的功能
2015/04/27 PHP
php实现的读取CSV文件函数示例
2017/02/07 PHP
javascript脚本调试方法小结
2008/11/24 Javascript
jQuery的实现原理的模拟代码 -4 重要的扩展函数 extend
2010/08/03 Javascript
javascript中数组中求最大值示例代码
2013/12/18 Javascript
jQuery背景插件backstretch使用指南
2015/04/21 Javascript
js+html5通过canvas指定开始和结束点绘制线条的方法
2015/06/05 Javascript
深入理解JavaScript中的箭头函数
2015/07/28 Javascript
jQuery事件对象总结
2016/10/17 Javascript
ES6新特性六:promise对象实例详解
2017/04/21 Javascript
微信小程序实现tab切换效果
2017/11/21 Javascript
Vue Element使用icon图标教程详解(第三方)
2018/02/07 Javascript
基于jquery实现左右上下移动效果
2018/05/02 jQuery
如何使用electron-builder及electron-updater给项目配置自动更新
2018/12/24 Javascript
新手快速入门JavaScript装饰者模式与AOP
2019/06/24 Javascript
[02:48]DOTA2英雄基础教程 拉席克
2013/12/12 DOTA
python写日志封装类实例
2015/06/28 Python
举例讲解Django中数据模型访问外键值的方法
2015/07/21 Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
2018/05/25 Python
python 读取txt,json和hdf5文件的实例
2018/06/05 Python
python3中os.path模块下常用的用法总结【推荐】
2018/09/16 Python
Python获取航线信息并且制作成图的讲解
2019/01/03 Python
python自定义函数def的应用详解
2020/06/03 Python
Python 执行矩阵与线性代数运算
2020/08/01 Python
Sephora丝芙兰泰国官方网站:国际知名化妆品购物
2017/11/15 全球购物
重新定义牛仔布,100美元以下:Warp + Weft
2018/07/25 全球购物
后勤工作职责
2013/12/22 职场文书
求职信的最佳写作思路
2014/02/01 职场文书
大学军训感言800字
2014/02/27 职场文书
乡镇党的群众路线教育实践活动总结报告
2014/10/30 职场文书
贷款承诺书
2015/01/20 职场文书
赵氏孤儿观后感
2015/06/09 职场文书
小学秋季运动会通讯稿
2015/11/25 职场文书
测量JavaScript函数的性能各种方式对比
2021/04/27 Javascript