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批量修改文件编码格式
Jan 22 NodeJs
浅谈Nodejs观察者模式
Oct 13 NodeJs
Nodejs基于LRU算法实现的缓存处理操作示例
Mar 17 NodeJs
nodejs中向HTTP响应传送进程的输出
Mar 19 NodeJs
nodejs开发——express路由与中间件
Mar 24 NodeJs
nodejs multer实现文件上传与下载
May 10 NodeJs
配置nodejs环境的方法
May 13 NodeJs
浅析 NodeJs 的几种文件路径
Jun 07 NodeJs
NodeJS自定义模块写法(详解)
Jun 27 NodeJs
nodejs require js文件入口,在package.json中指定默认入口main方法
Oct 10 NodeJs
Nodejs 微信小程序消息推送的实现
Jan 20 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
德生S2000电路分析
2021/03/02 无线电
php源码加密 仿微盾PHP加密专家(PHPCodeLock)
2010/05/06 PHP
php多文件上传实现代码
2014/02/20 PHP
Laravel 5框架学习之路由、控制器和视图简介
2015/04/07 PHP
php图像处理类实例
2015/07/28 PHP
ThinkPHP实现递归无级分类――代码少
2015/07/29 PHP
php编程实现简单的网页版计算器功能示例
2017/04/26 PHP
Yaf框架封装的MySQL数据库操作示例
2019/03/06 PHP
php 比较获取两个数组相同和不同元素的例子(交集和差集)
2019/10/18 PHP
动态为事件添加js代码示例
2009/02/15 Javascript
javascript 写类方式之十
2009/07/05 Javascript
js实现同一个页面多个渐变效果的方法
2015/04/10 Javascript
原生js和jquery实现图片轮播淡入淡出效果
2015/04/23 Javascript
AngularJS中isolate scope的用法分析
2016/11/22 Javascript
vue-resourse将json数据输出实例
2017/03/08 Javascript
react router 4.0以上的路由应用详解
2017/09/21 Javascript
vue 双向数据绑定的实现学习之监听器的实现方法
2018/11/30 Javascript
Node.js一行代码实现静态文件服务器的方法步骤
2019/05/07 Javascript
在vue项目实现一个ctrl+f的搜索功能
2020/02/28 Javascript
原生JS实现贪吃蛇小游戏
2020/03/09 Javascript
深入理解Python中变量赋值的问题
2017/01/12 Python
Python命令行解析模块详解
2018/02/01 Python
Python实现登陆文件验证方法
2018/10/06 Python
python实现一行输入多个值和一行输出多个值的例子
2019/07/16 Python
window7下的python2.7版本和python3.5版本的opencv-python安装过程
2019/10/24 Python
查看keras的默认backend实现方式
2020/06/19 Python
深入解析HTML5的IndexedDB索引数据库
2015/09/14 HTML / CSS
Microsoft新加坡官方网站:购买微软最新软件和技术产品
2016/10/28 全球购物
您的时尚,您的生活方式:DTLR Villa
2019/12/25 全球购物
医院护士的求职信范文
2013/12/26 职场文书
半年思想汇报
2013/12/30 职场文书
2015年干部教育培训工作总结
2015/05/15 职场文书
辩论会主持词
2015/07/03 职场文书
Python图片检索之以图搜图
2021/05/31 Python
SpringCloud的JPA连接PostgreSql的教程
2021/06/26 Java/Android
纯CSS实现一个简单步骤条的示例代码
2022/07/15 HTML / CSS