优先选用异步、低开销的日志库,避免同步操作阻塞Node.js事件循环。推荐以下库:
const pino = require('pino')();
pino.info({ event: 'user_login', userId: 123 }, 'User logged in');
示例(Winston):
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [new winston.transports.Console(), new winston.transports.File({ filename: 'app.log' })]
});
根据环境动态调整日志级别,减少不必要的日志输出:
error(错误)和warn(警告)级别,避免info(信息)、debug(调试)等低优先级日志占用磁盘I/O和存储空间;info或debug级别,便于排查问题。const logger = winston.createLogger({
level: process.env.NODE_ENV === 'production' ? 'warn' : 'info', // 生产环境仅记录warn及以上
format: winston.format.json(),
transports: [new winston.transports.Console()]
});
异步写入是提升性能的关键,避免日志操作阻塞主线程。多数现代日志库(如Pino、Winston)默认支持异步:
transports配置异步写入(如File传输默认异步);const logger = winston.createLogger({
transports: [
new winston.transports.File({ filename: 'error.log', level: 'error', async: true }) // 显式开启异步
]
});
防止日志文件过大导致磁盘空间耗尽,同时提升读取效率。常用工具:
# 创建配置文件 /etc/logrotate.d/nodejs
/path/to/your/app/*.log {
daily # 每天分割
missingok # 忽略缺失文件
rotate 7 # 保留7天日志
compress # 压缩旧日志(gzip)
notifempty # 空文件不分割
create 0640 root adm # 新日志文件权限
}
示例(Winston-daily-rotate-file配置):
const DailyRotateFile = require('winston-daily-rotate-file');
const logger = winston.createLogger({
transports: [
new DailyRotateFile({
filename: '/var/log/nodejs/app-%DATE%.log', // 按日期命名(如app-2025-11-04.log)
datePattern: 'YYYY-MM-DD',
zippedArchive: true, // 压缩旧日志
maxSize: '20m', // 单个文件最大20MB
maxFiles: '14d' // 保留14天
})
]
});
采用JSON格式记录日志,便于后续通过ELK Stack(Elasticsearch+Logstash+Kibana)、Graylog等工具进行集中式搜索、分析和可视化。结构化日志还能提升日志解析效率,减少CPU开销。
示例(Pino结构化日志):
pino.info({ event: 'order_created', orderId: 456, amount: 100.0 }, 'Order created successfully');
输出结果:
{"level":30,"time":1700000000000,"pid":1234,"hostname":"debian-server","event":"order_created","orderId":456,"amount":100.0,"msg":"Order created successfully"}
将日志发送到专用日志服务器(如ELK集群),避免应用直接写入本地磁盘导致的I/O瓶颈。常用方案:
const winston = require('winston');
const ElasticsearchTransport = require('winston-elasticsearch');
const logger = winston.createLogger({
transports: [
new ElasticsearchTransport({
level: 'info',
clientOpts: { node: 'http://elasticsearch-server:9200' } // Elasticsearch地址
})
]
});
通过监控工具实时跟踪日志系统的性能指标(如日志写入速率、磁盘空间占用、日志文件大小),设置阈值触发告警,及时处理异常。常用工具:
# Grafana Dashboard配置(简化)
panels:
- title: Node.js日志写入速率
type: graph
targets:
- expr: rate(node_log_write_bytes_total[1m]) # 假设已采集该指标
legendFormat: "写入速率 (bytes/s)"
batchLimit配置);flush配置);