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'));
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); } }}));
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.