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
Nov 08 NodeJs
浅谈NodeJS中require路径问题
May 07 NodeJs
NodeJS和BootStrap分页效果的实现代码
Nov 07 NodeJs
详解nodejs微信公众号开发——5.素材管理接口
Apr 11 NodeJs
nodejs个人博客开发第一步 准备工作
Apr 12 NodeJs
详解nodejs的express如何自动生成项目框架
Jul 12 NodeJs
nodejs中art-template模板语法的引入及冲突解决方案
Nov 07 NodeJs
使用npm安装最新版本nodejs
Jan 18 NodeJs
Nodejs使用Mongodb存储与提供后端CRD服务详解
Sep 04 NodeJs
Nodejs文件上传、监听上传进度的代码
Mar 27 NodeJs
浅谈使用nodejs搭建web服务器的过程
Jul 20 NodeJs
分享五个Node.js开发的优秀实践 
Apr 07 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
利用curl 多线程 模拟 并发的详解
2013/06/14 PHP
php支付宝接口用法分析
2015/01/04 PHP
PHP ADODB实现事务处理功能示例
2018/05/25 PHP
PHP时间相关常用函数用法示例
2020/06/03 PHP
PHP获取真实IP及IP模拟方法解析
2020/11/24 PHP
Jquery 常用方法经典总结
2010/01/28 Javascript
让ie6也支持websocket采用flash封装实现
2013/02/18 Javascript
javascript页面渲染速度测试脚本分享
2014/04/15 Javascript
jQuery中ajax和post处理json的不同示例对比
2014/11/02 Javascript
MVC Ajax Helper或Jquery异步加载部分视图
2015/11/29 Javascript
jQuery继承extend用法详解
2016/10/10 Javascript
最常用的jQuery表单验证(简单)
2017/05/23 jQuery
javascript checkbox/radio onchange不能兼容ie8处理办法
2017/06/13 Javascript
JS 中LocalStorage和SessionStorage的使用
2017/08/17 Javascript
基于JavaScript实现表格滚动分页
2017/11/22 Javascript
JavaScript DOM元素常见操作详解【添加、删除、修改等】
2018/05/09 Javascript
Vue实现导航栏点击当前标签变色功能
2020/08/19 Javascript
jquery实现弹窗(系统提示框)效果
2019/12/10 jQuery
vue中defineProperty和Proxy的区别详解
2020/11/30 Vue.js
Python数据结构与算法之使用队列解决小猫钓鱼问题
2017/12/14 Python
一百多行python代码实现抢票助手
2018/09/25 Python
Python中最大递归深度值的探讨
2019/03/05 Python
python 数据提取及拆分的实现代码
2019/08/26 Python
python实现ip地址查询经纬度定位详解
2019/08/30 Python
python的命名规则知识点总结
2019/10/04 Python
Numpy之将矩阵拉成向量的实例
2019/11/30 Python
python对指定字符串逆序的6种方法(小结)
2020/04/02 Python
墨西哥运动服饰和鞋网上商店:Netshoes墨西哥
2016/07/28 全球购物
医疗保健专业人士购物网站:Scrubs & Beyond
2017/02/08 全球购物
Priority Pass机场贵宾室会籍计划:全球超过1200间机场贵宾室
2018/08/26 全球购物
五分钟演讲稿
2014/04/30 职场文书
软件项目开发计划书
2014/05/01 职场文书
2014国庆节演讲稿:祖国在我心中(400字)
2014/09/25 职场文书
个人合伙协议书范本
2014/10/14 职场文书
2015领导干部廉洁自律工作总结
2015/07/23 职场文书
Unity连接MySQL并读取表格数据的实现代码
2021/06/20 MySQL