在Debian环境下,Node.js应用的日志管理需依赖合适的库。常见选择包括:
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' }),
new winston.transports.Console() // 开发环境输出到控制台
]
});
日志轮转可防止日志文件过大占用磁盘空间,常用方法:
winston-daily-rotate-file插件,设置单文件大小(如2MB)和保留数量(如7个),自动删除旧日志。const { createLogger, format, transports } = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const logger = createLogger({
level: 'info',
format: format.combine(format.timestamp(), format.json()),
transports: [
new DailyRotateFile({
filename: 'application-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxSize: '2m',
maxFiles: '7d'
})
]
});
sudo apt install logrotate),创建配置文件(如/etc/logrotate.d/nodejs),设置每日轮转、保留7天、压缩旧日志。/var/log/nodejs/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 640 root adm
}
集中式管理便于日志的统一存储、搜索和分析,常用方案:
logstash传输或winston-elasticsearch插件,将日志发送到Logstash,再存储到Elasticsearch,通过Kibana进行可视化分析。fluent.conf文件,从文件或应用中收集日志,发送到Elasticsearch或其他存储。sudo apt install fluentd
# 编辑/etc/fluent/fluent.conf
<source>
@type tail
path /var/log/nodejs/*.log
tag nodejs.app
<parse>
@type json
</parse>
</source>
<match nodejs.app>
@type elasticsearch
host localhost
port 9200
logstash_format true
</match>
pm2 logs命令)。npm install pm2 -g
pm2 start app.js --name "my-app"
pm2 logs my-app # 实时查看日志
确保日志不被篡改或泄露:
censor-sensitive-values等库,在日志输出前替换敏感字段(如密码、银行卡号)。gpg工具加密日志文件,防止未授权访问。gpg --symmetric --cipher-algo AES256 /var/log/nodejs/app.log # 加密
gpg --decrypt /var/log/nodejs/app.log.gpg > /var/log/nodejs/app.log # 解密
auditd工具监控日志文件的访问和修改,设置审计规则(如sudo auditctl -w /var/log/nodejs/*.log -p wa -k js_log_access),记录所有对日志文件的操作。cron定时任务定期执行日志清理脚本(如删除超过30天的日志)。crontab -e
# 添加以下内容(每天凌晨2点执行)
0 2 * * * find /var/log/nodejs -name "*.log" -mtime +30 -exec rm {} \;
Prometheus+Grafana监控日志指标(如错误日志数量、日志大小),设置报警规则(如错误日志超过100条时发送邮件)。640),仅允许root和日志所属用户访问,防止未授权读取。