【问题标题】:Node.js console.log() in txt filetxt 文件中的 Node.js console.log()
【发布时间】:2017-05-05 02:15:56
【问题描述】:

我还有一个问题 (last question)。目前我正在开发一个 Node.js 项目,其中我有 许多 console.log() 功能。到目前为止,这一切正常,但我也希望写入控制台的所有内容写入日志文件。有人可以帮帮我吗?

例如:

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

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

非常感谢。

【问题讨论】:

标签: javascript node.js file console.log logfile


【解决方案1】:

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

var originalLog = console.log;

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    这被称为redirection,它非常强大。假设您想将所有错误写入单独的文件...

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

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

    【讨论】:

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

    我会使用库而不是重新发明轮子。我在 npm 上找了一个log4j-type 库,结果找到了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 不,你需要得到var logger = log4js.getLogger('cheese');,然后你可以做logger.warn('Cheese is quite smelly.');logger.info('Cheese is Gouda.'); 等。
    【解决方案4】:

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

    function log(message) {
       console.log(message);
       fs.writeFileSync(...);
    }
    

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

    【讨论】:

    • 真是一个绝妙的主意,不用塞满温斯顿或其他过度设计的臃肿;我可能不使用 args,并尝试在 log 函数中检索它们。
    【解决方案5】:

    @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");
    

    现在,如果您想登录到上述文件,您可以像 activedecay 向您展示的那样:

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

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

    PD:我知道这是一个有点旧的线程,并且 OP 的特定问题已经解决了,但是由于我是出于同样的目的来到这里的,所以我不妨留下我的经验,以帮助任何访问该线程的人未来

    【讨论】:

      【解决方案6】:
      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,const fs = require("fs"); const out = { name: "test", id: 456 }; const myConsole = new console.Console(fs.createWriteStream("./output.json")); myConsole.log(out); 上面的代码对我有用,没有任何问题。它能够在输出文件上输出 json。
      • 我无法更改我的投票。当我尝试使用不同的 CSV 时,这确实对我有用。
      【解决方案7】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-10-07
        • 2013-04-25
        • 1970-01-01
        • 2012-03-25
        • 1970-01-01
        • 2014-10-21
        • 1970-01-01
        相关资源
        最近更新 更多