【问题标题】:How to get logs and write them to a file with Node.js?如何使用 Node.js 获取日志并将它们写入文件?
【发布时间】:2017-10-15 19:07:47
【问题描述】:

我正在使用 Node.js,我想创建一个函数来获取所有 控制台日志(使用 console.log(message))。 如何获取所有控制台日志并将它们写入文件(不是覆盖)?

【问题讨论】:

    标签: javascript node.js file logging


    【解决方案1】:

    对于 nodejs 库,npm repo 是您的朋友 - 您可以找到很多库并尝试最适合您需求的库。例如https://www.npmjs.com/package/log 搜索log 的第一个结果。

    您当然也可以在控制台中实现自己的钩子来执行此操作,方法是用您自己的写入您选择的文件的函数覆盖控制台函数,例如:

    var fs = require('fs');
    
    function myLog(file) {
      return function() {
        fs.appendFileSync(file || 'log.txt', arguments.join('\n'));
      }
    }
    
    console.log = myLog();
    console.warn = myLog();
    console.error = myLog('errorLog.txt');
    

    【讨论】:

    • 所以我会使用myLog() 而不是console.log()?另外,console.log 是日志,还是我只是覆盖了函数?
    • 我刚刚尝试使用该代码,但出现错误:` fs.appendFileSync(file | 'log.txt', arguments.join('\n'); ^ SyntaxError: missing ) after argument list` 箭头指向arguments.join函数的右括号
    • 错过了一个右括号 - 虽然它只是一个大致的方向......现在更新了
    • 现在我遇到了另一个错误:TypeError: arguments.join is not a function 编辑:是的,参数没有连接方法
    • 好的,所以我将参数设为数组以使其与 .join 一起使用,然后我尝试使用代码。但当然,另一个错误:return binding.writeBuffer(fd, buffer, offset, length, position); ^ Error: EBADF: bad file descriptor, write 编辑:这是一些代码:var fs = require('fs'); var args = Array.prototype.slice.call(arguments); function myLog(file) { return function() { fs.appendFileSync(file | 'log.txt', args.join('\n')); } } console.log = myLog('consoleLog.txt');
    【解决方案2】:

    logger.js

    var fs = require('fs'); 
    var log = [];
    
    //override default console.log behaviour
    console.log = function(d) {
        process.stdout.write(d + '\n');
        log.push(d); //intercept every log and keep the value
    };
    
    //log to file 
    function log(filePath, clb){
      clb = clb || function(){}; //optional callback
      fs.truncate(filePath, 0, function() {
        fs.writeFile(filePath, string, function (err) {
          clb(err)
        });
      });
    }
    
    module.exports = log;
    

    然后在您的代码中导入文件并在需要时调用该函数。

    var logger = require('./logger');
    logger.log('log.txt', function(err){
     if(err) 
       console.log(err);
     //else ok  
    });
    

    【讨论】:

    • 返回:Error: Cannot find module './logger'
    • 您必须将第一个代码块放在一个单独的 javascript 文件中。我使用 logger.js 作为名称(要求正在寻找该文件)。这就是您收到错误的原因。
    【解决方案3】:

    一种简单的方法是使用记录数据并写入文件系统的函数覆盖控制台上的 log 函数。

    大致思路如下:

    function attachFSLogger(filePath) {
      // remember the old log method
      const oldLog = console.log; // remove this line if you only want to log into the file
    
      // override console.log
      console.log = (...messages) => {
    
        // log the console message immediately as usual
        oldLog.apply(console, messages); // remove this line if you only want to log into the file
    
        // asynchronously append to the file log
        fs.appendFile(filePath, messages.join('\n'), (err) => {
          if (err) throw err;
        });
      }
    }
    
    attachFSLogger('./logs.txt');
    
    console.log('test'); // logs 'test' and also appends 'test' to logs.txt 
    

    如果您希望经常记录事情,使用流会更efficient

    function attachFSLogger(filePath) {
      // remember the old log method
      const oldLog = console.log; // remove this line if you only want to log into the file
    
      // create a write stream for the given file path
      const fsLog = fs.createWriteStream(filePath, {
        flags: 'a' // 'a' means appending
      })
    
      // override console.log
      console.log = (...messages) => {
    
        // log the console message immediately as usual
        oldLog.apply(console, messages); // remove this line if you only want to log into the file
    
        // stream message to the file log
        fsLog.write(messages.join('\n'));
      }
    }
    
    attachFSLogger('./logs.txt');
    
    console.log('test'); // logs 'test' and also appends 'test' to logs.txt 
    

    话虽如此,有很多图书馆可以为您做这样的事情,并且已经过彻底的测试。

    这是一对:

    【讨论】:

    • Error: EPERM: operation not permitted, open 'C:\Program Files\nodejs\logs.txt' at Error (native)这是我试的时候返回的
    • 这是权限问题。以管理员身份或在不受限制的文件夹中运行脚本。
    • 谢谢!但它不会写入新行...每次记录时如何换行?
    • 只需在消息前添加'\n'。如fsLog.write('\n' + messages.join('\n'))
    猜你喜欢
    • 2012-01-12
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    相关资源
    最近更新 更多