在nodejs中,生成直接stdout和stderr到日志文件不起作用

时间:2018-08-28 02:10:29

标签: javascript node.js

这是我的代码:

var spawn = require("child_process").spawn
var fs = require("fs")
var p = spawn("ls", ["prprpr"])
var log = fs.createWriteStream("/tmp/prpr.log")
p.stdout.pipe(log)
p.stderr.pipe(log)

当我cat /tmp/prpr.log时,它返回空,但是当我重定向到process.stdout和process.stderr时,它会正确输出错误

var spawn = require("child_process").spawn
var fs = require("fs")
var p = spawn("ls", ["prprpr"])
var log = fs.createWriteStream("/tmp/prpr.log")
p.stdout.pipe(process.stdout)
p.stderr.pipe(process.stderr)

如何将生成标准输出和标准错误生成到磁盘文件?

我的节点版本:

> roroco@roroco ~/Dropbox/js/ro-evernote $ node -v
v7.3.0

2 个答案:

答案 0 :(得分:0)

我找到了解决方法:

当我使用以下另一种方式重定向标准输出时:

var fs = require("fs")
let log = fs.createWriteStream("/tmp/prpr.log");
const child = require("child_process").spawn('ls', ["prprpr"], {stdio: [null, log, log]});

它将提高

TypeError: Incorrect value for stdio stream: WriteStream {

这就是我无法写入日志的原因

我在此answer中找到了解决方案,“打开”时WriteStream可以写

并使用以下代码将起作用:

var fs = require("fs")
let log = fs.createWriteStream("/tmp/prpr.log");
log.on("open", function () {
  const child = require("child_process").spawn('ls', ["prprpr"], {stdio: [null, log, log]});
})

答案 1 :(得分:0)

几乎直接来自文档:

const child_process = require("child_process");
const fs = require("fs");
const out = fs.openSync("./stdout.log", "a");
const err = fs.openSync("./stderr.log", "a");
const child = child_process.spawn("ls", ["-alc"], {
  stdio: [process.stdin, out, err]
});

您只需要将文件描述符传递给stdio(无需创建流)。 here有很多风格-特别注意detached和传递'ignore'的stdin会如何影响孩子如何在父进程中生存。

请记住,传递文件描述符是Node唯一的IPC方式之一。