Nodejs - How to use morgan with debug

2020-07-23 05:03发布

问题:

Morgan outputs requests directly to the console.

How can I redirect them to npm debug so that it follows the same format as the other stuff which is being logged?

My debug.js config looks like the following:

import debug from 'debug';

const LOG_PREFIX = 'api';

const info = debug(`${LOG_PREFIX}:info`);
const dev = debug(`${LOG_PREFIX}:dev`);
const error = debug(`${LOG_PREFIX}:error`);

export {
  info,
  dev,
  error,
};

And I currently log other stuff like:

import { info } from './debug';

info('App is up and running!');

My current morgan call is:

app.use(morgan('combined'));

回答1:

Morgan accepts an optional parameter which is the stream.

By default it points to process.stdout, the console.

Since what it does it to call stream.write, you can easily build a quick stream which redirects to your debug.

app.use(morgan('combined', { stream: { write: msg => info(msg) } }));

Generically (but still ES6), that would be:

import debug from 'debug';
const info = debug('info');
app.use(morgan('combined', { stream: { write: msg => info(msg) } }));

ES5:

var info = require('debug')('info');
app.use(morgan('combined', { stream: { write: function(msg) { info(msg); } }}));


回答2:

when using morgan ˋstreamˋ combined with ˋdebugˋ, it´s best to do:

app.use(morgan('combined', { stream: { write: msg => info(msg.trimEnd()) } }));

The reason: morgan add a new line at the end of the msg when calling the stream.write(...) function.