欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

nodejs 日志模块winston的使用方法

程序员文章站 2022-07-06 12:09:03
winston 日志模块 在使用 nodejs winston 模块中,加上相关的两个模块,事倍功半。 express-winston 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)
}

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