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极简入门教程(一):模块机制
Oct 25 NodeJs
nodejs实现获取某宝商品分类
May 28 NodeJs
搭建简单的nodejs http服务器详解
Mar 09 NodeJs
nodejs中使用HTTP分块响应和定时器示例代码
Mar 19 NodeJs
简单好用的nodejs 爬虫框架分享
Mar 26 NodeJs
Nodejs回调加超时限制两种实现方法
Jun 09 NodeJs
nodejs socket服务端和客户端简单通信功能
Sep 14 NodeJs
基于nodejs res.end和res.send的区别
May 14 NodeJs
详解NodeJS Https HSM双向认证实现
Mar 12 NodeJs
nodejs log4js 使用详解
May 31 NodeJs
Nodejs监控事件循环异常示例详解
Sep 22 NodeJs
nodejs脚本centos开机启动实操方法
Mar 04 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
服务器端解压缩zip的脚本
2006/12/22 PHP
如何利用php array_multisort函数 对数据库结果进行复杂排序
2013/06/08 PHP
解析PHP中ob_start()函数的用法
2013/06/24 PHP
ThinkPHP实现一键清除缓存方法
2014/06/26 PHP
PHP笛卡尔积实现原理及代码实例
2020/12/09 PHP
javascript 复杂的嵌套环境中输出单引号和双引号
2009/05/26 Javascript
xml文档转换工具,附图表例子(hta)
2010/11/17 Javascript
jQuery调取jSon数据并展示的方法
2015/01/29 Javascript
javascript实现点击单选按钮链接转向对应网址的方法
2015/08/12 Javascript
nodejs制作爬虫实现批量下载图片
2017/05/19 NodeJs
JavaScript实现精美个性导航栏筋斗云效果
2017/10/29 Javascript
Vue项目中使用Vux的安装过程
2018/05/01 Javascript
VUE2.0+ElementUI2.0表格el-table循环动态列渲染的写法详解
2018/11/30 Javascript
如何利用vue+vue-router+elementUI实现简易通讯录
2019/05/13 Javascript
详解vue中的父子传值双向绑定及数据更新问题
2019/06/13 Javascript
Vue关于组件化开发知识点详解
2020/05/13 Javascript
微信跳一跳自动运行python脚本
2018/01/08 Python
python使用opencv对图像mask处理的方法
2019/07/05 Python
解决python tkinter界面卡死的问题
2019/07/17 Python
pytorch之ImageFolder使用详解
2020/01/06 Python
python 实现多维数组(array)排序
2020/02/28 Python
Django QuerySet查询集原理及代码实例
2020/06/13 Python
Python 程序报错崩溃后如何倒回到崩溃的位置(推荐)
2020/06/23 Python
2020版Python学习路线图(附学习资料)
2020/09/15 Python
关于探究python中sys.argv时遇到的问题详解
2021/02/23 Python
HTML5新增的表单元素和属性实例解析
2014/07/07 HTML / CSS
Kipling凯浦林美国官网:世界著名时尚休闲包袋品牌
2016/08/24 全球购物
香港中原电器网上商店:Chung Yuen
2019/06/26 全球购物
幼儿园小班教学反思
2014/02/02 职场文书
中学生社会实践活动总结
2014/07/03 职场文书
2014年施工员工作总结
2014/11/18 职场文书
会计专业求职信范文
2015/03/19 职场文书
2016年教师节感恩寄语
2015/12/04 职场文书
2016关于学习党章的心得体会
2016/01/15 职场文书
基于Python实现股票收益率分析
2022/04/02 Python
深入理解pytorch库的dockerfile
2022/06/10 Python