Linux下Node.js日志优化实战指南
一 核心策略与优先级
二 日志库与级别配置示例
// 生产:JSON 到控制台;开发:美化输出
const pino = require('pino');
const logger = pino(
process.env.NODE_ENV === 'production'
? { level: 'warn', transport: { target: 'pino/file', options: { destination: '/var/log/app.log' } } }
: { transport: { target: 'pino-pretty' } }
);
logger.info({ userId: 42 }, 'user login');
// 按级别分流:error 单独文件,其他到 combined
const winston = require('winston');
const { combine, timestamp, json } = winston.format;
const logger = winston.createLogger({
level: 'info',
format: combine(timestamp(), json()),
transports: [
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' }),
],
});
if (process.env.NODE_ENV !== 'production') {
logger.add(new winston.transports.Console({ format: winston.format.simple() }));
}
// 通过信号或管理接口动态修改 logger.level
process.on('SIGUSR2', () => {
const newLevel = logger.level === 'debug' ? 'info' : 'debug';
logger.level = newLevel;
logger.warn({ event: 'log_level_changed', to: newLevel });
});
const express = require('express');
const morgan = require('morgan');
const app = express();
app.use(morgan('combined')); // 仅请求日志
以上示例覆盖了库选型、级别分流、开发/生产差异化输出与动态调级的常见落地方式。
三 文件轮转与存储策略
// Winston Daily Rotate File
const DailyRotateFile = require('winston-daily-rotate-file');
const rotateTransport = new DailyRotateFile({
filename: '/var/log/app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d',
});
logger.add(rotateTransport);
/var/log/app*.log {
daily
rotate 14
compress
missingok
notifempty
copytruncate
su node node
}
四 性能与安全最佳实践
五 快速检查清单
| 优化项 | 关键动作 | 推荐值或工具 |
|---|---|---|
| 日志级别 | 区分环境,支持动态调级 | 生产:warn/error;开发:debug;信号:SIGUSR2 |
| 日志库 | 高吞吐选Pino,灵活选Winston | Pino/Winston/Bunyan |
| 结构化 | 统一JSON,带traceId | JSON + 字段约定 |
| 轮转 | 应用内或系统级二选一 | winston-daily-rotate-file 或 logrotate |
| 保留与压缩 | 控制总量,节省空间 | 7–14天热数据,启用gzip |
| 异步与缓冲 | 减少I/O阻塞 | 异步传输/批量写入 |
| 集中化 | 统一检索与告警 | ELK/Graylog/Loki + Prometheus/Grafana |
| 安全 | 脱敏与权限 | 掩码敏感字段;600/644 权限 |