【问题标题】:Redirecting output to a log file using node.js使用 node.js 将输出重定向到日志文件
【发布时间】:2013-04-15 21:01:01
【问题描述】:

我有一个子进程,我在 node.js 中使用如下。我不想将输出重定向到控制台,而是将输出放在正在运行的机器上某个位置的日志文件中(并且应该适用于 windows 和 mac)。

下面的代码是我正在使用的,我想将文件输出到日志文件中。在这里需要做哪些改变?谢谢!

我的代码:

var spawn = require('child_process').spawn,
    ls    = spawn('ls', ['-lh', '/usr']);

ls.stdout.on('data', function (data) {
  console.log('stdout: ' + data);
});

ls.stderr.on('data', function (data) {
  console.log('stderr: ' + data);
});

ls.on('close', function (code) {
  console.log('child process exited with code ' + code);
});

【问题讨论】:

标签: node.js


【解决方案1】:

这是使用流记录到文件的示例。

var logStream = fs.createWriteStream('./logFile.log', {flags: 'a'});

var spawn = require('child_process').spawn,
    ls    = spawn('ls', ['-lh', '/usr']);

ls.stdout.pipe(logStream);
ls.stderr.pipe(logStream);

ls.on('close', function (code) {
  console.log('child process exited with code ' + code);
});

【讨论】:

  • createWriteStream 是日志文件的最佳选择。来自文档:“请注意,在同一个文件上多次使用 fs.write 而不等待回调是不安全的。对于这种情况,强烈建议使用 fs.createWriteStream。”
  • 使用几乎相同的代码,我有时会遇到一个异常,我试图在它关闭后写入流。文档说pipe 将在源流发出“结束”事件时关闭目标流。会不会是 stderr 在 stdout 完成发送所有数据之前关闭了一点点?
【解决方案2】:

最佳答案在 cmets 中,并在上一个问题中提到:stackoverflow.com/questions/2496710/nodejs-write-to-file

如下:

var fs = require('fs');
fs.writeFile("/tmp/test", "Hey there!", function(err) {
    if(err) {
        console.log(err);
    } else {
        console.log("The file was saved!");
    }
}); 

【讨论】:

  • 所以您的问题与child_process 并输出到日志文件没有太大关系,而是更多“如何在 Node.js 中写入文件”?
  • @robertklep 是的,很抱歉标题(使用 node.js 将输出重定向到日志文件)很清楚:(
【解决方案3】:

如果您使用forever 运行您的JS 脚本,那么您可以选择定义一个日志文件作为参数来处理您的所有console.log 消息。更不用说让你的 nodejs 应用程序永久运行的好处了。

或者试试这个:

sudo forever start myapp.js 2>&1 /home/someuser/myapp/myapp.log

【讨论】:

  • 重定向标准和错误输出只会在你启动它时记录永远的详细输出。您将永远无法捕获您的应用程序的日志..
【解决方案4】:

通过以下选项永久使用

永远启动 -o out.log -e err.log server.js

【讨论】:

    【解决方案5】:

    有两种方法可以实现,一种是使用

    let logConsoleStream = fs.createWriteStream('./logConsoleFile.log', {flags: 'a'});
    let logErrorStream = fs.createWriteStream('./logErrorFile.log', {flags: 'a'});
    

    并使用此重定向所有日志或错误

    ls.stdout.pipe(logConsoleStream );  // redirect stdout/logs only
    ls.stderr.pipe(logErrorStream );    // redirect error logs only
    

    通过分隔日志文件,您将拥有单独的错误日志和控制台日志文件 这与上面分享的generalhenry 完全相同

    在命令行的帮助下实现这一目标的第二种方法

    当你从命令行执行 node app 时

    node app/src/index.js
    

    您可以在此处指定要从该应用程序重定向日志和错误的位置

    使用命令行的流重定向命令共有三个

    `>`     It will redirect your only stdout or logs to the specified path
    `2>`    It will redirect your errors logs to the specified path
    `2>&1 ` It will redirect all your stdout and stderr to a single file
    

    示例:您将如何使用这些命令

    node app/src/index.js > ./logsOnly.txt
    node app/src/index.js 2> ./ErrorsOnly.txt
    node app/src/index.js 2>&1 ./consoleLogsAndErrors.txt
    

    我希望以后来的人会觉得这很有帮助

    如果我做错了方法,请告诉我这将对我和其他人有所帮助 谢谢

    【讨论】:

      猜你喜欢
      • 2016-10-07
      • 2019-03-20
      • 1970-01-01
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      相关资源
      最近更新 更多