在 Linux 下 Node.js 程序日志出现乱码 / 编码错误,通常不是 Node.js 本身的问题,而是**“输出终端 / 文件 / 管道 / 系统环境”的编码不一致**导致的。下面按常见原因给你梳理:
检查:
locale
如果看到:
LANG=C
LC_ALL=
或不是 UTF-8,Node.js 默认会用系统编码输出,日志就会乱码。
✅ 解决:
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
或写入:
~/.bashrc
/etc/environment
Node.js 的 console.log 输出编码取决于:
process.stdout 的编码console.log(process.stdout.encoding);
如果是 null 或不是 utf8,可能乱码。
✅ 强制 UTF-8:
process.stdout.setDefaultEncoding('utf8');
fs.writeFileSync('log.txt', '中文日志');
如果系统不是 UTF-8,或编辑器不是 UTF-8,就会看起来“乱码”。
fs.writeFileSync('log.txt', '中文日志', 'utf8');
或:
fs.createWriteStream('log.txt', { encoding: 'utf8' });
nohup node app.js > log.txt &
如果 shell 不是 UTF-8,日志会错。
✅ 解决:
LANG=en_US.UTF-8 nohup node app.js > log.txt &
Docker 默认不一定 UTF-8。
✅ Dockerfile:
ENV LANG=C.UTF-8
ENV LC_ALL=C.UTF-8
示例(winston):
new winston.transports.File({
filename: 'app.log',
encoding: 'utf8'
})
不指定 encoding 可能用系统默认编码。
比如:
❌ 错误:
Buffer.from(data).toString();
✅ 正确:
Buffer.from(data).toString('utf8');
# 1. 系统编码
locale
# 2. Node 输出编码
node -e "console.log(process.stdout.encoding)"
# 3. 文件是否 UTF-8
file log.txt
# 4. 强制 UTF-8 运行
LANG=en_US.UTF-8 node app.js
Node.js Linux 日志乱码,90% 是“系统 locale 不是 UTF-8”或“写文件/输出没指定 UTF-8”造成的。
如果你愿意,可以把:
我可以直接帮你定位到具体哪一行的问题。