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 sublime text 3安装与配置
Jun 19 NodeJs
初始Nodejs
Nov 08 NodeJs
Nodejs为什么选择javascript为载体语言
Jan 13 NodeJs
Nodejs学习笔记之NET模块
Jan 13 NodeJs
NodeJS Web应用监听sock文件实例
Feb 18 NodeJs
NodeJS配置HTTPS服务实例分享
Feb 19 NodeJs
mac下的nodejs环境安装的步骤
May 24 NodeJs
nodeJS实现路由功能实例代码
Jun 08 NodeJs
Nodejs 复制文件/文件夹的方法
Aug 24 NodeJs
NodeJS收发GET和POST请求的示例代码
Aug 25 NodeJs
Windows下使用Nodejs运行js的方法
Sep 02 NodeJs
nodejs的路径问题的解决
Jun 30 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
建立文件交换功能的脚本(三)
2006/10/09 PHP
PHP管理依赖(dependency)关系工具 Composer 安装与使用
2014/08/18 PHP
JS文本框默认值处理详解
2013/07/10 Javascript
EasyUi datagrid 实现表格分页
2015/02/10 Javascript
JS中多步骤多分步的StepJump组件实例详解
2016/04/01 Javascript
canvas压缩图片转换成base64格式输出文件流
2017/03/09 Javascript
nodejs入门教程三:调用内部和外部方法示例
2017/04/24 NodeJs
vue.js实现备忘录功能的方法
2017/07/10 Javascript
nodejs密码加密中生成随机数的实例代码
2017/07/17 NodeJs
JavaScript编程设计模式之观察者模式(Observer Pattern)实例详解
2017/10/25 Javascript
js断点调试经验分享
2017/12/08 Javascript
微信小程序获取复选框全选反选选中的值(实例代码)
2019/12/17 Javascript
JavaScript享元模式原理与用法实例详解
2020/03/09 Javascript
详解Node.JS模块 process
2020/08/31 Javascript
Python写的英文字符大小写转换代码示例
2015/03/06 Python
在Linux下调试Python代码的各种方法
2015/04/17 Python
回调函数的意义以及python实现实例
2017/06/20 Python
python中计算一个列表中连续相同的元素个数方法
2018/06/29 Python
详解Python中的内建函数,可迭代对象,迭代器
2019/04/29 Python
使用Python进行体育竞技分析(预测球队成绩)
2019/05/16 Python
python re.sub()替换正则的匹配内容方法
2019/07/22 Python
python selenium 执行完毕关闭chromedriver进程示例
2019/11/15 Python
Python读取excel文件中带公式的值的实现
2020/04/17 Python
Python正则表达式高级使用方法汇总
2020/06/18 Python
为什么python比较流行
2020/06/19 Python
Python类成员继承重写的实现
2020/09/16 Python
python简单实现插入排序实例代码
2020/12/16 Python
html5实现多图片预览上传及点击可拖拽控件
2018/03/15 HTML / CSS
详解canvas绘图时遇到的跨域问题
2018/03/22 HTML / CSS
九年级语文教学反思
2014/02/04 职场文书
年会主持词结束语
2014/03/27 职场文书
2014年行政人事工作总结
2014/12/09 职场文书
2015年出纳个人工作总结
2015/04/02 职场文书
婚庆主持词大全
2015/06/30 职场文书
创业计划书之美甲店
2019/09/20 职场文书
HTML中的表单Form实现居中效果
2021/05/25 HTML / CSS