在txt文件中的Node.js console.log()

Lim*_*tuz 18 javascript file logfile node.js console.log

我有另一个问题(最后一个问题).目前我正在开发一个Node.js项目,在这个项目中我有很多 console.log()函数.到目前为止,这一切都运行正常,但我也希望写入控制台的所有内容都写在日志文件中.有人可以帮帮我吗?

例如:

Console.log('The value of array position [5] is '+ array[5]);
Run Code Online (Sandbox Code Playgroud)

在我的真实代码中它更多但这应该给你一个想法.

谢谢你.

Cha*_*tin 47

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

node script-file.js > log-file.txt
Run Code Online (Sandbox Code Playgroud)

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

这称为重定向,功能非常强大.假设您想将所有错误写入单独的文件...

node script-file.js >log-file.txt 2>error-file.txt
Run Code Online (Sandbox Code Playgroud)

现在所有人console.log都被写入log-file.txt并且所有人console.error都被写入error-file.txt

  • 注意:两个大于符号重定向并将输出附加到文件,而单个大于符号会在重新启动脚本时清空/覆盖文件.示例:`2 >> error-file.txt`.我重新启动脚本时使用两个大于号的符号来防止输出丢失. (3认同)

act*_*cay 16

我会使用库而不是重新发明轮子.我log4j在npm上找了一个类型的库,它提出了https://github.com/nomiddlename/log4js-node

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

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

现在你的代码可以创建一个新的记录器

var logger = log4js.getLogger('cheese'); 
Run Code Online (Sandbox Code Playgroud)

并在代码中使用记录器

logger.warn('Cheese is quite smelly.');
logger.info('Cheese is Gouda.');
logger.debug('Cheese is not a food.');
Run Code Online (Sandbox Code Playgroud)

  • @Juan no,你需要得到`var logger = log4js.getLogger('cheese');`然后你可以做`logger.warn('奶酪很臭.');`,`logger.info('奶酪是高达.'); `等 (2认同)

Max*_*Max 10

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

var originalLog = console.log;

console.log = function(str){
  originalLog(str);
  // Your extra code
}
Run Code Online (Sandbox Code Playgroud)

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

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

  console.log = function(str){
  originalLog(str);
  // Your extra code
})();
Run Code Online (Sandbox Code Playgroud)

要写入文件,请参阅stackoverflow 问题,并且要覆盖console.log比我展示的方式更好的方法,请参阅. 结合这两个答案将为您提供最佳解决方案。


小智 8

const fs = require('fs');
const myConsole = new console.Console(fs.createWriteStream('./output.txt'));
myConsole.log('hello world');
Run Code Online (Sandbox Code Playgroud)

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

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


J3S*_*TER 6

@activedecay 的答案似乎是要走的路。但是,截至april 30th 2018,我在使用该特定模型时遇到了麻烦(节点由于传递给 的对象结构而崩溃.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");
Run Code Online (Sandbox Code Playgroud)

现在,如果您想登录到所述文件,您可以像activedecay向您展示的那样进行操作

logger.warn('Cheese is quite smelly.');
logger.info('Cheese is Gouda.');
logger.debug('Cheese is not a food.');
Run Code Online (Sandbox Code Playgroud)

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

PD:我知道这是一个有点旧的线程,OP的特定问题已经解决了,但既然我是为了同样的目的来到这里,我不妨留下我的经验,以帮助将来访问此线程的任何人


Ste*_*ett 5

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

function log(message) {
   console.log(message);
   fs.writeFileSync(...);
}
Run Code Online (Sandbox Code Playgroud)

然后替换所有现有的呼叫console.log()log()