Linux运维6 min read

Linux日志管理与分析实战

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

总结

良好的日志管理需要:

  1. 集中收集:不要在各服务器上分散存储
  2. 结构化:使用JSON等结构化格式
  3. 设定保留策略:平衡存储成本和追溯需求
  4. 告警联动:关键错误实时通知
  5. 定期巡检:自动化检查日志健康状态
分享:

相关文章