winston 日志模塊
在使用 nodejs winston 模塊中,加上相關(guān)的兩個(gè)模塊,事倍功半。
express-winston
是 express-winston 的 winston 的增加版, 是作為 express 的中間件來(lái)打印日志,不僅有請(qǐng)求頭信息,并且有響應(yīng)時(shí)間。
作為中間件, 為什么會(huì)有響應(yīng)時(shí)間呢? 因?yàn)?express-winston 改寫了 express 的 res.end 辦法, 是請(qǐng)求結(jié)束后再打的日志。
代碼片段
var end = res.end; res.end = function(chunk, encoding) { res.responseTime = (new Date) - req._startTime; res.end = end; res.end(chunk, encoding); ... }
express-winston 沒(méi)有修改或者擴(kuò)展 winston 的transport, 而 winston-daily-rotate-file 正是增強(qiáng)了 winston 的transport 辦法
winston-daily-rotate-file
winston-daily-rotate-file 是 winston 擴(kuò)展, 增加了 transport 的辦法,使 winston 有滾動(dòng)日志的能力。
結(jié)合使用
我們來(lái)一個(gè)需求: 如何讓 express-winston 打印日志的時(shí)候,也打印出接口 /api 的請(qǐng)求參數(shù)和響應(yīng)數(shù)據(jù)?
代碼如下
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) { // 只打印頁(yè)面請(qǐng)求信息 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) }
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com