Debian 上 Node.js 日志出现乱码,通常不是 Node 本身的问题,而是字符编码 / 终端环境 / 输出方式不匹配导致的。下面按常见原因给你系统梳理一下。
Debian 默认可能不是 UTF‑8,导致 Node 输出中文乱码。
locale
如果看到:
LANG=
LC_ALL=
LANGUAGE=
或不是 UTF-8,就会乱码。
sudo apt install locales
sudo dpkg-reconfigure locales
勾选:
en_US.UTF-8
zh_CN.UTF-8
然后:
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
(可写入 ~/.bashrc 或 /etc/environment)
Node 默认使用 UTF‑8,但如果:
tail / cat / less 查看就可能乱码。
node -e "console.log('中文测试')"
如果直接运行正常,但写文件乱码:
node app.js > log.txt
cat log.txt # 乱码
说明是查看方式或文件编码问题。
有些情况:
iconv 转过码file log.txt
如果是:
log.txt: ISO-8859 text
解决:
iconv -f GBK -t UTF-8 log.txt > new.log
PM2 默认不会继承终端 locale。
pm2 start app.js --env production
或在 ecosystem.config.js:
env: {
LANG: "en_US.UTF-8",
LC_ALL: "en_US.UTF-8"
}
重启:
pm2 restart all
systemd 默认 locale 很干净,经常不是 UTF‑8。
systemctl show-environment
sudo systemctl set-environment LANG=en_US.UTF-8
sudo systemctl set-environment LC_ALL=en_US.UTF-8
重启服务:
sudo systemctl restart your-node.service
例如:
fs.writeFileSync('log.txt', '中文', 'binary')
应改为:
fs.writeFileSync('log.txt', '中文', 'utf8')
Docker 默认:
LANG=C
解决:
ENV LANG=C.UTF-8
ENV LC_ALL=C.UTF-8
locale 是 UTF‑8node 输出正常C.UTF-8如果你愿意,可以把:
locale 输出发出来,我可以直接帮你定位是哪一层出的问题。