2015-09-22 71 views
9

我創建:標準輸出重定向到文件的NodeJS

var access = fs.createWriteStream('/var/log/node/api.access.log', { flags: 'w' }); 

然後管道:

process.stdout.pipe(access); 

然後嘗試:

console.log("test"); 

並沒有什麼已經出現在/ var /日誌/節點/ api.access.log。然而,這種方式正在工作:

process.stdout.pipe(access).write('test'); 

有人可以解釋我在做什麼錯嗎?

+0

是的我真的很驚訝,你可以調用管道上的一個可寫的沒有錯誤,這是怎麼回事? –

回答

1

process.stdout是可寫的。 pipeReadable(CF StreamAPI文件的方法:https://nodejs.org/api/stream.html

你可以看到process.stdout這裏的文檔:https://nodejs.org/api/process.html#process_process_stdout

這是令人驚訝的是,你可以做process.stdout.pipe(...);沒有任何錯誤,但我想這調用只是什麼也不做。除了返回綁定到標準輸出一個新的可寫流(或者它返回process.stdout本身有沒有規範的文檔中。)

如果你想標準輸出重定向到一個文件,你有很多的解決方案:

  • 只需使用您的命令行即可。 Windows風格:node myfile.js > api.access.log
  • 用您自己的對象替換控制檯對象。你可以重寫控制檯方法。
  • 我不知道,但有可能用自己的流來代替process.stdout(你可以做任何你想要與此)
+0

謝謝。你的答案是有幫助的。現在我決定重寫console.log方法,但希望找到更具建設性的解決方案。 – Supervision

+0

是的,我真的很驚訝,你可以調用管道上的一個可寫的沒有錯誤,這是怎麼回事? –

+0

根據nodejs [官方文檔](https://nodejs.org/api/process.html#process_process_stdout)process.stdout是一個雙工流 – Alex

15

我解決了這個問題,通過以下方式:

var access = fs.createWriteStream('/var/log/node/api.access.log'); 
process.stdout.write = process.stderr.write = access.write.bind(access); 

當然,如果你願意,你也可以分開stdout和stderr。

我也強烈建議來處理未捕獲的異常:

process.on('uncaughtException', function(err) { 
    console.error((err && err.stack) ? err.stack : err); 
}); 

這將包括以下幾種情況:

  • process.stdout.write
  • process.stderr.write
  • console.log
  • console.dir
  • console.error
  • someStream.pipe(process。標準輸出);
  • throw new Error('Crash');
  • 扔'永遠不要這樣';
  • throw undefined;
+1

如果您覆蓋'process.stdout.write',您可以不再寫入控制檯。 – richardpringle

+0

是不是'uncaughtException'部分將重複相同的錯誤消息在記錄文件作爲stderr反正重定向到文件? – user36476

+0

@ user36476不,因爲節點只在uncaughtException事件沒有偵聽器時纔打印該消息。 – user3173842

0

結帳console.Console,正常console的父類。

var myLogFileStream = fs.createWriteStream(pathToMyLogFile); 

var myConsole = new console.Console(myLogFileStream, myLogFileStream); 

然後,您可以使用myConsole.logmyConsole.errormyConsole.dir等,並直接寫入到文件中。

monkey patchprocess.stdout.write可以如下:

var fn = process.stdout.write; 

function write() { 
    fn.apply(process.stdout, arguments); 
    myLogFileStream.write.apply(myLogFileStream, arguments); 
} 

process.stdout.write = write; 

還有用於取決於動機登錄的stdout到一個文件覆蓋console._stdout其他選項。

相關問題