在 Node.js 中导出运行日志通常有几种常见方式,取决于你是本地运行还是线上部署,以及你使用的是什么日志方案。下面按场景给你一个完整的参考。
node app.js > logs/app.log 2>&1
说明:
>:标准输出重定向2>&1:错误输出也一起写入logs/app.log:日志文件✅ 适合:本地调试、简单项目
node app.js 2>&1 | tee logs/app.log
fs 手动写日志(不推荐长期使用)const fs = require('fs');
const logStream = fs.createWriteStream('logs/app.log', { flags: 'a' });
console.log = (msg) => {
logStream.write(`[LOG] ${msg}\n`);
};
console.error = (msg) => {
logStream.write(`[ERROR] ${msg}\n`);
};
⚠️ 不推荐:影响 console 行为,维护成本高
npm install winston
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
transports: [
new winston.transports.File({ filename: 'logs/error.log', level: 'error' }),
new winston.transports.File({ filename: 'logs/combined.log' })
]
});
// 开发环境可同时输出到控制台
if (process.env.NODE_ENV !== 'production') {
logger.add(new winston.transports.Console());
}
logger.info('服务启动成功');
logger.error('发生错误');
✅ 优点:
npm install pino pino-pretty
const pino = require('pino');
const logger = pino({
transport: {
target: 'pino-pretty',
options: { destination: 'logs/app.log' }
}
});
logger.info('服务启动');
✅ 适合:高并发、性能敏感项目
pm2 start app.js --name my-app
pm2 logs my-app
~/.pm2/logs/
pm2 start app.js --log logs/app.log
✅ 优点:
logger.add(new winston.transports.Console());
Docker 会自动收集:
docker logs 容器名
docker run -v $(pwd)/logs:/app/logs app
✅ 不要只 console.log
✅ 生产环境一定写文件或发送到日志系统
✅ 区分 info / warn / error
✅ 按日期切割日志(Winston + Daily Rotate)
| 场景 | 推荐方案 |
|---|---|
| 本地调试 | node app.js > app.log |
| 小项目 | Winston |
| 高并发 | Pino |
| 生产环境 | PM2 + Winston |
| 云服务器 | PM2 / Docker + 日志平台 |
如果你愿意,可以告诉我:
我可以直接帮你写一套可用的日志配置方案。