选择合适的日志库
在Debian系统中管理Node.js日志,首先需根据需求选择合适的日志库。Winston是最流行的选择,支持文件、控制台、HTTP等多种传输方式,配置灵活;Pino以高性能和低开销著称,适合高并发场景;Bunyan提供结构化JSON日志输出,便于后续处理;Log4js类似Java的log4j,功能丰富,支持日志轮换等特性。根据应用规模(如高负载选Pino)和需求(如结构化选Bunyan)选择合适的库。
配置合理的日志级别
根据环境设置不同日志级别,避免记录无关信息影响性能。生产环境建议仅记录error
(错误,影响操作但不终止系统)和warn
(警告,潜在问题)级别,聚焦关键问题;开发环境可开启debug
(调试,诊断细节)或verbose
(详细,全面信息),帮助排查问题。例如Winston配置中通过level
参数设置:level: process.env.NODE_ENV === 'production' ? 'error' : 'debug'
。
采用结构化日志格式
使用JSON等结构化格式记录日志,便于后续自动化解析、过滤和分析。结构化日志可包含元数据(如user_id
、request_id
、timestamp
),帮助快速定位问题。例如Winston配置中添加timestamp
和json
格式:
const logger = winston.createLogger({
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
transports: [new winston.transports.File({ filename: 'combined.log' })]
});
Bunyan默认输出JSON格式,适合大规模日志收集。
实现日志轮转与分割
防止日志文件过大占用磁盘空间,可使用logrotate(Linux自带)或日志库插件(如winston-daily-rotate-file
)。logrotate配置示例(/etc/logrotate.d/nodejs
):
/path/to/nodejs/logs/*.log {
daily
rotate 7
compress
missingok
notifempty
create 0644 root root
}
此配置每日轮换日志,保留7天,压缩旧日志。Winston的winston-daily-rotate-file
插件可实现按天轮换,配置示例如下:
const winston = require('winston');
require('winston-daily-rotate-file');
const transport = new winston.transports.DailyRotateFile({
filename: 'application-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxSize: '20m',
maxFiles: '14d'
});
const logger = winston.createLogger({
transports: [transport]
});
这会将日志按天分割,保留14天,超过20MB则压缩。
使用进程管理器集中管理日志
借助PM2(Node.js进程管理器)管理日志,支持日志分割、集中存储和实时查看。安装PM2后,启动应用时指定日志文件:
pm2 start app.js --log-date-format "YYYY-MM-DD HH:mm Z" --error ./logs/error.log --output ./logs/output.log
或通过配置文件(ecosystem.config.js
)设置:
module.exports = {
apps: [{
name: 'my-app',
script: 'app.js',
error_file: './logs/error.log',
out_file: './logs/output.log',
log_date_format: 'YYYY-MM-DD HH:mm Z'
}]
};
PM2还支持pm2 logs
命令实时查看日志,pm2 flush
清空日志。
集成集中式日志管理系统
对于分布式系统,将日志发送到集中式管理系统(如ELK Stack:Elasticsearch+Logstash+Kibana、Graylog),便于统一存储、分析和可视化。例如使用Winston的logstash
传输:
const winston = require('winston');
require('winston-logstash');
const logger = winston.createLogger({
transports: [
new winston.transports.Logstash({
port: 28777,
host: 'logstash-server-ip',
node_name: 'my-node-app'
})
]
});
这会将日志发送到Logstash,再存储到Elasticsearch,通过Kibana展示和分析。
确保日志安全性
避免日志中包含敏感信息(如数据库密码、用户信用卡号),可通过以下方式处理:
****
代替密码);chmod 640
),防止未授权访问。