2013-11-23 33 views
0

我想弄清楚如何使express.logger函數將其日誌寫入gzip文件,而不是未壓縮的文本。我嘗試下面的代碼:使用express.logger,但寫入gzipped日誌

var logarchive = zlib.createGzip(); 
var logfile = fs.createWriteStream('./logs/access.log.gz'); 
logarchive.pipe(logfile); 

app.use(express.logger({ 
    format: env.get("logformat", "short"), 
    stream: logarchive 
})); 

,但似乎只是設立一個非法的gzip壓縮文件報告了它的數據的184Mb,儘管它只是得到一個記錄操作過程中發送幾個字節。

什麼是正確的方式來連接這些東西?關於zlib和streams的Nodejs.org api文檔沒有給出關於如何通過zlib將數據發送到另一個寫入流的具體示例,並且記錄器僅將流作爲目標。

+0

烏姆並不zlib的需要知道該文件結束。你如何壓縮層出不窮的流? – user568109

+0

你告訴我?這是一個修辭性的問題,你實際上是指「你不能這樣做,因爲zlib無法處理無限期開放的寫入流」,以幫助縮小如何影響gzipped日誌,或者你不知道嗎? –

+0

是的,你壓縮有限的文件。自動化系統記錄器通常做的是旋轉文件然後壓縮它。您需要讀取整個文件進行壓縮。 – user568109

回答

0

我認爲你的代碼應該可以工作,但zlib在緩衝數據方面非常出色,所以在將日誌刷新到文件之前可能需要一些時間。

您可以定期手動刷新:

setInterval(function() { 
    logarchive.flush(); 
}, 1000); // flush once per second 
+0

這是一個神祕的事物,它以一個看似明顯的壓縮大小創建文件,但是報告了大量內容(在日誌記錄之後,它聲稱434B .gz包含4.3GB日誌文件) –

+0

@ Mike'Pomax'Kamermans it爲我工作([gist](https://gist.github.com/robertklep/43991b2bd1dc1ae49ccc)),雖然gzcat確實抱怨文件的意外結束(但無論如何顯示內容) – robertklep