在 Ubuntu 上配置 Node.js 日志,通常分为 应用层日志 和 系统层日志 两部分。下面按常见场景给你一个完整、实用的说明。
Node.js 不建议直接用 console.log 上生产。
| 库 | 特点 |
|---|---|
| winston | 最常用,支持多 transport |
| pino | 高性能,JSON 日志 |
| bunyan | JSON 日志,可读性好 |
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({
format: winston.format.simple(),
}));
}
module.exports = logger;
const logger = require('./logger');
logger.info('服务启动');
logger.error('数据库连接失败');
npm install winston-daily-rotate-file
const { createLogger, transports, format } = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
filename: 'logs/app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxSize: '20m',
maxFiles: '14d',
});
const logger = createLogger({
format: format.combine(format.timestamp(), format.json()),
transports: [transport],
});
如果你用 PM2 管理 Node.js 服务(强烈推荐):
pm2 logs
pm2 logs app-name
日志默认位置:
~/.pm2/logs/
pm2 start app.js --name my-api \
--log logs/pm2.log \
--output logs/out.log \
--error logs/error.log \
--time
或 ecosystem.config.js:
module.exports = {
apps: [{
name: 'api',
script: 'app.js',
error_file: 'logs/error.log',
out_file: 'logs/out.log',
log_date_format: 'YYYY-MM-DD HH:mm:ss',
}]
};
如果你用 systemd 启动 Node.js:
journalctl -u your-service-name -f
只要 console.log / console.error 输出到 stdout/stderr 即可。
如果你用 Nginx:
/var/log/nginx/access.log
/var/log/nginx/error.log
查看:
tail -f /var/log/nginx/access.log
✅ 不要打印敏感信息(密码、token)
✅ 使用 JSON 格式(方便 ELK / Loki)
✅ 日志分级(info / warn / error)
✅ 日志按天切分 + 自动清理
✅ 错误日志单独存放
| 层级 | 工具 |
|---|---|
| Node.js 应用 | winston + daily-rotate |
| 进程管理 | PM2 |
| 系统服务 | systemd |
| 反向代理 | Nginx |
| 日志分析 | ELK / Grafana Loki |
如果你愿意,我可以:
你现在是用 PM2、systemd 还是 Docker?