关于javascript:txt文件中的Node.js console.log()

Node.js console.log() in txt file

我还有一个问题(最后一个问题)。目前我正在处理一个node.js项目,在这个项目中我有许多console.log()函数。到目前为止,这还可以,但我还希望所有写入控制台的内容也写入日志文件。有人能帮我吗?

例如:

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

在我真正的代码中,它有点多,但这应该给你一个想法。

希望谢谢你。


只需在终端中这样运行脚本…

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

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

这被称为重定向,它非常强大。假设您想将所有错误写入一个单独的文件…

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

现在所有的console.log都写入log-file.txt,所有的console.error都写入error-file.txt


我会用图书馆而不是重新发明轮子。我在NPM上找了一个log4j类型的库,它找到了https://github.com/nomiddlename/log4js-node

如果要登录到控制台和文件:

1
2
3
4
5
6
7
var log4js = require('log4js');
log4js.configure({
  appenders: [
    { type: 'console' },
    { type: 'file', filename: 'logs/cheese.log', category: 'cheese' }
  ]
});

现在,您的代码可以使用

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

在代码中使用记录器

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


您可以尝试重写内置的console.log来做一些不同的事情。

1
2
3
4
5
6
var originalLog = console.log;

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

但是,这会将originalLog放在主作用域中,因此您应该尝试将其包装在一个函数中。这被称为一个闭包,您可以在这里阅读更多关于它们的信息。

1
2
3
4
5
6
7
(function(){
   var originalLog = console.log;

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

要编写文件,请参阅这个stackoverflow问题,要覆盖console.log甚至比我展示的更好,请参阅这个。把这两个答案结合起来,你会得到最好的解决方案。


@Activedecay的答案似乎是可行的。但是,到april 30th 2018时,我对特定的模型(由于传递给.configure的对象的结构导致节点崩溃,这在最新版本中似乎不起作用)。尽管如此,由于nodejs调试消息,我还是设法解决了一个更新的解决方案…

1
2
3
4
5
6
7
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告诉你的:

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

然而,这不会将任何东西记录到控制台,而且由于我还没有弄清楚如何在一个记录器中实现多个附加器,所以您仍然可以实现好的旧console.log();

我知道这是一条有点老旧的线,而且OP的特殊问题已经解决了,但是既然我来这里是为了同样的目的,我也可以留下我的经验,以便将来帮助任何访问这条线的人。


只需编写自己的日志函数:

1
2
3
4
function log(message) {
   console.log(message);
   fs.writeFileSync(...);
}

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