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(一)--- Node.js简介及安装开发环境
May 20 NodeJs
Nodejs学习笔记之测试驱动
Apr 16 NodeJs
nodejs导出excel的方法
Jun 30 NodeJs
进阶之初探nodeJS
Jan 24 NodeJs
浅谈NodeJs之数据库异常处理
Oct 25 NodeJs
nodejs操作mongodb的增删改查功能实例
Nov 09 NodeJs
详解Nodejs mongoose
Jun 10 NodeJs
NodeJS如何实现同步的方法示例
Aug 24 NodeJs
NodeJS加密解密及node-rsa加密解密用法详解
Oct 12 NodeJs
Nodejs libuv运行原理详解
Aug 21 NodeJs
nodejs nedb 封装库与使用方法示例
Feb 06 NodeJs
分享node.js实现简单登录注册的具体代码
Apr 26 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
PHP5中MVC结构学习
2006/10/09 PHP
Youku 视频绝对地址获取的方法详解
2013/06/26 PHP
zf框架的registry(注册表)使用示例
2014/03/13 PHP
PHP实现找出链表中环的入口节点
2018/01/16 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
JavaScript中的作用域链和闭包
2012/06/30 Javascript
javascript 获取模态窗口的滚动位置代码
2013/08/06 Javascript
jquery数组之存放checkbox全选值示例代码
2013/12/20 Javascript
jquery查找tr td 示例模拟
2014/05/08 Javascript
JS显示下拉列表框内全部元素的方法
2015/03/31 Javascript
jQuery常用知识点总结以及平时封装常用函数
2016/02/23 Javascript
BootStrap 图标icon符号图标glyphicons不正常显示的快速解决办法
2016/12/08 Javascript
Bootstrap 中data-[*] 属性的整理
2018/03/13 Javascript
nodejs 日志模块winston的使用方法
2018/05/02 NodeJs
详解实现一个通用的“划词高亮”在线笔记功能
2019/04/23 Javascript
微信小程序导航栏跟随滑动效果的实现代码
2019/05/14 Javascript
layui问题之自动滚动二级iframe页面到指定位置的方法
2019/09/18 Javascript
Vue中使用Echarts仪表盘展示实时数据的实现
2020/11/01 Javascript
Python描述器descriptor详解
2015/02/03 Python
基于Python Shell获取hostname和fqdn释疑
2016/01/25 Python
python numpy函数中的linspace创建等差数列详解
2017/10/13 Python
Django中ORM表的创建和增删改查方法示例
2017/11/15 Python
python处理数据,存进hive表的方法
2018/07/04 Python
django之自定义软删除Model的方法
2019/08/14 Python
Pycharm连接gitlab实现过程图解
2020/09/01 Python
详解HTML5中表单验证的8种方法介绍
2016/12/19 HTML / CSS
canvas进阶之如何画出平滑的曲线
2018/10/15 HTML / CSS
英国轻奢珠宝品牌:Astley Clarke
2016/12/18 全球购物
迟到检讨书500字
2014/02/05 职场文书
四风存在的原因分析
2014/02/11 职场文书
实习单位推荐信
2015/03/27 职场文书
2015年医院药剂科工作总结
2015/05/04 职场文书
公司员工辞职信范文
2015/05/12 职场文书
初三英语教学反思
2016/02/15 职场文书
PostgreSQL 插入INSERT、删除DELETE、更新UPDATE、事务transaction
2022/04/12 PostgreSQL
Java获取字符串编码格式实现思路
2022/09/23 Java/Android