请问 node.js 怎么实现 console.log 同步输出到日志?不要等程序执行完再一次性写入。

node.js中将console.log日志内容输出到文件

async function Get_alldata (  ) {  

        var fs      = require('fs')
        var util    = require('util')
        var logPath = 'upgrade.log'
        var logFile = fs.createWriteStream(logPath, { flags: 'a' })
        console.log = function() {
          logFile.write(util.format.apply(null, arguments) + '\n') // 输出 01、02、03 到文本文件;
          process.stdout.write(util.format.apply(null, arguments) + '\n')
        }

       console.log( ' 01' );   
       console.log( ' 02' );   
       console.log( ' 03' );  
       
       ****** other code ******
       
       return await Get_alldata() ;
}    

上面的代码,只能在 注屏蔽释掉 return await Get_alldata() ; 语句之后,在程序执行完之后,将 01、02、03 一次性的写入到到文本文件?
如果 不注屏蔽释掉 return await Get_alldata() ; 那么 01、02、03 根本就没有写入文本文件;
请问怎么实现 在直接使用 console.log( ) 函数的情况下,实时的将 console.log 输出的 01、02、03 写入到到文本文件?
我实现了 await console.log( ) 的办法,可是太复杂了,使用也不方便;
所以想请教一下这个社区的网友,有没有更好的办法?
如果有可以使用的插件,希望能够帮忙给个插件配置文件,谢谢!
附上两个参考文档:
Node中console.log的同步实现:https://blog.csdn.net/li42052...
[Node.js系统模块系列一] console模块解读:https://juejin.im/post/5bf2b3...

阅读 2.4k
1 个回答

首先是,

如果 不注屏蔽释掉 return await Get_alldata() ; 那么 01、02、03 根本就没有写入文本文件;

然而你理一下代码, 如果你加上一个:

return await Get_alldata() ;

那么你的代码将会一直无限递归, 我自己试了一下( macos环境 ), 是会瞬间写入大量的 01 02 03 这种log, 然后最后报错:

UnhandledPromiseRejectionWarning: RangeError: Maximum call stack size exceeded

我也不太清楚你为什么会没有log输出到文件, 但是你这种写法 或者是测试方法 肯定是错的.

如果说你要输出日志到文件, 网上现成的轮子肯定是有的, 而且很多, 没必要自己造....况且还那么简陋. 像 log4js, winston, 都是很不错的.
我这边可以简单的给你一个log4js的配置,

const log4js = require('log4js');

log4js.configure({
  appenders: {
    console: { type: 'stdout' },
    file: {
            "type": "dateFile",
            "filename": './logs/server.log',
            "pattern": "-yyyyMMdd.log",
            "alwaysIncludePattern": false
    }
  },
  categories: {
    default: { appenders: [ 'console', 'file' ], level: 'debug' }
  }
});
 
const logger = log4js.getLogger('main_server');
logger.info('main_server logger.....');

具体的含义应该都能猜得到, 详细的配置看文档吧. 或者 搜索 log4js 配置

推荐问题