库地址express-winston为express.js应用提供请求和错误记录的中间件。它使用“白名单”从请求和(0.2.x中的新功能)响应对象中选择属性。要使用express-winston,您需要将以下内容添加到您的应用程序中:在package.json:{"dependencies":{"...":"...","winston":"^3.0.0","express-winston":"^4.0.4","...":"..."}}server.js:varwinston=require('winston'),expressWinston=require('express-winston');RequestLogging使用expressWinston.logger(options)创建一个中间件来记录你的HTTP请求。varrouter=require('./my-express-router');app.use(expressWinston.logger({transports:[newwinston.transports.Console()],format:winston.format.combine(winston.format.colorize(),winston.format.json()),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){returnfalse;}//可选:允许s根据请求和/或响应跳过一些日志消息}));应用程序使用(路由器);//注意路由器是如何跟在记录器之后的。参数定义:transports:[],//listofallwinstontransportsinstancestouse.format:[],//日志输出所需的格式.winstonInstance:,//一个winston记录器实例。如果提供,则忽略传输和格式选项。level:Stringorfunction(req,res){returnString;},//要使用的日志级别,默认为“信息”。分配一个函数以根据请求和响应动态设置级别,或分配一个字符串以将其始终静态设置在该级别。要使用此设置,statusLevels必须为false。msg:Stringorfunction,//自定义默认日志消息。例如。“{{res.statusCode}}{{req.method}}{{res.responseTime}}ms{{req.url}}”,“HTTP{{req.method}}{{req.url}}”或function(req,res){return`${res.statusCode}-${req.m方法}`。警告:虽然支持,但从options.msg函数返回小胡子样式插值在load.expressFormat下具有性能和内存影响:布尔值,//使用默认的Express/morgan请求格式。如果为真,启用此选项将覆盖任何消息。仅在colorize设置为truecolorize时输出颜色:Boolean,//使用Express/morgan调色板为文本和状态代码着色(文本:灰色,状态:默认绿色,3XX青色,4XX黄色,5XX红色)。meta:Boolean,//控制是否要记录有关请求的元数据(默认为true)。baseMeta:Object,//要添加到日志的默认元数据,这将与元数据合并。metaField:String,//如果已定义,元数据将被添加到该字段中,而不是元根对象。默认为“元”。设置为`null`以将元数据存储在日志条目的根目录中。requestField:[String]//元数据的属性以将请求存储在(de错误'req')。设置为null以从元数据中排除请求statusLevels:Boolean或Object,//不同的HTTP状态代码导致日志消息记录在不同级别(信息/警告/错误),默认为false。使用对象来控制记录各种状态代码的级别。为statusLevels使用对象会覆盖options.level.ignoreRoute的任何设置:function(req,res){returnfalse;},//判断是否跳过日志的函数,默认返回false。_before_任何以后的middleware.skip:function(req,res){returnfalse;},//判断是否跳过日志的函数,默认返回false。调用_after_响应已经发送。requestFilter:function(req,propName){returnreq[propName];},//过滤/返回请求值的函数,默认返回所有白名单允许的值。如果函数返回未定义,则键/值将不会包含在meta.responseFilt中er:function(res,propName){返回res[propName];},//过滤/返回响应值的函数,默认返回所有白名单允许的值。如果函数返回未定义,则键/值将不会包含在meta.requestWhitelist中:[String],//要记录的请求属性数组。覆盖此实例的全局requestWhitelistresponseWhitelist:[String],//要记录的响应属性数组。覆盖此实例的全局responseWhitelistbodyWhitelist:[String],//要记录的正文属性数组。覆盖此实例的全局bodyWhitelistbodyBlacklist:[String],//要从日志中省略的主体属性数组。覆盖此实例的全局bodyBlacklistignoredRoutes:[String],//要忽略/跳过日志记录的路径数组。覆盖此实例的全局忽略路由dynamicMeta:function(req,res){return[Object];}//从请求或响应中提取额外的元数据(通常是req.userdataif使用护照)。meta必须为真才能激活此函数headerBlacklist:[String],//要从日志中省略的标头数组。在任何先前的过滤器之后应用。一个完整的例子:varexpress=require('express');varexpressWinston=require('express-winston');varwinston=require('winston');//对于transports.Consolevarapp=module.exports=express();app.use(express.bodyParser());app.use(express.methodOverride());//让我们先创建我们的express`Router`。varrouter=express.Router();router.get('/error',function(req,res,next){//在这里我们在管道中引起错误,所以我们看到express-winston正在运行。returnnext(newError("这是一个错误,它应该记录到控制台"));});router.get('/',function(req,res,next){res.write('这是一个正常的请求,应该也记录到控制台');res.end();});//express-winston记录器在rou之前是有意义的terapp.use(expressWinston.logger({transports:[newwinston.transports.Console()],format:winston.format.combine(winston.format.colorize(),winston.format.json())}));//现在我们可以告诉应用程序使用我们的路由代码:app.use(router);//express-winstonerrorLogger在路由器之后才有意义。app.use(expressWinston.errorLogger({transports:[newwinston.transports.Console()],format:winston.format.combine(winston.format.colorize(),winston.format.json())}));//您可以选择在日志记录后包含您的自定义错误处理程序。app.use(express.errorLogger({dumpExceptions:true,showStack:true}));app.listen(3000,function(){console.log("express-winstondemo以%s模式监听端口%d",this.address().port,app.settings.env);});访问/,可以看到如下的日志:{"req":{"httpVersion":"1.1","headers":{"host":"localhost:3000","connection":"keep-alive","accept":"*/*","user-agent":"Mozilla/5.0(Macintosh;IntelMacOSX10_7_4)AppleWebKit/536.11(KHTML,likeGecko)Chrome/20.0.1132.57Safari/536.11","accept-encoding":"gzip,deflate,sdch","accept-language":"en-US,en;q=0.8,es-419;q=0.6,es;q=0.4","accept-charset":"ISO-8859-1,utf-8;q=0.7,*;q=0.3","cookie":"connect.sid=nGspCCSzH1qxwNTWYAoexI23.seE%2B6Whmcwd"},"url":"/","method":"GET","originalUrl":"/","query":{}},"res":{"statusCode":200},"responseTime":12,"level":"info","message":"HTTPGET/favicon.ico"}控制台打印的日志如下: