From cea3dc97d1ecd5769bd504ea284307d9e72750d0 Mon Sep 17 00:00:00 2001 From: Gareth Jones Date: Thu, 24 Nov 2011 08:20:33 +1100 Subject: [PATCH] Changes to handle drain events not fired on write in linux & windows - should fix issue #44 --- lib/appenders/file.js | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/lib/appenders/file.js b/lib/appenders/file.js index 46263ba..6ea01ca 100644 --- a/lib/appenders/file.js +++ b/lib/appenders/file.js @@ -86,14 +86,15 @@ function fileAppender (file, layout, logSize, numBackups) { function openTheStream() { var stream = fs.createWriteStream(file, { flags: 'a', mode: 0644, encoding: 'utf8' }); stream.on("open", function() { - if (logEventBuffer.length > 0) { - writeToLog(logEventBuffer.shift()); - } + canWrite = true; + flushBuffer(); }); stream.on("error", function (err) { console.error("log4js.fileAppender - Writing to file %s, error happened ", file, err); }); stream.on("drain", function() { + canWrite = true; + flushBuffer(); if (logEventBuffer.length > 0) { writeToLog(logEventBuffer.shift()); } @@ -101,9 +102,15 @@ function fileAppender (file, layout, logSize, numBackups) { return stream; } + function flushBuffer() { + while (logEventBuffer.length > 0 && canWrite) { + writeToLog(logEventBuffer.shift()); + } + } var logEventBuffer = [] - , logFile = openTheStream(); + , canWrite = false + , logFile = openTheStream(); if (logSize > 0) { setupLogRolling(); @@ -111,6 +118,7 @@ function fileAppender (file, layout, logSize, numBackups) { //close the file on process exit. process.on('exit', function() { + flushBuffer(); logFile.end(); logFile.destroy(); }); @@ -119,7 +127,7 @@ function fileAppender (file, layout, logSize, numBackups) { var logMessage = layout(loggingEvent)+'\n'; //not entirely accurate, but it'll do. bytesWritten += logMessage.length; - logFile.write(logMessage, "utf8"); + canWrite = logFile.write(logMessage, "utf8"); if (bytesWritten >= logSize) { rollThatLog(); } @@ -127,6 +135,7 @@ function fileAppender (file, layout, logSize, numBackups) { return function(loggingEvent) { logEventBuffer.push(loggingEvent); + flushBuffer(); }; }