1. 选择合适的日志库
在Debian环境下,根据应用需求选择高性能、易扩展的日志库是基础。Winston 是灵活的多传输日志库,支持JSON格式、文件/控制台输出及自定义传输;Pino 以高性能著称,适合高并发生产环境,内置JSON格式化和流式处理;Log4js 提供丰富的功能(如按日期/大小轮转、多appender支持)。优先推荐Winston(通用场景)或Pino(高性能场景)。
2. 配置合理的日志级别
根据环境动态调整日志级别,避免不必要的性能消耗。生产环境 建议设置为info或warn(仅记录关键信息和警告),开发环境 设置为debug(输出详细调试信息)。可通过环境变量动态配置(如LOG_LEVEL=debug),例如:
const logLevel = process.env.LOG_LEVEL || 'info';
const logger = winston.createLogger({ level: logLevel, ... });
这种配置允许在不修改代码的情况下切换日志级别。
3. 实现日志轮转与归档
使用工具自动管理日志文件大小和数量,防止磁盘空间耗尽。Winston 可搭配winston-daily-rotate-file插件,按日期分割日志并压缩归档(如保留7天、压缩旧日志);Log4js 内置按日期轮转功能;PM2(进程管理工具)的pm2-logrotate模块也支持自动轮转(配置项包括rotateInterval(轮转间隔)、retain(保留天数)、compress(压缩))。例如,Winston每日轮转配置:
const DailyRotateFile = require('winston-daily-rotate-file');
const logger = winston.createLogger({
transports: [
new DailyRotateFile({
filename: 'logs/application-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d'
})
]
});
```。
**4. 启用异步日志记录**
异步日志记录可避免阻塞主线程,提升应用性能。多数日志库默认支持异步(如Winston的`transports`默认异步),但需注意极端情况下的日志丢失问题(可通过`sync: true`强制同步,但会降低性能)。例如,Pino的异步传输:
```javascript
const logger = pino({
level: 'info',
transport: {
target: 'pino-pretty',
options: { colorize: true }
}
});
Pino采用流式处理,天然支持异步。
5. 集中日志聚合与管理
对于分布式系统,将日志集中到专用日志服务器(如ELK Stack(Elasticsearch+Logstash+Kibana)、Graylog、Fluentd)进行统一管理,便于检索和分析。例如,使用Fluentd收集日志并发送到Elasticsearch:
<!-- Fluentd配置示例 -->
<source>
@type forward
port 24224
bind 0.0.0.0
</source>
<match **>
@type elasticsearch
host localhost
port 9200
logstash_format true
flush_interval 10s
</match>
集中管理可解决单节点日志分散问题,提升故障排查效率。
6. 监控与报警机制
设置监控系统跟踪日志指标(如日志量突增、错误率上升),并通过报警工具(如Prometheus+Grafana、PagerDuty)及时通知运维人员。例如,用Prometheus收集Node.js应用的日志指标(通过node_exporter),在Grafana中创建仪表盘展示日志量趋势;或用Winston的winston-elasticsearch插件将错误日志发送到Elasticsearch,配合ElastAlert设置错误报警。
7. 敏感信息过滤与安全
在日志记录前过滤敏感信息(如密码、API密钥、用户隐私数据),避免泄露。可通过自定义格式化函数或中间件实现,例如:
const logger = winston.createLogger({
format: winston.format((info) => {
if (info.message && typeof info.message === 'string') {
info.message = info.message.replace(/password=[^&]+/g, 'password=*****');
}
return info;
})(),
transports: [...]
});
确保日志文件权限正确(如chmod 640),仅允许授权用户访问。
8. 环境适配与配置分离
区分开发、测试、生产环境的日志配置(如开发环境输出到控制台,生产环境输出到文件并轮转),通过环境变量或配置文件管理。例如,使用dotenv加载环境变量:
# .env文件
NODE_ENV=production
LOG_LEVEL=info
LOG_PATH=/var/log/myapp
代码中读取环境变量:
require('dotenv').config();
const logger = winston.createLogger({
level: process.env.LOG_LEVEL || 'info',
transports: [
new winston.transports.Console(),
new winston.transports.File({ filename: `${process.env.LOG_PATH}/combined.log` })
]
});
这种配置使应用能适应不同环境,提升可维护性。