Node.js 日志在 Debian 的性能调优指南
一 核心策略与取舍
二 应用层配置与代码示例
npm i pinoconst pino = require('pino');
// 生产:异步、JSON、仅文件
const prodLogger = pino({
level: 'info',
transport: {
target: 'pino/file',
options: { destination: '/var/log/myapp/combined.log' }
}
});
// 开发:美化控制台
const devLogger = pino({
level: 'debug',
transport: { target: 'pino-pretty' }
});
prodLogger.info({ reqId: 'abc-123', method: 'GET', url: '/' }, 'request start');
npm i winston winston-daily-rotate-fileconst 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: '20m',
maxFiles: '14d'
})
]
});
logger.info('started');
logger.error('something went wrong');
// 概念示例:使用 pino-queue 或基于 Bull/Redis 的异步队列
// 将高频日志先入队,后台批量写入磁盘或远程
三 Debian 系统与进程管理配置
journalctl -u myapp -f 实时查看。[Service]
ExecStart=/usr/bin/node /opt/myapp/index.js
StandardOutput=journal
StandardError=journal
SyslogIdentifier=myapp
/var/log/myapp/*.log {
daily
rotate 14
compress
missingok
notifempty
copytruncate
}
pm2 start app.js -i max --log /var/log/myapp/app.lognode --max-old-space-size=2048 app.js,并配合监控与快照分析排查内存问题。四 监控、分析与容量规划
prof-process 分析热点;定位日志序列化/同步 I/O 等瓶颈。五 常见陷阱与排查清单