温馨提示×

Nodejs日志乱码如何解决

小樊
45
2026-08-02 14:37:09
栏目: 编程语言

Node.js 日志出现乱码,通常是编码不一致终端/文件/管道对编码处理不同导致的。下面按常见场景给你排查和解决方案。


一、常见原因速览

原因 说明
终端编码不是 UTF‑8 Windows 默认 GBK
日志文件编码不对 写入时未指定 UTF‑8
输出到文件 / 管道 丢失 UTF‑8
第三方日志库配置问题 winston / pino 等
字符串本身是 Buffer 未正确 toString

二、终端乱码(最常见)

✅ 1. Windows CMD / PowerShell 乱码

CMD

chcp 65001
node app.js

⚠️ 注意:CMD 对 UTF‑8 支持不好,建议换终端。

PowerShell(推荐)

$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = New-Object System.Text.UTF8Encoding
node app.js

最佳实践:使用 Windows Terminal + PowerShell


三、Node.js 输出时强制 UTF‑8

✅ 2. 确保 process.stdout 是 UTF‑8

process.stdout.setDefaultEncoding('utf8');
console.log('中文测试');

四、文件日志乱码

✅ 3. 写日志文件时指定编码

const fs = require('fs');

fs.writeFileSync('app.log', '中文日志\n', 'utf8');

或追加:

fs.appendFileSync('app.log', '中文日志\n', 'utf8');

❌ 错误示例(容易乱码):

fs.writeFileSync('app.log', Buffer.from('中文日志'));

五、使用日志库(Winston / Pino)

✅ 4. Winston 示例

const winston = require('winston');

const logger = winston.createLogger({
  transports: [
    new winston.transports.File({
      filename: 'app.log',
      encoding: 'utf8'
    }),
    new winston.transports.Console({
      format: winston.format.printf(info => info.message)
    })
  ]
});

logger.info('中文日志');

六、Buffer 导致的乱码(重点)

✅ 5. Buffer 一定要转 UTF‑8

const buf = Buffer.from('中文');
console.log(buf.toString('utf8'));

❌ 错误:

console.log(buf); // 可能乱码

七、Docker / Linux 环境

✅ 6. 设置环境变量

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

Dockerfile 示例:

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

八、快速自检清单 ✅

  • [ ] 终端是否 UTF‑8
  • [ ] 文件写入是否指定 utf8
  • [ ] 是否直接输出 Buffer
  • [ ] 日志库是否配置编码
  • [ ] Docker / Linux 是否设置 locale

九、最小可复现示例(推荐)

console.log('hello 中文');
process.stdout.write('hello 中文\n');

如果这里就乱码 → 终端问题
如果写文件乱码 → 文件编码问题


如果你愿意,可以把:

  • 操作系统
  • 终端类型
  • 使用的日志库
  • 乱码截图或示例

发给我,我可以精准定位你这个场景的问题。

0