Linux日志管理与分析实战
前言
日志是运维人员的"黑匣子"。当系统出现问题时,日志往往是定位根因的唯一线索。然而,很多团队在日志管理上存在明显的短板:日志丢失、未集中收集、不做轮转导致磁盘爆满……本文将从基础到高级,全面介绍Linux日志管理的最佳实践。
一、Linux日志体系概览
1.1 日志子系统
┌─────────────────────────────────────────────────┐
│ 应用程序 │
│ (Nginx, MySQL, App...) │
└──────────┬──────────────────────┬──────────────┘
│ │
▼ ▼
┌──────────────────┐ ┌──────────────────────┐
│ syslog/ │ │ systemd-journald │
│ rsyslog │ │ (二进制日志) │
└────────┬─────────┘ └──────────┬───────────┘
│ │
▼ ▼
┌─────────────────────────────────────────────────┐
│ /var/log/ 文件系统 │
│ messages secure cron audit/ ... │
└─────────────────────────────────────────────────┘
1.2 关键日志文件
| 日志文件 | 内容 |
|---|---|
/var/log/messages |
系统通用日志 |
/var/log/secure |
认证安全日志(ssh登录等) |
/var/log/cron |
计划任务执行日志 |
/var/log/boot.log |
系统启动日志 |
/var/log/dmesg |
内核环形缓冲区日志 |
/var/log/audit/audit.log |
SELinux审计日志 |
二、rsyslog 配置与优化
2.1 基础配置
# /etc/rsyslog.conf
# 定义日志模板
$template TraditionalFormat,"%timegenerated% %HOSTNAME% %syslogtag%%msg:::drop-last-lf%\n"
# 按设施和级别分流
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
cron.* /var/log/cron
# 使用UDP/TCP发送到远程服务器
*.* @@192.168.1.10:514 # TCP
*.* @192.168.1.10:514 # UDP
2.2 按应用分流
# /etc/rsyslog.d/nginx.conf
$template NginxAccess,"/var/log/nginx/%$YEAR%%$MONTH%/access-%$DAY%.log"
local0.* ?NginxAccess
# /etc/rsyslog.d/mysql.conf
local1.* /var/log/mysql/mysql.log
2.3 性能优化
# /etc/rsyslog.conf
# 异步队列,避免IO阻塞
$MainMsgQueueType LinkedList
$MainMsgQueueSize 100000
$MainMsgQueueDequeueBatchSize 1000
$ActionQueueType LinkedList
$ActionQueueSize 10000
$ActionResumeRetryCount -1
三、日志轮转策略
3.1 logrotate 配置
# /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily # 每天轮转
rotate 30 # 保留30份
size 100M # 超过100M也触发轮转
compress # 压缩旧日志
delaycompress # 延迟一个周期再压缩
missingok # 日志不存在不报错
notifempty # 空日志不轮转
dateext # 使用日期后缀
dateformat -%Y%m%d
create 0644 app app # 创建新文件
postrotate
/bin/kill -HUP $(cat /var/run/myapp.pid 2>/dev/null) 2>/dev/null || true
endscript
}
3.2 磁盘空间预警
#!/bin/bash
# disk_alert.sh
THRESHOLD=85
LOG_DIRS="/var/log /data/logs /opt/app/logs"
for dir in $LOG_DIRS; do
usage=$(df -h "$dir" | awk 'NR==2 {print $5}' | tr -d '%')
if [ "$usage" -gt "$THRESHOLD" ]; then
echo "警告: $dir 磁盘使用率 ${usage}%,请及时清理日志" \
| mail -s "磁盘预警" admin@example.com
# 应急清理:删除7天前的日志
find "$dir" -name "*.log.*" -mtime +7 -delete
fi
done
四、journald 实战
4.1 基本命令
# 查看最新日志
journalctl -n 50
# 实时跟踪
journalctl -f
# 按时间过滤
journalctl --since "2025-06-10 10:00:00" --until "2025-06-10 12:00:00"
# 按服务过滤
journalctl -u nginx.service
# 按优先级
journalctl -p err
# 查看启动耗时
systemd-analyze blame
4.2 持久化与清理
# /etc/systemd/journald.conf
[Journal]
Storage=persistent
Compress=yes
SystemMaxUse=2G
SystemMaxFileSize=100M
MaxRetentionSec=30day
五、ELK 日志分析平台
5.1 架构概览
应用服务器 ELK集群
┌──────────┐ Filebeat ┌──────────────┐
│ Nginx │───────────────▶│ Elasticsearch │
│ App Log │ │ (存储+搜索) │
│ System │ └──────┬───────┘
└──────────┘ │
┌──────▼───────┐
│ Kibana │
│ (可视化) │
└──────────────┘
5.2 Filebeat 配置
# /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
fields:
app: nginx
type: access
- type: log
enabled: true
paths:
- /var/log/myapp/*.log
multiline.pattern: '^\d{4}-\d{2}-\d{2}'
multiline.negate: true
multiline.match: after
output.elasticsearch:
hosts: ["192.168.1.10:9200"]
index: "logs-%{+yyyy.MM.dd}"
5.3 常用 Kibana 查询
# 查询错误日志
level: ERROR AND app: myapp
# 统计HTTP状态码
type: access | stats count() by status
# 慢请求分析
response_time > 2 AND type: access
六、日志分析实战技巧
6.1 awk 统计
# 统计每小时请求量
awk '{print $4}' access.log | cut -d: -f2 | sort | uniq -c | sort -rn
# 统计HTTP状态码分布
awk '{print $9}' access.log | sort | uniq -c | sort -rn
# Top 10 IP
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
# 平均响应时间
awk '{sum+=$NF} END {print "Avg:", sum/NR "ms"}' access.log
6.2 grep 高级用法
# 多关键词OR搜索
grep -E "error|fail|critical" app.log
# 取反:排除噪声日志
grep -v "health_check\|ping" app.log | grep ERROR
# 上下文显示
grep -B 5 -A 10 "FATAL" app.log
# 统计关键词出现次数
grep -c "OutOfMemoryError" app.log
总结
良好的日志管理需要:
- 集中收集:不要在各服务器上分散存储
- 结构化:使用JSON等结构化格式
- 设定保留策略:平衡存储成本和追溯需求
- 告警联动:关键错误实时通知
- 定期巡检:自动化检查日志健康状态