Node.js 日志出现乱码,通常是编码不一致或终端/文件/管道对编码处理不同导致的。下面按常见场景给你排查和解决方案。
| 原因 | 说明 |
|---|---|
| 终端编码不是 UTF‑8 | Windows 默认 GBK |
| 日志文件编码不对 | 写入时未指定 UTF‑8 |
| 输出到文件 / 管道 | 丢失 UTF‑8 |
| 第三方日志库配置问题 | winston / pino 等 |
| 字符串本身是 Buffer | 未正确 toString |
chcp 65001
node app.js
⚠️ 注意:CMD 对 UTF‑8 支持不好,建议换终端。
$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = New-Object System.Text.UTF8Encoding
node app.js
✅ 最佳实践:使用 Windows Terminal + PowerShell
process.stdout.setDefaultEncoding('utf8');
console.log('中文测试');
const fs = require('fs');
fs.writeFileSync('app.log', '中文日志\n', 'utf8');
或追加:
fs.appendFileSync('app.log', '中文日志\n', 'utf8');
❌ 错误示例(容易乱码):
fs.writeFileSync('app.log', Buffer.from('中文日志'));
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('中文日志');
const buf = Buffer.from('中文');
console.log(buf.toString('utf8'));
❌ 错误:
console.log(buf); // 可能乱码
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
utf8console.log('hello 中文');
process.stdout.write('hello 中文\n');
如果这里就乱码 → 终端问题
如果写文件乱码 → 文件编码问题
如果你愿意,可以把:
发给我,我可以精准定位你这个场景的问题。