2013-10-23 110 views
0

我正在將節點作爲Windows服務運行。該服務在啓動時崩潰,因此我實現了一個日誌記錄系統,以發現當應用程序被迫退出時消息不會寫入文件。我已經能夠用下面的代碼來重現問題:node.js不會在崩潰時刷新緩衝區

var fs = require('fs'); 

var logStream = fs.createWriteStream('./nx3.log'); 
logStream.end('Goodbye world'); 
process.exit(0); 

沒有寫入nx3.log因爲緩衝器不會刷新。我已經能夠通過使用fs.appendFileSync解決這個問題,但我寧願使用成熟的日誌記錄模塊,而不是自己滾動。

是否可以打開未緩衝的寫入流?或者以其他方式解決這個問題?

+1

您正在使用什麼記錄模塊_have_? – npe

+0

winston和bunyan –

回答

2

這裏的問題與緩衝區無關。 FS writeableStream異步執行寫操作。因此process.exit不等待logSteam.end執行寫入,而是立即退出。

你可以做什麼,是聽uncaughtException事件,並在那裏執行你的日誌記錄。如果爲此異常添加偵聽器,則不會發生默認操作(即打印堆棧跟蹤並退出)。

process.on('uncaughtException', function (err) { 
     logStream.end(err, function() { 
      // write has completed, now we can exit 
      process.exit(0); 
     }); 
    }); 
+0

有趣的是,我還沒有遇到uncaughtException。謝謝。 –