将Node.js中的console.log()输出到文本文件中

37

我有另一个问题(上一个问题)。目前我正在开发一个Node.js项目,其中有很多console.log()函数。到目前为止,这个方法还可以,但我还希望所有输出到控制台的内容也能够被写入日志文件中。有谁能帮助我吗?

例如:

Console.log('The value of array position [5] is '+ array[5]);

在我的真实代码中可能会更复杂,但这应该可以给你一个概念。

谢谢,希望有所帮助。


3
请注意,以下是翻译的文本内容:https://blog.risingstack.com/node-js-logging-tutorial/https://github.com/winstonjs/winston - Michael LeVan
7个回答

75

只需像这样在您的终端中运行脚本...

node script-file.js > log-file.txt

这条命令告诉 shell 将 node script-file.js 命令的标准输出写入日志文件,而不是默认的打印到控制台。

这被称为重定向,非常强大。比如你想将所有错误信息写入一个单独的文件...

node script-file.js >log-file.txt 2>error-file.txt

现在所有的console.log都被写入到log-file.txt文件中,而所有的console.error都被写入到error-file.txt文件中。


5
注:两个大于号会将输出重定向并附加到文件末尾,而一个大于号会在重新启动脚本时清空/覆盖文件。例如:2>>error-file.txt。我使用两个大于号来防止在重新启动脚本时丢失输出。 - Skoempie
如何将其导航回控制台? - Angelzzz
1
@Angelzzz node script-file.js 2>&1 | tee log-file.txt - Charlie Martin
我该如何使用这种方式在文本文件中插入换行符? - Mark

31

我会使用现有的库,而不是重新发明轮子。我在 npm 上寻找了一个类似于 log4j 的库,并找到了 https://github.com/nomiddlename/log4js-node

如果您想将日志记录到控制台和文件中:

var log4js = require('log4js');
log4js.configure({
  appenders: [
    { type: 'console' },
    { type: 'file', filename: 'logs/cheese.log', category: 'cheese' }
  ]
});

现在您的代码可以使用以下方式创建新的记录器

var logger = log4js.getLogger('cheese'); 

并在你的代码中使用日志记录器

logger.warn('Cheese is quite smelly.');
logger.info('Cheese is Gouda.');
logger.debug('Cheese is not a food.');

这会记录所有控制台日志,而无需为您的特定模块添加自定义控制台日志吗? - Juan
还没有测试过,等我测试完了再告诉你。 - Limatuz
2
@Juan 不是的,你需要获取 var logger = log4js.getLogger('cheese'); 然后你就可以执行 logger.warn('Cheese is quite smelly.');, logger.info('Cheese is Gouda.'); 等操作。 - Antonio Val

19
const fs = require('fs');
const myConsole = new console.Console(fs.createWriteStream('./output.txt'));
myConsole.log('hello world');

这将创建一个输出文件,其中包含通过控制台中的console.log('hello world')触发的所有输出。

这是将console.log()输出转换为文本文件的最简单方法。


它记录了一个JSON的未定义。我尝试了JSON.stringify(),但仍然得到了未定义。 - Sarneet Kaur
嗨,Sarneet,以下代码对我来说没有任何问题。const fs = require("fs"); const out = { name: "test", id: 456 }; const myConsole = new console.Console(fs.createWriteStream("./output.json")); myConsole.log(out);它能够将 JSON 输出到一个输出文件中。 - Avinash Chandravansi
我无法更改我的投票。当我尝试使用不同的CSV文件时,这对我起作用了。 - Sarneet Kaur

12

您可以尝试覆盖内置的console.log以执行不同的操作。

var originalLog = console.log;

console.log = function(str){
  originalLog(str);
  // Your extra code
}

然而,这将把originalLog放在主范围内,因此您应尝试将其包装在函数中。这就是所谓的闭包,您可以在此处阅读更多相关信息。

(function(){
   var originalLog = console.log;

  console.log = function(str){
  originalLog(str);
  // Your extra code
})();

要写文件,请参见 stackoverflow 问题,并且为了比我展示的方法更好地覆盖console.log,请参见。将这两个答案结合起来,您将获得最佳解决方案。


6

@activedecay的回答似乎是正确的。然而,截至2018年4月30日,我在这个特定模型上遇到了一些问题(由于传递给.configure的对象结构,节点崩溃了,并且似乎在最新版本中不起作用)。尽管如此,由于nodejs调试消息,我已经成功地找到了一个更新的解决方案...

const myLoggers = require('log4js');

myLoggers.configure({
    appenders: { mylogger: { type:"file", filename: "path_to_file/filename" } },
    categories: { default: { appenders:["mylogger"], level:"ALL" } }
});
const logger = myLoggers.getLogger("default");

现在,如果您想将日志记录到该文件中,只需像activedecay所示的那样操作即可:
logger.warn('Cheese is quite smelly.');
logger.info('Cheese is Gouda.');
logger.debug('Cheese is not a food.');

然而,这不会将任何内容记录到控制台,由于我还没有想出如何在一个记录器中实现多个附加器,因此你仍然可以使用传统的 console.log();
顺便说一下:我知道这是一个有点老的主题,而且 OP 的问题已经解决了,但由于我也是为了相同的目的来到这里,所以我也会留下自己的经验,以帮助未来访问这个主题的任何人。

6
只需要编写自己的日志函数:
function log(message) {
   console.log(message);
   fs.writeFileSync(...);
}

然后将所有现有的对 console.log() 的调用替换为 log()


多么出色的想法,不需要使用winston或其他过度设计的臃肿库;我可能会使用无参数,并尝试在日志函数内检索它们。 - joedotnot

0

这里是文件记录的简单解决方案@grdon/logger

const logger = require('@grdon/logger')({
  defaultLogDirectory : __dirname + "/logs",
})
// ...
logger(someParams, 'logfile.txt')
logger(anotherParams, 'anotherLogFile.log')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接