温馨提示×

linux nodejs日志乱码为何出现

小樊
54
2026-09-08 13:59:27
栏目: 编程语言

在 Linux 上运行 Node.js 程序时,日志出现乱码(如中文变成 ?????、方块、\uXXXX、或者终端显示异常)通常由以下几类原因造成:


一、终端 / Shell 编码不一致(最常见)

1. 系统或终端 locale 不是 UTF-8

Node.js 默认使用系统 locale 编码输出日志。

检查:

locale

如果看到:

LANG=C
LC_ALL=

或不是 UTF-8,就容易出现乱码。

解决:

export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8

或写入:

~/.bashrc
~/.zshrc

2. 终端模拟器编码不对

如:

  • SecureCRT
  • PuTTY
  • Xshell

需要设置:

Character encoding = UTF-8

二、Node.js 输出编码问题

3. console.log 输出非 UTF-8 文本

Node.js 内部是 UTF-8,但如果:

  • 读取了 GBK 文件
  • 从数据库 / 接口拿到非 UTF-8 数据

直接 console.log 就会乱码。

示例(错误):

const fs = require('fs');
const data = fs.readFileSync('gbk.txt'); // GBK
console.log(data.toString()); // 乱码

解决:

const iconv = require('iconv-lite');
console.log(iconv.decode(data, 'gbk'));

4. 日志被重定向到文件后查看乱码

node app.js > log.txt

如果:

  • 文件是 GBK
  • 你用 cat / vim 但终端是 UTF-8

就会看起来像乱码。

解决:

file log.txt
iconv -f gbk -t utf-8 log.txt

三、日志框架配置问题

5. winston / pino / log4js 编码设置错误

有些日志库支持:

  • 文件编码
  • 控制台编码

示例(winston):

new winston.transports.File({
  filename: 'app.log',
  options: { encoding: 'utf8' }
})

四、Docker / CI 环境乱码

6. Docker 容器未设置 UTF-8

Docker 默认可能是:

LANG=C

解决(Dockerfile):

ENV LANG=C.UTF-8
ENV LC_ALL=C.UTF-8

五、特殊字符被转义

7. 日志显示 \u4e2d\u6587

这是 JSON 转义,不是乱码。

例如:

console.log(JSON.stringify({ msg: '中文' }))

解决:

console.log(JSON.stringify(obj, null, 2))
// 或
console.log(obj.msg)

快速排查清单 ✅

  1. locale 是否为 UTF-8
  2. 终端编码是否为 UTF-8
  3. 日志数据来源编码是否一致
  4. 是否重定向到文件
  5. 是否在 Docker / CI 中
  6. 是否是 JSON 转义

如果你愿意,可以把:

  • 乱码截图或示例
  • Node.js 版本
  • Linux 发行版
  • 日志代码

发出来,我可以帮你精确判断是哪一种原因。

0