当前位置: 首页 > 后端技术 > Node.js

nodejs日志模块winston的使用

时间:2023-04-03 17:12:37 Node.js

winston日志模块在nodejswinston模块的使用中,加上两个相关模块,事半功倍。express-winstonwinston-daily-rotate-fileexpress-winston是express-winston的winston的增强版,作为express中间件打印日志,不仅有请求头信息,还有响应时间。作为中间件,为什么会有响应时间?因为express-winston重写了express的res.end方法,是请求结束后打的log。代码片段varend=res.end;res.end=function(chunk,encoding){res.responseTime=(newDate)-req._startTime;res.end=结束;res.end(块,编码);...}express-winston并没有修改或扩展winston的transport,winston-daily-rotate-file只是对winston的transport方式进行了增强winston-daily-rotate-filewinston-daily-rotate-file是winston的扩展,添加transport方式让winston具备滚动日志的能力。结合使用来提出一个需求:如何让express-winston在打印日志的时候打印出接口/api的请求参数和响应数据?日志中间件应该在调用链api之后,api/*业务处理之前。like:app.use('/api',apiRequestLogger,apiHandler)获取响应数据,必须在业务处理完后抓取,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',时间戳:()=>newDate().format('yyyy-MM-ddhh:mm:ss.S')})}exportletpageRequestLogger=expressWinston.logger({transports:[DailyRotateFileTransport('page-request')],meta:true,//可选:控制是否要记录有关请求的元数据(默认为true)msg:'HTTP{{req.method}}{{req.url}}',//可选:自定义默认日志消息。例如"{{res.statusCode}}{{req.method}}{{res.responseTime}}ms{{req.url}}"expressFormat:true,//使用默认的Express/morgan请求格式。如果为true,启用此选项将覆盖任何消息。将仅输出颜色设置为true的颜色colorize:false,//给文本和状态码上色,使用Express/morgan调色板(文本:灰色,状态:默认绿色,3XX青色,4XX黄色,5XX红色)。ignoreRoute:function(req,res){//只打印页面请求信息letnotPageRequest=falseletignoreArr=['/api','.js','.css','.png','.jpg','.gif']ignoreArr.forEach(item=>{if(req.url.indexOf(item)>-1)notPageRequest=true})returnnotPageRequest}//可选:允许根据请求和/或响应跳过一些日志消息})exportletapiRequestLogger=(req,res,next)=>{letsend=res.sendletcontent=''letquery=req.query||{}letbody=req.body||{}res.send=function(){content=arguments[0]send.apply(res,参数)}expressWinston.logger({transports:[DailyRotateFileTransport('api-request')],meta:true,//可选:控制是否要记录有关请求的元数据(默认为true)msg(){return`HTTP${req.method}${req.url}query${JSON.stringify(query)}body${JSON.stringify(body)}resData${content}`},colorize:true,//为文本着色状态代码,使用Express/morgan调色板(文本:灰色,状态:默认绿色,3XX青色,4XX黄色,5XX红色)。ignoreRoute:function(req,res){if(req.headers.self)returntruereturnfalse}//可选:允许根据请求和/或响应跳过一些日志消息})(req,res,next)}