1. 选择高性能日志库
在Debian环境下,优先选择Winston或Pino这类高性能日志库。Winston功能全面,支持多传输(文件、控制台、HTTP等)、多日志级别及结构化格式化;Pino则以极低的CPU和内存开销著称,适合高并发场景。例如,使用Winston时可通过npm install winston
安装,Pino则通过npm install pino
安装。
2. 合理设置日志级别
根据环境动态调整日志级别,生产环境建议设置为warn
或error
(仅记录关键错误和警告),开发/测试环境可设置为info
或debug
(记录详细流程信息)。可通过日志库配置实现,如Winston的level
属性:const logger = winston.createLogger({ level: 'warn' })
;也可通过环境变量灵活控制(如process.env.LOG_LEVEL
),配合PM2配置文件(apps.env.LOG_LEVEL=warn
)实现统一管理。
3. 启用异步日志记录
异步日志记录可避免阻塞主线程,提升应用性能。Winston默认采用异步写入(通过async_hooks
模块),无需额外配置;Pino也默认异步写入。若需强制同步(如确保日志立即持久化),可在Winston中配置sync: true
,但会牺牲一定性能。
4. 配置日志轮转
使用winston-daily-rotate-file
插件实现日志自动轮转,防止日志文件过大占用磁盘空间。安装插件:npm install winston-daily-rotate-file
,配置示例如下:
const winston = require('winston');
require('winston-daily-rotate-file');
const transport = new winston.transports.DailyRotateFile({
filename: '/var/log/nodejs/app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true, // 压缩旧日志
maxSize: '20m', // 单个日志文件最大20MB
maxFiles: '14d' // 保留14天日志
});
const logger = winston.createLogger({
transports: [transport]
});
此配置会将日志按日期分割,保留14天,并压缩旧日志。
5. 使用结构化日志格式
采用JSON格式记录日志,便于后续通过ELK Stack(Elasticsearch+Logstash+Kibana)、Graylog等工具进行解析、分析和可视化。Winston可通过format.combine(winston.format.json())
配置,Pino默认输出JSON格式。例如:
const logger = winston.createLogger({
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
transports: [new winston.transports.Console()]
});
logger.info({ message: 'User logged in', userId: 123 }); // 输出:{"timestamp":"2025-09-21T12:00:00.000Z","level":"info","message":"User logged in","userId":123}
结构化日志能更高效地提取关键信息(如时间戳、日志级别、用户ID)。
6. 部署集中式日志管理
对于分布式系统,将日志发送至集中式日志服务器(如ELK Stack),减轻应用服务器的I/O压力。基本流程:
logstash.conf
示例):input {
tcp {
port => 5000
}
}
filter {
json {
source => "message"
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "nodejs-logs-%{+YYYY.MM.dd}"
}
stdout { codec => rubydebug }
}
应用层配置Winston发送日志至Logstash:
const winston = require('winston');
require('winston-transport').Transport;
const logstashTransport = new winston.transports.Logstash({
port: 5000,
host: 'localhost'
});
const logger = winston.createLogger({
transports: [logstashTransport]
});
此方案可实现日志的集中存储、分析和快速故障排查。
7. 监控与告警集成
结合Prometheus和Grafana监控日志指标(如日志写入速率、错误日志数量),设置告警规则(如错误日志超过阈值时发送邮件/Slack通知)。例如,使用winston-prometheus
中间件将日志指标暴露给Prometheus:
const winston = require('winston');
const promBundle = require('express-prom-bundle');
const logger = winston.createLogger({
transports: [new winston.transports.Console()]
});
const metricsMiddleware = promBundle({ includeMethod: true, includePath: true });
app.use(metricsMiddleware); // Express应用中集成
// Prometheus监控日志错误数量
let errorCount = 0;
setInterval(() => {
if (errorCount > 100) {
// 发送告警(如调用Alertmanager API)
console.error('Error log count exceeded threshold: ', errorCount);
}
errorCount = 0;
}, 60000);
logger.error('Something went wrong'); // 错误日志计数+1
通过监控告警,可及时发现应用异常,减少故障影响时间。