Node.js 日志优化与 Debian 系统实践
一 策略总览
二 系统层日志轮换与保留
使用 logrotate 管理 Node.js 日志文件(适合 systemd 或 pm2 写入的文件):
/var/log/nodejs/*.log {
daily
rotate 7
compress
missingok
notifempty
create 0644 node node
copytruncate
}
若使用 PM2,可安装 pm2-logrotate 插件统一治理 PM2 输出:
pm2 install pm2-logrotate
三 应用层日志配置示例
使用 Winston 按级别分流、按时间轮转并压缩归档:
const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
filename: '/var/log/nodejs/app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d'
});
const logger = winston.createLogger({
level: process.env.NODE_ENV === 'production' ? 'warn' : 'debug',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
transports: [
new winston.transports.File({ filename: '/var/log/nodejs/error.log', level: 'error' }),
transport
]
});
logger.info({ event: 'startup', pid: process.pid });
logger.error('Unhandled error', { error: new Error('boom') });
使用 Pino 的高性能 JSON 日志(开发期可接入 pino-pretty 便于阅读):
const pino = require('pino');
const logger = pino({
level: process.env.NODE_ENV === 'production' ? 'warn' : 'debug',
transport: process.env.NODE_ENV !== 'production'
? { target: 'pino-pretty', options: { colorize: true } }
: undefined
});
logger.info({ event: 'request', method: 'GET', url: '/' });
logger.error({ err: new Error('fail') }, 'Request failed');
使用 Log4js 按日切分并自动清理:
const log4js = require('log4js');
log4js.configure({
appenders: {
out: { type: 'stdout' },
app: {
type: 'file',
filename: '/var/log/nodejs/app.log',
pattern: 'yyyy-MM-dd',
alwaysIncludePattern: true,
daysToKeep: 90,
compress: true
}
},
categories: { default: { appenders: ['out', 'app'], level: 'info' } }
});
const logger = log4js.getLogger();
logger.info('Hello, Log4js');
将日志发送到 Elasticsearch(便于集中检索与可视化):
const { ElasticsearchTransport } = require('winston-elasticsearch');
const esTransport = new ElasticsearchTransport({
client: new require('@elastic/elasticsearch').Client({ node: 'http://localhost:9200' }),
index: 'nodejs-logs-%DATE%'
});
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [esTransport]
});
四 性能与安全最佳实践
五 快速检查清单
| 优化项 | 推荐值或做法 | 说明 |
|---|---|---|
| 日志级别 | 生产:warn/error;开发:debug | 减少不必要日志 |
| 格式 | JSON | 便于检索与聚合 |
| 输出目标 | error.log + combined.log | 错误与全量分流 |
| 轮换 | 按日或 10–20MB;保留 7–14 天;启用压缩 | 控制磁盘与 I/O |
| 工具 | logrotate 或 pm2-logrotate | 系统/进程级统一治理 |
| 异步 | 异步写入/批量 | 降低主线程阻塞 |
| 集中化 | ELK/Graylog 或 Elasticsearch Transport | 统一检索与可视化 |
| 监控告警 | Prometheus/Grafana | 错误率、延迟、磁盘阈值告警 |