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服务器(3):代码模块化
Dec 18 NodeJs
NodeJS学习笔记之Connect中间件模块(一)
Jan 27 NodeJs
nodejs中的fiber(纤程)库详解
Mar 24 NodeJs
Nodejs基于LRU算法实现的缓存处理操作示例
Mar 17 NodeJs
解析NodeJS异步I/O的实现
Apr 13 NodeJs
nodejs批量下载图片的实现方法
May 19 NodeJs
深入解析nodejs HTTP服务
Jul 25 NodeJs
nodejs 日志模块winston的使用方法
May 02 NodeJs
对mac下nodejs 更新到最新版本的最新方法(推荐)
May 17 NodeJs
nodejs微信开发之授权登录+获取用户信息
Mar 17 NodeJs
nodejs dgram模块广播+组播的实现示例
Nov 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
Ha0k 0.3 PHP 网页木马修改版
2009/10/11 PHP
PHP多线程类及用法实例
2014/12/03 PHP
php使用GD库创建图片缩略图的方法
2015/06/10 PHP
PHP中include/require/include_once/require_once使用心得
2016/08/28 PHP
YII框架中使用memcache的方法详解
2017/08/02 PHP
Mootools 1.2教程 Fx.Tween的使用
2009/09/15 Javascript
jQuery EasyUI API 中文文档 - ComboGrid 组合表格
2011/10/13 Javascript
Array栈方法和队列方法的特点说明
2014/01/24 Javascript
node.js中的fs.lchownSync方法使用说明
2014/12/16 Javascript
Javascript数组操作函数总结
2015/02/05 Javascript
深入学习JavaScript中的原型prototype
2015/08/13 Javascript
简单介绍JavaScript数据类型之隐式类型转换
2015/12/28 Javascript
jquery实现具有收缩功能的垂直导航菜单
2016/02/16 Javascript
Angularjs实现搜索关键字高亮显示效果
2017/01/17 Javascript
jQuery插件FusionCharts绘制的3D饼状图效果实例【附demo源码下载】
2017/03/03 Javascript
在vue项目中正确使用iconfont的方法
2018/09/28 Javascript
vue安装和使用scss及sass与scss的区别详解
2018/10/15 Javascript
Vue中Axios从远程/后台读取数据
2019/01/21 Javascript
vue将后台数据时间戳转换成日期格式
2019/07/31 Javascript
Vue 中可以定义组件模版的几种方式
2019/08/06 Javascript
JS代码触发事件代码实例
2020/01/02 Javascript
js判断浏览器的环境(pc端,移动端,还是微信浏览器)
2020/12/24 Javascript
CKEditor扩展插件:自动排版功能autoformat插件实现方法详解
2020/02/06 Javascript
node事件循环和process模块实例分析
2020/02/14 Javascript
Python的函数嵌套的使用方法
2014/01/24 Python
Python基础语言学习笔记总结(精华)
2017/11/14 Python
python实现生命游戏的示例代码(Game of Life)
2018/01/24 Python
对Python实现累加函数的方法详解
2019/01/23 Python
判断python对象是否可调用的三种方式及其区别详解
2019/01/31 Python
Python玩转Excel的读写改实例
2019/02/22 Python
数学系毕业生的自我评价
2014/01/10 职场文书
表彰大会策划方案
2014/05/13 职场文书
纪念九一八事变演讲稿:忘记意味着背叛
2014/09/14 职场文书
涪陵白鹤梁导游词
2015/02/09 职场文书
《秦兵马俑》教学反思
2016/02/24 职场文书
MySQL 数据类型选择原则
2021/05/27 MySQL