Ubuntu下Node.js日志管理实践
一 核心原则与总体架构
二 应用内日志方案与示例
npm install winstonconst winston = require('winston');
const logger = winston.createLogger({
level: process.env.NODE_ENV === 'production' ? 'info' : 'debug',
format: winston.format.combine(
winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
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()
}));
}
logger.info('应用启动', { pid: process.pid });
logger.error('发生错误', { err: new Error('boom') });
npm install pinoconst pino = require('pino')();
pino.info({ service: 'api' }, 'hello pino');
npm install morgan winstonconst express = require('express');
const morgan = require('morgan');
const logger = require('./logger'); // 上面的 winston 实例
const app = express();
app.use(morgan('combined', { stream: { write: msg => logger.info(msg.trim()) } }));
app.get('/', (_, res) => res.send('ok'));
app.listen(3000);
三 日志轮转与保留策略
应用内轮转(推荐与系统方案二选一或叠加):使用 winston-daily-rotate-file
npm install winston-daily-rotate-fileconst DailyRotateFile = require('winston-daily-rotate-file');
const rotateTransport = new DailyRotateFile({
filename: 'logs/application-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d'
});
logger.add(rotateTransport);
系统级轮转(与应用解耦,推荐生产使用):使用 logrotate
sudo nano /etc/logrotate.d/nodejs-app/path/to/your/node-app/logs/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 root adm
}
sudo logrotate -f /etc/logrotate.d/nodejs-app四 运行与集中式日志
npm install -g pm2pm2 start app.js --name my-app
pm2 logs my-app # 实时查看
pm2 monit # 资源与日志监控
pm2 flush # 清理当前日志
pm2 set pm2:log-date-format "YYYY-MM-DD HH:mm:ss"
pm2 set pm2:max-size "20M"
pm2 set pm2:retain "14d"
sudo apt-get install rsyslog
# /etc/rsyslog.d/50-default.conf 追加:
if $programname == 'nodejs' then /var/log/nodejs.log
& stop
sudo systemctl restart rsyslog
五 维护与最佳实践清单