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

发布于 1周前 作者 phonegap100 来自 nodejs/Nestjs

Nodejs 请问怎么实现 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/li420520/article/details/83420994

[Node.js 系统模块系列一] console 模块解读: https://juejin.im/post/5bf2b31f5188252e89668fe1

如果有可以使用的插件,希望能够帮忙给个插件配置文件,谢谢!


22 回复

直接写 stdout


不介意将所有 console.log 替换一下的话,推荐使用日志模块。个人目前仅仅用过 log4js,感觉良好。

stdout
但是为什么不用日志库呢

可以说细致点吗?因为我不是很熟悉

请问怎么写?有范本吗?

我不想替换的,因为太多了,会搞错。有没有不替换的配置呢?

可以在命令行中从标准输出转到文件吗

不替换大概就是楼上说的用 stdout,这样就可以输出到文件了。没搞过,楼主还是问谷歌吧。其实替换也不太容易出错,因为如果求快,直接所有的 console.log 替换成 logger.info 就行了

不太明白你的意思,node test.js->log ?

process.stdout 模块吗?

请问怎么改写才能实现同步在控制台和文本文件输出呢?

关闭行 buffer

要简单用用,可以直接用 tee 命令

pm2 可以直接记录 console.log 的输出


1. 是这个模块没错,就是你贴的代码的写法。至于要同时输出到命令行和控制台,请使用 tee 命令,这个自行百度即可。多说一句我试过你的代码,不需要注释掉什么东西,是可以正常使用的,唯一区别是,我把模块引入和 log 定义放到了函数外面,代码如下:

javascript<br>var fs = require('fs')<br>var util = require('util')<br><br>var logPath = 'upgrade.log'<br>var logFile = fs.createWriteStream(logPath, { flags: 'a' })<br><br>console.log = function() {<br> logFile.write(util.format.apply(null, arguments) + '\n')<br> process.stdout.write(util.format.apply(null, arguments) + '\n')<br>}<br><br>console.error = function() {<br> logFile.write(util.format.apply(null, arguments) + '\n')<br> process.stderr.write(util.format.apply(null, arguments) + '\n')<br>}<br><br>async function Get_alldata() {<br> console.log(' 01')<br> console.log(' 02')<br> console.log(' 03')<br><br> return await Get_alldata()<br>}<br><br>Get_alldata()<br>

2. 楼上说的 pm2 的确是个更方便的用法,你直接用pm2 start启动脚本,会自动记录日志到文件,同时pm2 log可以在命令行查看日志。

log4js 有一个选项,是否替换 console 的 log 输出,替换之后,console.log 的信息也会记录到的。不用自己重写 console.log

buffer 问题,你真想等输出后才继续运行,不如用 fs.appendFileSync 这个接口。

解决了
var logFile = fs.createWriteStream(logPath, { flags: ‘a’ })
console.log = function() {
logFile.write(util.format.apply(null, arguments) + ‘\n’) // 输出 01、02、03 到文本文件;

替换为
var fd =fs.opensyncfile(filepath)
fs.writefilesync(fd,buffer)
fs.closesync(fd)

node xxx.js >> log.txt 看输出用 tail -f log.txt 或者直接用 pm2

pm2 改天试试看,感觉配置项好多

在 Node.js 中,默认情况下 console.log 是同步输出的,但如果你希望将日志输出到文件,同时保持同步特性(即不等待程序执行完毕再一次性写入),你可以使用 Node.js 的 fs 模块来实现。

以下是一个简单的示例,展示如何使用 fs.createWriteStreamfs.SyncWriteStream(即文件描述符)来实现同步日志记录:

const fs = require('fs');
const util = require('util');

// 创建一个同步的写入流
const logStream = fs.createWriteStream('app.log', { flags: 'a' });

// 将标准输出(stdout)和标准错误(stderr)都重定向到文件
const logStdout = util.promisify(logStream.write).bind(logStream);

// 自定义的log函数
function log(message) {
    // 使用同步的方式写入日志
    logStdout(message + '\n').catch(err => console.error('Error writing to log:', err));
    // 同时输出到控制台(可选)
    console.log(message);
}

// 使用示例
log('This is a log message.');
log('Another log message.');

// 模拟异步操作
setTimeout(() => {
    log('Async log message.');
}, 1000);

在这个例子中,log 函数将日志信息同步地写入到 app.log 文件中,并且同时输出到控制台。注意,虽然 fs.writeSync 可以直接用于同步写入,但为了避免阻塞事件循环,我们使用了 fs.createWriteStream 配合 util.promisify 实现的异步写入函数,并立即处理 Promise,从而模拟同步行为。

这种方法确保了日志记录的实时性,同时避免了完全阻塞 Node.js 的事件循环。

回到顶部