JavaScript 日志在 Linux 上“报错”通常不是 Linux 本身的问题,而是运行环境、路径、权限或代码行为在 Linux 下与本地(Windows/macOS)表现不同。下面按最常见原因 → 排查方法给你一个系统清单。
| 现象 | 常见原因 |
|---|---|
| 日志路径不存在 | Linux 路径区分大小写 |
| 没权限写日志 | 普通用户写 /var/log |
| 中文/特殊字符乱码 | Linux 默认 UTF‑8 |
| 日志文件被占用 | Linux 文件锁更严格 |
| 路径分隔符问题 | \ vs / |
| 环境变量不同 | process.env 差异 |
| 时区问题 | 日志时间错乱 |
| 磁盘满 | Linux 不自动提示 |
❌ 错误示例:
fs.writeFileSync('logs/app.log', data)
Linux 上可能:
logs/ 目录不存在✅ 正确做法:
const fs = require('fs');
const path = require('path');
const logPath = path.join(__dirname, 'logs');
if (!fs.existsSync(logPath)) {
fs.mkdirSync(logPath, { recursive: true });
}
fs.writeFileSync(path.join(logPath, 'app.log'), data);
✅ 建议:
__dirnamepath.join❌ 错误:
fs.writeFileSync('/var/log/app.log', data)
报错:
EACCES: permission denied
✅ 解决:
sudo chown -R $(whoami) /var/log/app
✅ 生产推荐:
/opt/app/logs
❌ 错误:
'logs\\app.log'
✅ 正确:
path.join('logs', 'app.log')
Node.js 单进程还好,多进程(PM2 / cluster)容易出问题。
❌ 错误:
fs.writeFileSync('app.log', data)
✅ 推荐:
fs.appendFileSync('app.log', data + '\n');
Linux 默认 UTF‑8,但如果你:
iconv 转过编码可能乱码或报错。
✅ 检查:
locale
✅ 设置:
export LANG=en_US.UTF-8
✅ JS 中:
fs.writeFileSync('app.log', data, 'utf8')
const logDir = process.env.LOG_DIR;
fs.writeFileSync(`${logDir}/app.log`, data);
如果 Linux 上:
LOG_DIR 未定义
✅ 解决:
export LOG_DIR=/opt/app/logs
或:
const logDir = process.env.LOG_DIR || path.join(__dirname, 'logs');
Linux 时区可能不同。
✅ 使用标准格式:
new Date().toISOString()
# 查看报错
journalctl -xe
# 或
pm2 logs
# 查看目录权限
ls -ld logs
# 查看磁盘
df -h
# 查看当前用户
whoami
90% 的 JS 日志 Linux 报错,本质都是:路径 / 权限 / 环境差异。
如果你愿意,可以直接把:
贴出来,我可以 精确告诉你哪一行有问题。