nodejs 日志模块winston的使用方法

 更新时间:2018年05月02日 14:30:09   作者:combine  
本篇文章主要介绍了nodejs 日志模块winston的使用方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

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)
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • NestJS核心概念之Middleware中间件创建使用示例

    NestJS核心概念之Middleware中间件创建使用示例

    这篇文章主要为大家介绍了NestJS核心概念之Middleware中间件创建使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • node.js中实现kindEditor图片上传功能的方法教程

    node.js中实现kindEditor图片上传功能的方法教程

    最近在做一个类似于论坛的系统,帖子需要进行图文并茂的显示,所以用到了富文本编辑器:kindeditor,下面这篇文章主要给大家介绍了在node.js中实现kindEditor图片上传功能的方法教程,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-04-04
  • 从零开始学习Node.js系列教程六:EventEmitter发送和接收事件的方法示例

    从零开始学习Node.js系列教程六:EventEmitter发送和接收事件的方法示例

    这篇文章主要介绍了Node.js EventEmitter发送和接收事件的方法,结合实例形式分析了EventEmitter发送和接收事件的原理、实现方法与相关操作技巧,需要的朋友可以参考下
    2017-04-04
  • Windows下Node爬虫神器Puppeteer安装记

    Windows下Node爬虫神器Puppeteer安装记

    这篇文章主要介绍了Windows下Node爬虫神器Puppeteer安装记,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • node.js中的fs.writeFile方法使用说明

    node.js中的fs.writeFile方法使用说明

    这篇文章主要介绍了node.js中的fs.writeFile方法使用说明,本文介绍了fs.writeFile的方法说明、语法、接收参数、使用实例和实现源码,需要的朋友可以参考下
    2014-12-12
  • node制作一个视频帧长图生成器操作分享

    node制作一个视频帧长图生成器操作分享

    这篇文章主要介绍了node制作一个视频帧长图生成器操作分享,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • Node.js模块化原理与应用详细介绍

    Node.js模块化原理与应用详细介绍

    本篇文章我们将进入我们的模块化学习,node的模块化正是node的最大特点,能够帮住我们将繁琐的复杂代码变成一个个的小模块,便于引用
    2022-09-09
  • NodeJs中的VM模块详解

    NodeJs中的VM模块详解

    这篇文章主要介绍了NodeJs中的VM模块详解,本文讲解了什么是VM? 、VM模块的runInThisContext、runInThisContext方法等内容,需要的朋友可以参考下
    2015-05-05
  • 解决npm install命令一直失败的坑

    解决npm install命令一直失败的坑

    文章总结:执行npminstall命令失败,可能是由于代理问题,可以尝试更换代理、权限、VSCode版本或网络环境(如使用移动热点)来解决
    2024-12-12
  • 使用Node.js在深度学习中做图片预处理的方法

    使用Node.js在深度学习中做图片预处理的方法

    这篇文章主要介绍了使用Node.js在深度学习中做图片预处理的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09

最新评论