Debian 下 Node.js 日志出现乱码,绝大多数情况不是 Node 本身的问题,而是终端 / 文件编码不一致导致的。下面按常见场景给你排查和解决思路。
????\u4e2d\u6587䏿–‡(典型 UTF-8 被当 GBK 读)Debian 默认应是 UTF-8,但有时会变成 POSIX / C
locale
如果不是 UTF-8,执行:
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 app.js > log.txt
然后用 cat / vim 看是乱码:
file log.txt
如果是:
UTF-8 Unicode text → 终端问题ISO-8859 / ASCII → Node 输出编码不对✅ Node 默认输出就是 UTF-8,不要手动转码
❌ 错误示例:
fs.writeFileSync('log.txt', data, 'gbk')
✅ 正确:
fs.writeFileSync('log.txt', data)
// 或
fs.writeFileSync('log.txt', data, 'utf8')
如 winston / pino / log4js
✅ 确保:
encoding: 'gbk'示例(winston):
new winston.transports.Console()
不要加:
encoding: 'gbk'
如果是 systemd 服务:
[Service]
Environment=LANG=en_US.UTF-8
Environment=LC_ALL=en_US.UTF-8
Docker:
ENV LANG=C.UTF-8
ENV LC_ALL=C.UTF-8
locale
echo "中文测试"
node -e "console.log('中文测试')"
如果:
echo 正常,Node 乱码 → Node 环境或重定向问题echo 也乱码 → 系统 locale 问题你可以把下面信息发我,我可以直接帮你定位:
locale 输出我可以直接给你精准改法。