自动化处理 Linux 日志数据可以通过工具组合和脚本实现,以下是分步方案及常用工具:
1. 日志收集
目标:集中管理分散的日志文件。
- 工具:
- Logrotate:自动轮转(压缩、删除旧日志),防止日志文件过大。
# 示例配置 /etc/logrotate.d/nginx /var/log/nginx/*.log { daily rotate 7 compress missingok notifempty }
- rsyslog/syslog-ng:将多台服务器的日志集中到中心服务器。
- Fluentd:跨平台日志收集器,支持容器化环境(如 Docker/K8s)。
- Logrotate:自动轮转(压缩、删除旧日志),防止日志文件过大。
2. 日志分析与过滤
目标:提取关键信息并结构化。
- 简单场景:
- 用
grep
/awk
/sed
快速过滤:# 统计每小时 500 错误的数量 awk '$9 == 500 {print $4}' access.log | cut -d: -f1 | uniq -c
- 用
- 复杂场景:
- ELK Stack(Elasticsearch + Logstash + Kibana):
- Logstash 配置示例(过滤 HTTP 状态码):
filter { grok { match => { "message" => "%{COMBINEDAPACHELOG}" } } if [response] == "500" { add_tag => ["CriticalError"] } }
- Logstash 配置示例(过滤 HTTP 状态码):
- Graylog:替代 ELK 的开源方案,提供告警和仪表盘。
- ELK Stack(Elasticsearch + Logstash + Kibana):
3. 实时监控与告警
目标:即时发现问题并通知。
- Prometheus + Alertmanager:监控指标(需配合日志导出器如
mtail
)。 - Grafana Loki:轻量级日志聚合系统,支持实时查询和告警。
# 查询最近5分钟的500错误 {job="nginx"} |= "500" |~ "HTTP/1.1" [5m]
- 自定义脚本告警(Python + Cron):
# 检查错误日志并发送邮件 import smtplib if "ERROR" in open("/var/log/app/error.log").read(): server = smtplib.SMTP('smtp.example.com') server.sendmail('alert@example.com', 'admin@example.com', 'Critical error detected!')
4. 自动化存储与归档
目标:长期存储且节省空间。
- 压缩归档:
# 每天压缩旧日志 find /var/log/app -name "*.log" -mtime +7 -exec gzip {} \;
- 云存储:使用
awscli
上传到 S3:aws s3 sync /var/log/app s3://my-bucket/logs/ --exclude "*" --include "*.gz"
5. 安全与合规
- 脱敏处理:用
sed
删除敏感信息:sed -i 's/\(password=\).*/\1[REDACTED]/g' /var/log/app/auth.log
- 加密传输:通过 TLS 发送日志(rsyslog 配置):
# rsyslog.conf 配置 $DefaultNetstreamDriverCAFile /etc/ssl/ca.pem $ActionSendStreamDriver gtls
6. 进阶工具推荐
- Vector:高性能日志处理管道(替代 Logstash)。
- Journalctl:直接处理 systemd 日志:
journalctl -u nginx --since "1 hour ago" | grep "500"
示例流程
- 收集:用 Fluentd 收集 Nginx 日志。
- 分析:通过 ELK 生成错误率仪表盘。
- 告警:设置 Kibana 当错误率 >5% 时触发 Slack 通知。
- 归档:每月将日志备份到 S3,保留1年后自动删除。
根据需求选择工具组合,简单场景可用 Shell 脚本 + Cron,复杂系统推荐 ELK 或 Loki 实现全链路自动化。
(www.nzw6.com)