Nodejs 请问怎么实现 console.log 同步输出到日志?不要等程序执行完再一次性写入。
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
如果有可以使用的插件,希望能够帮忙给个插件配置文件,谢谢!
直接写 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
解决了
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.createWriteStream
和 fs.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 的事件循环。