nodejs 日志模块winston的使用方法
winston日志模块
在使用nodejswinston模块中,加上相关的两个模块,事倍功半。
- express-winston
- winston-daily-rotate-file
express-winston
是express-winston的winston的增加版,是作为express的中间件来打印日志,不仅有请求头信息,并且有响应时间。
作为中间件,为什么会有响应时间呢?因为express-winston改写了express的res.end办法,是请求结束后再打的日志。
代码片段
varend=res.end; res.end=function(chunk,encoding){ res.responseTime=(newDate)-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的请求参数和响应数据?
- 该日志中间件应该在调用链api后面,api/*业务处理之前。like:app.use('/api',apiRequestLogger,apiHandler)
- 要获取到响应数据,就要在业务处理完后send出来后才能捕获到,express所有的请求响应最后都是走res.send我们可以从这里入手捕获响应数据
代码如下
importwinstonfrom'winston' importexpressWinstonfrom'express-winston' import'winston-daily-rotate-file' importpathfrom'path' exportletDailyRotateFileTransport=(fileName)=>{ returnnew(winston.transports.DailyRotateFile)({ filename:path.join(process.env.LOGPATH,`${fileName}-%DATE%.log`), datePattern:'YYYY-MM-DD-HH', //maxSize:'20m', maxFiles:'7d', timestamp:()=>newDate().format('yyyy-MM-ddhh:mm:ss.S') }) } exportletpageRequestLogger=expressWinston.logger({ transports:[ DailyRotateFileTransport('page-request') ], meta:true,//optional:controlwhetheryouwanttologthemetadataabouttherequest(defaulttotrue) msg:'HTTP{{req.method}}{{req.url}}',//optional:customizethedefaultloggingmessage.E.g."{{res.statusCode}}{{req.method}}{{res.responseTime}}ms{{req.url}}" expressFormat:true,//UsethedefaultExpress/morganrequestformatting.Enablingthiswilloverrideanymsgiftrue.Willonlyoutputcolorswithcolorizesettotrue colorize:false,//Colorthetextandstatuscode,usingtheExpress/morgancolorpalette(text:gray,status:defaultgreen,3XXcyan,4XXyellow,5XXred). ignoreRoute:function(req,res){ //只打印页面请求信息 letnotPageRequest=false letignoreArr=['/api','.js','.css','.png','.jpg','.gif'] ignoreArr.forEach(item=>{ if(req.url.indexOf(item)>-1)notPageRequest=true }) returnnotPageRequest }//optional:allowstoskipsomelogmessagesbasedonrequestand/orresponse }) exportletapiRequestLogger=(req,res,next)=>{ letsend=res.send letcontent='' letquery=req.query||{} letbody=req.body||{} res.send=function(){ content=arguments[0] send.apply(res,arguments) } expressWinston.logger({ transports:[ DailyRotateFileTransport('api-request') ], meta:true,//optional:controlwhetheryouwanttologthemetadataabouttherequest(defaulttotrue) msg(){ return`HTTP${req.method}${req.url}query${JSON.stringify(query)}body${JSON.stringify(body)}resData${content}` }, colorize:true,//Colorthetextandstatuscode,usingtheExpress/morgancolorpalette(text:gray,status:defaultgreen,3XXcyan,4XXyellow,5XXred). ignoreRoute:function(req,res){ if(req.headers.self)returntrue returnfalse }//optional:allowstoskipsomelogmessagesbasedonrequestand/orresponse })(req,res,next) }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。