How can I log any errors from ExpressJS apps into a file?
I know I can log a Slim framework easily with monolog:
$app->get('/tickets', function (Request $request, Response $response) {
$this->logger->addInfo("Something interesting happened");
$mapper = new Simon\TicketMapper($this->db);
$tickets = $mapper->getTickets();
$response->getBody()->write(var_export($tickets, true));
return $response;
});
In Express, I usually log the error to console for development:
Model.findOne(options, function(err, doc) {
var output = {};
if (err) {
console.log("Error retrieving doc: " + err);
}
But in my production server, I do need a helpful log file when the app goes wrong.
Any ideas?
In Express's app.js
, it has this:
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
});
}
// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});
But how do I turn the production's one on? Is it the same as monolog that I need?
winston is a popular library for logging.
You can transport all logs to one file or keep different files for error, debug and info logs.
Example:
var winston = require('winston');
var logger = new winston.Logger({
level: 'error',
transports: [
new (winston.transports.File)({ filename: 'error.log' })
]
});
In the code:
logger.log('error', 'test error message %s', 'my string');
You can also use winston daily rotate file with winston to rotate your log files based on size or date.