在 Node.js 中,把日志输出到文件有多种方式,从最简单到生产级方案都可以。下面按常见场景给你说明。
fs(不推荐生产)适合临时调试或简单脚本。
const fs = require('fs');
const path = require('path');
const logFile = path.join(__dirname, 'app.log');
function log(message) {
const time = new Date().toISOString();
fs.appendFileSync(logFile, `[${time}] ${message}\n`);
}
log('服务启动');
log('发生错误');
⚠️ 缺点:
console.log + 重定向(适合简单服务)node app.js > app.log 2>&1
>:标准输出2>&1:错误也写入文件✅ 优点:简单
❌ 缺点:无法按日期切分、无法控制级别
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: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' }),
new winston.transports.Console()
]
});
logger.info('服务启动');
logger.error('发生错误');
✅ 优点:
使用 winston-daily-rotate-file
npm install winston-daily-rotate-file
const { createLogger, format, transports } = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const logger = createLogger({
format: format.combine(
format.timestamp(),
format.json()
),
transports: [
new DailyRotateFile({
filename: 'logs/app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxSize: '20m',
maxFiles: '14d'
}),
new transports.Console()
]
});
logger.info('按日期输出日志');
如果你用 PM2 管理 Node 进程:
pm2 start app.js
PM2 会自动生成日志:
~/.pm2/logs/
查看日志:
pm2 logs
✅ 优点:
| 场景 | 推荐 |
|---|---|
| 小脚本 | fs / console |
| 普通项目 | winston |
| 生产环境 | winston + PM2 |
| 微服务 | winston + ELK |
✅ 不要只写 console.log
✅ 区分 info / warn / error
✅ 错误日志单独文件
✅ 限制日志文件大小
✅ 线上不要输出过多 debug 日志
如果你愿意,可以告诉我:
我可以帮你写一份完整可直接用的日志配置。