Ubuntu环境下 Node.js 日志性能优化实战
一 核心优化策略
二 配置示例
使用 Pino(异步、生产就绪)
// 安装:npm i pino
const pino = require('pino');
// 生产:JSON、异步、INFO;开发:可接入 pino-pretty 便于阅读
const logger = pino(
{
level: process.env.NODE_ENV === 'production' ? 'info' : 'debug',
transport: process.env.NODE_ENV !== 'production'
? { target: 'pino-pretty', options: { colorize: true } }
: undefined,
},
pino.destination({ sync: false, dest: '/var/log/myapp/app.log' }) // 异步落盘
);
logger.info({ reqId: 'abc-123', path: '/api' }, 'request start');
要点:生产用JSON、异步写入;开发环境再接入pino-pretty做可读化。
使用 Winston(多传输、可轮转)
// 安装:npm i winston winston-daily-rotate-file
const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const logger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
transports: [
new winston.transports.File({ filename: '/var/log/myapp/error.log', level: 'error' }),
new DailyRotateFile({
filename: '/var/log/myapp/combined-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxSize: '100m',
maxFiles: '14d'
}),
new winston.transports.Console({ level: 'debug' }),
],
});
logger.info('hello winston');
要点:错误与业务分离;按日期轮转、压缩与保留天数控制磁盘占用。
三 Ubuntu系统侧优化
/var/log/myapp/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0640 nodejs nodejs
sharedscripts
postrotate
systemctl reload myapp >/dev/null 2>&1 || true
endscript
}
四 监控与持续优化