How do I output Connect/Express's logger output to Winston? How do I output Connect/Express's logger output to Winston? express express

How do I output Connect/Express's logger output to Winston?


Here is what i did to solve this very issue. Basically use the stream option in the connect/express logger module to pipe the messages through to winston. I chose to use winston.info logging level, use whatever level makes sense for you.

var winston = require('winston');var express = require('express');var app = express.createServer();// enable web server logging; pipe those log messages through winstonvar winstonStream = {    write: function(message, encoding){        winston.info(message);    }};app.use(express.logger({stream:winstonStream}));// now do the rest of your express configuration...


I had the same problem, I looked into the internals of the logger module and pretty much replicated what is there, in this custom middleware (warning, coffeescript).

As a bonus, it logs data using metadata fields as well.

(req, res, next) ->  sock = req.socket  req._startTime = new Date  req._remoteAddress = sock.socket && sock.socket.remoteAddress || sock.remoteAddress;  _url = () -> req.originalUrl || req.url  _method = () -> req.method  _respTime = () -> String(Date.now() - req._startTime)  _status = () -> res.headerSent && res.statusCode || null  _remoteAddr = () -> req.ip || req._remoteAddress || (req.socket?.socket? && req.socket.socket.remoteAddress) || req.socket.remoteAddress  _usrAgent = () -> req.headers['user-agent']  logRequest = () ->    res.removeListener 'finish', logRequest    res.removeListener 'close', logRequest    winston.info "#{_method()} #{_url()} #{_status()} #{_remoteAddr()} #{_usrAgent()} #{_respTime()}",      http_access:        method: _method()        url: _url()        status: _status()        remote_address: _remoteAddr()        user_agent: _usrAgent()  res.on 'finish', logRequest  res.on 'close', logRequest  next()