Nodejs - How to use morgan with debug

6.1k Views Asked by At

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'));
2

There are 2 best solutions below

3
zurfyx On BEST ANSWER

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); } }}));
0
DevelDevil On

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.