2015-10-14 55 views
0

在Express中記錄所有HTTP響應的最佳方法是什麼?在Express中記錄所有HTTP響應

我能夠得到它工作的唯一方法是修補end事件的猴子。

app.use(function(req, res, next) { 
    var rEnd = res.end; 

    res.end = function(chunk, encoding, callback) { 
    console.log(chunk.toString('utf8'); 
    rEnd.apply(this, arguments); 
    }; 

    next(); 
}); 

我感興趣的是一個更優雅的解決方案,例如使用finish事件,但我無法訪問此背景下響應消息。

app.use(function(req, res, next) { 

    res.on('finish', function() { 
    // console.log(?); 
    }); 

    next(); 
}); 

回答

0

我已經使用了express-winston它提供了一個用於請求和錯誤記錄的中間件。

import express from 'express' 
import winston from 'winston' 
import expressWinston from 'express-winston' 
import routes from './routes' 

const app = express() 

// Log the whole request and response body 
expressWinston.requestWhitelist.push('body') 
expressWinston.responseWhitelist.push('body') 

// Logger makes sense before the router 
app.use(expressWinston.logger({ 
    transports: [ 
    new winston.transports.Console({ 
     json: true, 
     colorize: true 
    }) 
    ] 
})) 

// Now we can tell the app to use our routing code 
app.use(routes); 

// Error logger makes sense after the router 
app.use(expressWinston.errorLogger({ 
    transports: [ 
    new winston.transports.Console({ 
     json: true, 
     colorize: true 
    }) 
    ] 
})) 

app.listen(3000) 
0

有很多軟件包會記錄響應和請求。

最常見的是morgan,請查看。

大多數軟件包只是提供一箇中間件,它必須使用app.use方法添加到您的應用程序對象中。

+0

不可能登錄與摩根的HTTP參數 –

0

隨着「摩根」和「旋轉文件流」,你既可以記錄事務(請求和響應),並將其存儲在一個區間。

var express= require('express'); 
var router = express.Router(); 
//we get an instance of express 
var app = express(); 
var rfs = require('rotating-file-stream'); 
var morgan = require('morgan'); 
//log file rotation 
var logDirectory = path.join(__dirname, 'log') 
// ensure log directory exists 
fs.existsSync(logDirectory) || fs.mkdirSync(logDirectory) 
// create a rotating write stream 
var accessLogStream = rfs('access.log', { 
    interval: '1d', // rotate daily 
    path: logDirectory 
}); 
app.use(morgan('combined', {stream: accessLogStream}));