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()