将stdoutredirect到文件nodejs
我创造了:
var access = fs.createWriteStream('/var/log/node/api.access.log', { flags: 'w' });
然后pipe道:
process.stdout.pipe(access);
然后尝试:
console.log("test");
并没有出现在/var/log/node/api.access.log。 但是,这种方式正在工作:
process.stdout.pipe(access).write('test');
有人可以解释我做错了什么?
我用下面的方法解决了这个问题:
var access = fs.createWriteStream('/var/log/node/api.access.log'); process.stdout.write = process.stderr.write = access.write.bind(access);
当然,如果你愿意的话,你也可以分开stdout和stderr。
我也强烈build议处理未捕获的exception:
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.stdout);
- 抛出新的错误('崩溃');
- 抛出“从不这样做”;
- 扔undefined;
process.stdout
是可写的。 pipe
是Readable
的方法(Cf StreamAPI文档: https ://nodejs.org/api/stream.html
你可以在这里看到process.stdout
的文档: https : //nodejs.org/api/process.html#process_process_stdout
令人惊讶的是,你可以做process.stdout.pipe(...);
没有任何错误。 但我想这个电话什么都不做。 除了返回绑定到stdout的新的Writablestream(或者返回process.stdout
本身,在文档中没有这个规范)。
如果你想把stdoutredirect到一个文件,你有很多解决scheme:
- 只需使用你的命令行来做到这一点。 Windows风格:
node myfile.js > api.access.log
。 - 用自己的对象replace控制台对象。 你可以重写控制台方法。
- 我不确定,但也许可以用你自己的stream代替
process.stdout
(你可以用这个来做任何你想做的事情)
Checkout console.Console
,普通console
的父类。
var myLogFileStream = fs.createWriteStream(pathToMyLogFile); var myConsole = new console.Console(myLogFileStream, myLogFileStream);
然后你可以使用myConsole.log
, myConsole.error
, myConsole.dir
等,直接写入你的文件。
你也可以像下面这样猴子补丁 process.stdout.write
:
var fn = process.stdout.write; function write() { fn.apply(process.stdout, arguments); myLogFileStream.write.apply(myLogFileStream, arguments); } process.stdout.write = write;
根据将stdout
logging到文件的动机,还有其他选项可以覆盖console._stdout
。