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打包工具整合到鼠标右键的方法
May 11 NodeJs
使用Nodejs开发微信公众号后台服务实例
Sep 03 NodeJs
nodejs命令行参数处理模块commander使用实例
Sep 17 NodeJs
nodejs中操作mysql数据库示例
Dec 20 NodeJs
Nodejs学习笔记之Global Objects全局对象
Jan 13 NodeJs
nodeJS删除文件方法示例
Dec 25 NodeJs
图片上传之FileAPI与NodeJs
Jan 24 NodeJs
nodejs开发——express路由与中间件
Mar 24 NodeJs
详解nodejs微信公众号开发——1.接入微信公众号
Apr 10 NodeJs
用nodejs实现json和jsonp服务的方法
Aug 25 NodeJs
windows如何把已安装的nodejs高版本降级为低版本(图文教程)
Dec 14 NodeJs
Nodejs实现微信分账的示例代码
Jan 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
PHP中对缓冲区的控制实现代码
2013/09/29 PHP
输入值/表单提交参数过滤有效防止sql注入的方法
2013/12/25 PHP
多个iframe自动调整大小的问题
2006/09/18 Javascript
jQuery源码分析之Event事件分析
2010/06/07 Javascript
jQuery 源码分析笔记(7) Queue
2011/06/19 Javascript
可简单避免的三个JS发布错误的详细介绍
2013/08/02 Javascript
常见表单重复提交问题整理及解决方法
2013/11/13 Javascript
使用javascript实现判断当前浏览器
2015/04/14 Javascript
高性能JavaScript DOM编程(1)
2015/08/11 Javascript
jQuery实现的多级下拉菜单效果代码
2015/08/24 Javascript
基于jquery实现全屏滚动效果
2015/11/26 Javascript
jQuery通过写入cookie实现更换网页背景的方法
2016/04/15 Javascript
jQuery 自定义下拉框(DropDown)附源码下载
2016/07/22 Javascript
validationEngine 表单验证插件使用实例代码
2017/06/15 Javascript
详解如何用webpack打包一个网站应用项目
2017/07/12 Javascript
JS解决IOS中拍照图片预览旋转90度BUG的问题
2017/09/13 Javascript
jQuery实现页码跳转式动态数据分页
2017/12/31 jQuery
vuejs2.0运用原生js实现简单拖拽元素功能
2020/08/21 Javascript
vue列表数据发生变化指令没有更新问题及解决方法
2020/01/16 Javascript
[59:08]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第一局
2016/02/27 DOTA
Python实现获取nginx服务器ip及流量统计信息功能示例
2018/05/18 Python
Python对切片命名的实现方法
2018/10/16 Python
Python Numpy库安装与基本操作示例
2019/01/08 Python
Python中的 is 和 == 以及字符串驻留机制详解
2019/06/28 Python
tensorboard显示空白的解决
2020/02/15 Python
python手写均值滤波
2020/02/19 Python
Django admin 实现search_fields精确查询实例
2020/03/30 Python
你应该知道的Python3.6、3.7、3.8新特性小结
2020/05/12 Python
浅析NumPy 切片和索引
2020/09/02 Python
大学生实习自我鉴定
2013/12/11 职场文书
2014年健康教育实施方案
2014/02/17 职场文书
幼儿园法制宣传日活动总结
2014/11/01 职场文书
2014年审计人员工作总结
2014/12/19 职场文书
关于考试抄袭的检讨书
2019/11/02 职场文书
【TED出品】天梯非主流开心游1700 划水骑士
2022/03/31 魔兽争霸
HTML页面点击按钮关闭页面的多种方式
2022/12/24 HTML / CSS