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)
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。