Nodejs console.log会输出二进制的问题
Nodejs console.log会输出二进制的问题
用child_process监听tailf输出的日志,发现使用console.log输出显示的时候,输出的是这种形式的:
<Buffer 31 32 37 2e 30 2e 30 2e 31 20 2d 20 2d 20 5b 32 39 2f 53 65 70 2f 32 30 31 32 3a 31 31 3a 31 34 3a 35 32 20 2b 30 38 30 30 5d 20 22 47 45 54 20 2f 63 68 ...>
但是使用sys.puts()输出的是正常的日志形式。有人介绍一下这之间的原因吗?
Node.js console.log
输出二进制数据的问题
当你使用 Node.js 的 child_process
模块来监听文件的变化(例如通过 tail -f
命令),你可能会遇到一个常见的问题:console.log
输出的日志内容并不是你预期的形式。相反,它以 <Buffer>
的形式出现,这表示 Node.js 在尝试处理二进制数据。
示例代码
假设我们有一个简单的脚本,用于监听日志文件并打印其内容:
const { exec } = require('child_process');
exec('tail -f /path/to/logfile.log')
.stdout.on('data', (data) => {
console.log(data);
});
在这个例子中,data
是一个 Buffer 对象,而不是普通的字符串。因此,当你直接使用 console.log(data)
时,你会看到类似以下的输出:
<Buffer 31 32 3e 2e 30 2e 30 2e 31 20 2d 20 2d 20 5b 32 39 2f 53 65 70 2f 32 30 31 32 3a 31 31 3a 31 34 3a 35 32 20 2b 30 38 30 30 5d 20 22 47 45 54 20 2f 63 68 ...>
解释
data
参数是一个 Buffer 对象,表示从子进程接收到的数据。Buffer 对象是 Node.js 中用来处理二进制数据的一种数据结构。默认情况下,console.log
并不会自动将 Buffer 转换为字符串,因此你会看到 <Buffer>
的形式。
解决方案
如果你希望 console.log
输出字符串而不是 Buffer,可以手动将 Buffer 转换为字符串:
const { exec } = require('child_process');
exec('tail -f /path/to/logfile.log')
.stdout.on('data', (data) => {
console.log(data.toString());
});
这里,data.toString()
将 Buffer 对象转换为 UTF-8 编码的字符串,这样输出就会是你期望的正常日志形式。
使用 sys.puts
的情况
在旧版本的 Node.js 中,sys.puts
可以自动将 Buffer 转换为字符串。然而,从 Node.js v0.12 开始,sys.puts
已经被弃用,并且不推荐使用。建议使用 console.log
结合 toString
方法来处理这种情况。
通过这种方式,你可以确保在监听文件变化时,日志输出符合你的预期。
console.log()
是会根据变量的数据类型来输出相应的信息的。
你这里输出的是Buffer对象,如果要转换成字符串,应该这样console.log(xx.toString())
多谢!!!
这输出的buf是二进制吗?
我也没有仔细研究,目测是二进制。呵呵!!!
Buffer
学习了
这里输出的是一个Buffer
当你在 Node.js 中使用 console.log
输出 Buffer 对象时,默认情况下它会显示为 <Buffer ...>
的形式。这是因为 console.log
不知道如何直接处理 Buffer 对象,所以它默认以十六进制的形式展示其内容。
如果你希望像使用 sys.puts()
那样得到一个可读的字符串输出,你可以通过调用 .toString()
方法将 Buffer 转换为字符串。这里有一个简单的例子:
const fs = require('fs');
const { spawn } = require('child_process');
// 使用 child_process 模块来执行 tail -f 命令
const tail = spawn('tail', ['-f', 'your_log_file.log']);
// 监听子进程的 stdout 流
tail.stdout.on('data', (data) => {
// 将 Buffer 对象转换为字符串
const logMessage = data.toString();
console.log(logMessage); // 现在输出的将是可读的字符串
});
// 监听子进程的 stderr 流
tail.stderr.on('data', (data) => {
console.error(`stderr: ${data}`);
});
// 监听子进程的退出事件
tail.on('exit', (code) => {
console.log(`child process exited with code ${code}`);
});
在这个示例中,我们使用了 spawn
方法来启动 tail -f
进程,并监听其标准输出 (stdout
)。当接收到新的数据时,我们将 Buffer
对象通过 .toString()
方法转换成字符串,然后输出到控制台。这样可以避免出现 <Buffer ...>
的形式,而得到预期的、可读的日志信息。
如果你仍然遇到问题,确保日志文件的编码格式是 UTF-8 或者根据实际编码选择合适的解码方式。