首頁  >  文章  >  web前端  >  如何使用nodejs日誌模組winston

如何使用nodejs日誌模組winston

php中世界最好的语言
php中世界最好的语言原創
2018-06-01 11:45:551417瀏覽

這次帶給大家如何使用nodejs日誌模組winston,使用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)
}
相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

推薦閱讀:

使用JS判斷字串中包含內容方法總結

JS HTML5實綁定滑鼠事件的粒子動畫

以上是如何使用nodejs日誌模組winston的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn