Ubuntu 上 Node.js 日志管理实操指南
一 核心原则与总体架构
二 应用内日志与轮转实践
// logger.js
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: 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;
// logger-rotate.js
const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
filename: 'logs/application-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d',
});
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [transport],
});
module.exports = logger;
三 系统级与进程管理方案
/path/to/your/nodejs/app/logs/*.log {
daily
missingok
rotate 7
compress
notifempty
create 0640 root adm
}
sudo logrotate -f /etc/logrotate.d/nodejs-app
pm2 start app.js --name my-app
pm2 set pm2:log-date-format "YYYY-MM-DD HH:mm:ss"
pm2 set pm2:max-size "20M"
pm2 set pm2:retain "14d"
pm2 logs my-app
[Service]
ExecStart=/usr/bin/node /path/to/app.js
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=yourapp
journalctl -u yourapp -f
if $programname == 'nodejs' then /var/log/nodejs.log
& stop
四 集中式日志与监控分析
五 最佳实践与维护清单