1. 选择合适的结构化日志库
结构化日志库能生成格式统一、易于解析的日志(如JSON),大幅提升可读性与后续分析效率。Debian环境下常用的Node.js日志库包括:
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(), // 结构化JSON格式
transports: [
new winston.transports.Console(), // 输出到控制台
new winston.transports.File({ filename: 'combined.log' }) // 输出到文件
]
});
2. 合理配置日志级别
根据环境(开发/生产)设置不同日志级别,过滤无关信息,突出关键内容:
warn
或error
,仅记录警告及以上级别日志,避免日志文件过大;debug
或info
,记录详细信息,便于调试。const logger = winston.createLogger({
level: process.env.NODE_ENV === 'production' ? 'warn' : 'debug', // 根据环境变量调整
format: winston.format.json(),
transports: [new winston.transports.Console()]
});
3. 统一日志格式(含关键元数据)
通过组合时间戳、日志级别、消息内容、请求ID(可选)等元数据,使日志结构清晰、易于定位。
示例(Winston自定义格式):
const logger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), // 时间戳
winston.format.printf(({ timestamp, level, message }) => { // 自定义输出格式
return `[${timestamp}] ${level.toUpperCase()}: ${message}`;
})
),
transports: [new winston.transports.Console()]
});
// 输出示例:[2025-10-12 14:30:00] INFO: Server started on port 3000
4. 实现日志轮转与压缩
使用logrotate
工具自动管理日志文件,避免单个文件过大影响可读性与存储效率。配置步骤:
sudo apt-get install logrotate
;/etc/logrotate.d/nodejs
,内容如下:/path/to/your/nodejs/app/*.log {
daily # 每天轮转
missingok # 文件不存在时不报错
rotate 7 # 保留最近7份
compress # 压缩旧日志(节省空间)
notifempty # 空文件不轮转
create 640 root adm # 新日志文件权限
}
5. 集中式日志管理与分析
将日志发送至集中式工具(如ELK Stack、Graylog、Splunk),实现日志的统一存储、搜索与可视化,快速定位跨服务问题。
示例(Winston集成ELK):
使用winston-elasticsearch
传输器,将日志直接发送至Elasticsearch:
const winston = require('winston');
const ElasticsearchTransport = require('winston-elasticsearch');
const logger = winston.createLogger({
level: 'info',
transports: [
new ElasticsearchTransport({
level: 'info',
clientOpts: { node: 'http://localhost:9200' } // Elasticsearch地址
})
]
});
6. 异步日志记录
确保日志记录操作不影响主线程性能,避免因日志写入延迟导致应用响应变慢。主流日志库(如Winston、Pino)均默认支持异步,无需额外配置。
7. 添加监控与告警
通过Prometheus+Grafana等工具监控日志指标(如错误日志数量、日志写入延迟),设置告警规则(如错误日志超过阈值时发送邮件/短信),及时响应问题。
示例(Prometheus监控错误日志):
使用winston-prometheus
中间件,将错误日志计数暴露为Prometheus指标:
const winston = require('winston');
const promBundle = require('winston-prometheus');
const logger = winston.createLogger({
level: 'error',
transports: [
new promBundle.metricsMiddleware({ includeMethod: true, includePath: true }) // 监控错误日志
]
});