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 express框架一个工程中同时使用ejs模版和jade模版
Dec 28 NodeJs
详解nodeJS之路径PATH模块
May 31 NodeJs
详解Nodejs之静态资源处理
Jun 05 NodeJs
Windows下使用Nodejs运行js的方法
Sep 02 NodeJs
nodejs 图解express+supervisor+ejs的用法(推荐)
Sep 08 NodeJs
详解使用PM2管理nodejs进程
Oct 24 NodeJs
Nodejs中crypto模块的安全知识讲解
Jan 03 NodeJs
nodejs基于express实现文件上传的方法
Mar 19 NodeJs
nodejs多版本管理总结
Apr 03 NodeJs
Nodejs中的require函数的具体使用方法
Apr 02 NodeJs
独立部署小程序基于nodejs的服务器过程详解
Jun 24 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
星际争霸, 教主第一视角, ZvT经典龙蛇演义
2020/03/02 星际争霸
PHP Streams(流)详细介绍及使用
2015/05/12 PHP
用PHP将Unicode 转化为UTF-8的实现方法(推荐)
2017/02/08 PHP
php防止sql注入的方法详解
2017/02/20 PHP
PHP设计模式之抽象工厂模式实例分析
2019/03/25 PHP
php实现QQ小程序发送模板消息功能
2019/09/18 PHP
飞鱼(shqlsl) javascript作品集
2006/12/16 Javascript
看了就知道什么是JSON
2007/12/09 Javascript
IE6下出现JavaScript未结束的字符串常量错误的解决方法
2010/11/21 Javascript
点击页面其它地方隐藏该div的两种思路
2013/11/18 Javascript
js清空表单数据的两种方式(遍历+reset)
2014/07/18 Javascript
jQuery中addClass()方法用法实例
2015/01/05 Javascript
jQuery中的pushStack实现原理和应用实例
2015/02/03 Javascript
JavaScript实现文本框中默认显示背景图片在获得焦点后消失的方法
2015/07/01 Javascript
JavaScript脚本库编写的方法
2015/12/09 Javascript
详解基于angular-cli配置代理解决跨域请求问题
2017/07/05 Javascript
使用canvas进行图像编辑的实例
2017/08/29 Javascript
分分钟学会vue中vuex的应用(入门教程)
2017/09/14 Javascript
详解node child_process模块学习笔记
2018/01/24 Javascript
layui 数据表格 根据值(1=业务,2=机构)显示中文名称示例
2019/10/26 Javascript
Python中使用logging模块代替print(logging简明指南)
2014/07/09 Python
批处理与python代码混合编程的方法
2016/05/19 Python
python 哈希表实现简单python字典代码实例
2019/09/27 Python
pandas中的数据去重处理的实现方法
2020/02/10 Python
python标准库OS模块函数列表与实例全解
2020/03/10 Python
英国最大的手表网站:The Watch Hut
2017/03/31 全球购物
Marlies Dekkers内衣法国官方网上商店:国际知名的荷兰内衣品牌
2019/03/18 全球购物
中东最大的在线宠物店:Dubai Pet Food
2020/06/11 全球购物
htmlentities() 和 htmlspecialchars()有什么区别
2015/07/01 面试题
工商技校毕业生自荐信
2013/11/15 职场文书
毕业生优秀推荐信
2013/11/26 职场文书
军训学生自我鉴定
2014/02/12 职场文书
优秀管理者获奖感言
2014/02/17 职场文书
优秀党员先进材料
2014/12/18 职场文书
毕业论文指导教师评语
2014/12/30 职场文书
质量整改通知单
2015/04/21 职场文书