库地址
express-winston 为 express.js 应用程序的申请和谬误记录提供中间件。 它应用“白名单”从申请和(0.2.x 中新增的)响应对象中抉择属性。
要应用 express-winston,您须要将以下内容增加到您的应用程序中:
在 package.json 中:
{ "dependencies": { "...": "...", "winston": "^3.0.0", "express-winston": "^4.0.4", "...": "..." }}
server.js:
var winston = require('winston'), expressWinston = require('express-winston');
Request Logging
应用 expressWinston.logger(options) 创立一个中间件来记录您的 HTTP 申请。
var router = require('./my-express-router'); app.use(expressWinston.logger({ transports: [ new winston.transports.Console() ], format: winston.format.combine( winston.format.colorize(), winston.format.json() ), 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) { return false; } // optional: allows to skip some log messages based on request and/or response })); app.use(router); // notice how the router goes after the logger.
参数定义:
transports: [<WinstonTransport>], // list of all winston transports instances to use.
format: [<logform.Format>], // formatting desired for log output.winstonInstance: <WinstonLogger>, // a winston logger instance. If this is provided the transports and formats options are ignored.level: String or function(req, res) { return String; }, // log level to use, the default is "info". Assign a function to dynamically set the level based on request and response, or a string to statically set it always at that level. statusLevels must be false for this setting to be used.msg: String or function, // customize the default logging message. E.g. "{{res.statusCode}} {{req.method}} {{res.responseTime}}ms {{req.url}}", "HTTP {{req.method}} {{req.url}}" or function(req, res) { return `${res.statusCode} - ${req.method}`. Warning: while supported, returning mustache style interpolation from an options.msg function has performance and memory implications under load.expressFormat: Boolean, // Use the default Express/morgan request formatting. Enabling this will override any msg if true. Will only output colors when colorize set to truecolorize: Boolean, // Color the text and status code, using the Express/morgan color palette (text: gray, status: default green, 3XX cyan, 4XX yellow, 5XX red).meta: Boolean, // control whether you want to log the meta data about the request (default to true).baseMeta: Object, // default meta data to be added to log, this will be merged with the meta data.metaField: String, // if defined, the meta data will be added in this field instead of the meta root object. Defaults to 'meta'. Set to `null` to store metadata at the root of the log entry.requestField: [String] // the property of the metadata to store the request under (default 'req'). Set to null to exclude request from metadatastatusLevels: Boolean or Object, // different HTTP status codes caused log messages to be logged at different levels (info/warn/error), the default is false. Use an object to control the levels various status codes are logged at. Using an object for statusLevels overrides any setting of options.level.ignoreRoute: function (req, res) { return false; }, // A function to determine if logging is skipped, defaults to returning false. Called _before_ any later middleware.skip: function(req, res) { return false; }, // A function to determine if logging is skipped, defaults to returning false. Called _after_ response has already been sent.requestFilter: function (req, propName) { return req[propName]; }, // A function to filter/return request values, defaults to returning all values allowed by whitelist. If the function returns undefined, the key/value will not be included in the meta.responseFilter: function (res, propName) { return res[propName]; }, // A function to filter/return response values, defaults to returning all values allowed by whitelist. If the function returns undefined, the key/value will not be included in the meta.requestWhitelist: [String], // Array of request properties to log. Overrides global requestWhitelist for this instanceresponseWhitelist: [String], // Array of response properties to log. Overrides global responseWhitelist for this instancebodyWhitelist: [String], // Array of body properties to log. Overrides global bodyWhitelist for this instancebodyBlacklist: [String], // Array of body properties to omit from logs. Overrides global bodyBlacklist for this instanceignoredRoutes: [String], // Array of paths to ignore/skip logging. Overrides global ignoredRoutes for this instancedynamicMeta: function(req, res) { return [Object]; } // Extract additional meta data from request or response (typically req.user data if using passport). meta must be true for this function to be activatedheaderBlacklist: [String], // Array of headers to omit from logs. Applied after any previous filters.
一个残缺的例子:
var express = require('express'); var expressWinston = require('express-winston'); var winston = require('winston'); // for transports.Console var app = module.exports = express(); app.use(express.bodyParser()); app.use(express.methodOverride()); // Let's make our express `Router` first. var router = express.Router(); router.get('/error', function(req, res, next) { // here we cause an error in the pipeline so we see express-winston in action. return next(new Error("This is an error and it should be logged to the console")); }); router.get('/', function(req, res, next) { res.write('This is a normal request, it should be logged to the console too'); res.end(); }); // express-winston logger makes sense BEFORE the router app.use(expressWinston.logger({ transports: [ new winston.transports.Console() ], format: winston.format.combine( winston.format.colorize(), winston.format.json() ) })); // Now we can tell the app to use our routing code: app.use(router); // express-winston errorLogger makes sense AFTER the router. app.use(expressWinston.errorLogger({ transports: [ new winston.transports.Console() ], format: winston.format.combine( winston.format.colorize(), winston.format.json() ) })); // Optionally you can include your custom error handler after the logging. app.use(express.errorLogger({ dumpExceptions: true, showStack: true })); app.listen(3000, function(){ console.log("express-winston demo listening on port %d in %s mode", this.address().port, app.settings.env); });
拜访 /,能看到如下的日志:
{
"req": {
"httpVersion": "1.1","headers": { "host": "localhost:3000", "connection": "keep-alive", "accept": "*/*", "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/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": "HTTP GET /favicon.ico"
}
控制台打印的日志如下: