在 Linux 上运行 Node.js 时,日志出现乱码通常不是 Node.js 本身的 bug,而是字符编码或终端环境不一致导致的。常见原因和对应解决思路如下:
Linux 默认日志输出依赖 LANG / LC_* 环境变量。
locale
如果看到:
LANG=C
LC_ALL=C
就容易出现中文乱码。
✅ 解决:
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
(或 zh_CN.UTF-8,取决于系统支持)
比如:
查看文件编码:
file log.txt
✅ 解决:
iconv 转换:iconv -f GBK -t UTF-8 log.txt > new.log
当 stdout 不是 TTY 时,Node 可能改变编码行为。
例如:
node app.js > log.txt
✅ 解决:
console.log 输出非 UTF-8 字符串const str = Buffer.from('中文', 'gbk').toString();
console.log(str);
✅ 解决:
const str = Buffer.from('中文', 'utf8').toString('utf8');
例如 HTTP、Socket、数据库返回的是 Buffer。
res.on('data', chunk => {
console.log(chunk); // 乱码
});
✅ 解决:
console.log(chunk.toString('utf8'));
某些日志库默认编码不是 UTF-8。
✅ 解决:
docker exec -it container locale
✅ 解决(Dockerfile):
ENV LANG=C.UTF-8
ENV LC_ALL=C.UTF-8
例如:
✅ 解决:
locale 是否是 UTF-8console.log('中文日志');
环境:
LANG=en_US.UTF-8
如果你愿意,可以:
我可以帮你精确判断是哪一种原因。