winston-log-and-exit
v1.0.6
Published
Patch for assuring that winston log messages are written to file before exiting
Downloads
12,465
Maintainers
Readme
The Problem
Winston creates may execute logging callbacks before file streams have been flushed, and creates file streams asynchronously but executes the close methods synchronously, and as a result, the following messages may note be logged to file:
logger.info("This message may not be saved to file.",
function(){process.exit()})
and:
logger.info("This message probably won't be saved to file.")
logger.close()
process.exit()
The solution
winston-log-and-exit
is a patch which adds a log_and_exit()
(or
equivalently logAndExit()
) method to Winston, which can be used
with Winston's default logger like so:
var winston = require('winston');
require('winston-log-and-exit');
// add a file transport to winston's default logger
winston.add(winston.transports.File, { filename: 'somefile.log' });
winston.log_and_exit(/* log level */ "info" ,
/* log text */ "This message *will* be included in the log files." ,
/* exit code */ 0 )
winston.info("This message *might* be included in the log files.")
process.nextTick(winston.info("This message probably won't be included in the log files.")
setTimeout(winston.info("This message almost certianly won't be included in the log files."),100)
and with a user-instantiated logger like so:
var winston = require('winston');
require('winston-log-and-exit');
var logger = new (winston.Logger)({
transports: [
new (winston.transports.Console)(),
new (winston.transports.File)({ filename: 'somefile.log' })
]
});
logger.log_and_exit("info","This message *will* be included in the log files.",0)
logger.info("This message *might* be included in the log files.")
process.nextTick(logger.info("This message probably won't be included in the log files.")
setTimeout(logger.info("This message almost certianly won't be included in the log files."),100)
This can also be used to ensure that uncaught exceptions are logged:
require('winston-log-and-exit');
process.on('uncaughtException', function (err) {
// use `winston` or your own Logger instance as appropriate
winston.error("Uncaught Exception",err);
winston.log_and_exit("info","bye",1);
});
Note that the third argument may optionally be a callback which is
responsible for calling process.exit()
(and if it doesn't, your begging
for a memory leak).
winston.log_and_exit("info","bye",function(){
try{
DB.close();
winston.log("This message will NOT get saved to file!")
}finally{
process.exit(0);
}
});