我创造了:
var access = fs.createWriteStream('/var/log/node/api.access.log', { flags: 'w' });
然后用管道输送:
process.stdout.pipe(access);
然后尝试:
console.log("test");
并且/var/log/node/api. access. log中没有显示任何内容。但是,这种方法是有效的:
process.stdout.pipe(access).write('test');
有人能解释一下我做错了什么吗?
6条答案
按热度按时间acruukt91#
我用以下方法解决了这个问题:
当然,如果愿意,您也可以将stdout和stderr分开。
我还强烈建议处理未捕获的异常:
这将涵盖以下情况:
fbcarpbf2#
checkout 普通
console
的父类console.Console
。然后,您可以使用
myConsole.log
、myConsole.error
、myConsole.dir
等直接写入文件。也可以按如下所示对
process.stdout.write
进行猴修补:根据将
stdout
记录到文件的动机,还有用于重写console._stdout
的其它选项。am46iovg3#
process.stdout
是可写的。pipe
是Readable
的方法(参见StreamAPI文档:https://nodejs.org/api/stream.html您可以在此处查看
process.stdout
的文档:www.example.comhttps://nodejs.org/api/process.html#process_process_stdout令人惊讶的是,你可以毫无错误地执行
process.stdout.pipe(...);
。但是我想这个调用什么也不做。除了返回一个绑定到stdout的新的可写流(或者它可能返回process.stdout
本身。文档中没有对此的规范)。如果要将stdout重定向到某个文件,可以使用多种解决方案:
node myfile.js > api.access.log
.process.stdout
(您可以对它做任何您想做的事情)g6baxovj4#
@user3173842上的回复我解决这个问题的方式如下:
您知道
process.stdout
在process.on('exit')
之后继续,因此fs.WriteStream
在process.stdout
之后结束,根据https://github.com/nodejs/node/issues/7606所以现在的问题是,如果开发人员希望让
fs.Writestream.write()
恢复正常功能,那么当fs.Writestream.end
被调用时,writestream将关闭。它可以工作,并且您使用once方法,因为
process.stdout
似乎在此时做了很多工作。这是一个好的实践吗?在这种情况下,您会这样做吗?或者您会怎么做?任何人都可以随时回复。falq053o5#
最初基于@ Anatol-user 3173842答案
但在我的例子中,我需要挂接stdout & stderr,并写入一个文件。
因此,对于那些除了写入文件之外还需要保持标准输出行为的人,请使用以下代码。
对于非错误:
对于错误:
下面是
CustomLogger
代码,其中我还按日期分隔日志文件:icomxhvb6#
下面是一个logger类的快速示例,它将
stdout
、stderr
和异常重定向到一个文件,同时仍然将所有内容写入控制台: