温馨提示×

如何用Syslog进行系统性能监控

小樊
51
2025-10-21 02:10:38
栏目: 编程语言

一、前置准备:配置Syslog收集性能日志
要让Syslog成为系统性能监控的数据源,需先确保其能收集与性能相关的日志。以rsyslog(Linux主流Syslog实现)为例,需完成两项基础配置:

  1. 开启远程日志接收(可选但推荐):修改/etc/rsyslog.conf/etc/rsyslog.d/50-default.conf,取消以下行的注释(或新增),允许服务器接收来自其他主机的Syslog消息(UDP 514端口,若需更安全可选TCP):
    module(load="imudp")  # 加载UDP模块
    input(type="imudp" port="514")  # 开启UDP监听
    module(load="imtcp")  # 加载TCP模块(可选)
    input(type="imtcp" port="514")  # 开启TCP监听
    
    重启rsyslog服务使配置生效:sudo systemctl restart rsyslog
  2. 定向性能日志到独立文件:创建自定义配置文件(如/etc/rsyslog.d/performance.conf),通过关键字过滤性能相关日志(如“CPU usage”“Memory low”“Disk I/O error”),并写入专用文件(如/var/log/performance.log)。示例配置:
    :msg, contains, "CPU usage" -/var/log/cpu_usage.log  # 过滤含“CPU usage”的日志
    & stop  # 停止后续规则处理,避免重复记录
    :msg, contains, "Memory low" -/var/log/memory_alert.log
    & stop
    :msg, contains, "Disk I/O error" -/var/log/disk_io_error.log
    & stop
    
    重启rsyslog服务:sudo systemctl restart rsyslog

二、采集关键性能指标:定义日志内容
需通过脚本或工具主动采集系统性能数据,并以Syslog格式发送到服务器。常用指标及实现方法:

  1. CPU使用率:用top/proc/stat获取CPU利用率,通过logger命令发送到Syslog。示例脚本(保存为/usr/local/bin/cpu_monitor.sh):
    #!/bin/bash
    CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
    THRESHOLD=80  # 阈值设为80%
    if (( $(echo "$CPU_USAGE > $THRESHOLD" | bc -l) )); then
      logger -t CPU_MONITOR "CPU usage is high: ${CPU_USAGE}% (Threshold: ${THRESHOLD}%)"
    fi
    
    添加定时任务(每5分钟执行一次):sudo crontab -e,新增:*/5 * * * * /usr/local/bin/cpu_monitor.sh
  2. 内存占用:用free命令获取内存使用率,发送告警日志:
    #!/bin/bash
    MEM_USAGE=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
    THRESHOLD=90
    if (( $(echo "$MEM_USAGE > $THRESHOLD" | bc -l) )); then
      logger -t MEMORY_MONITOR "Memory usage is high: ${MEM_USAGE}% (Threshold: ${THRESHOLD}%)"
    fi
    
  3. 磁盘I/O:用iostat(需安装sysstat包)获取磁盘读写负载,发送异常日志:
    #!/bin/bash
    IO_WAIT=$(iostat -c 1 2 | tail -1 | awk '{print $4}')
    THRESHOLD=20
    if (( $(echo "$IO_WAIT > $THRESHOLD" | bc -l) )); then
      logger -t DISK_MONITOR "Disk I/O wait is high: ${IO_WAIT}% (Threshold: ${THRESHOLD}%)"
    fi
    
    通过上述脚本,性能数据会以logger命令写入Syslog,便于后续集中分析。

三、日志解析与存储:结构化性能数据
原始Syslog日志为文本格式,需解析为结构化数据(如JSON)以便分析。常用工具:

  1. rsyslog内置过滤:在performance.conf中进一步解析日志,提取关键字段(如时间、主机名、CPU使用率)。示例:
    if $msg contains "CPU usage is high" then {
      action(type="mmjsonparse")  # 解析为JSON格式
      action(type="omfile" file="/var/log/structured_performance.log" template="RSYSLOG_TraditionalFileFormat")
      stop
    }
    
    此配置会将符合条件的日志转为JSON格式,存储到/var/log/structured_performance.log
  2. ELK Stack(Elasticsearch+Logstash+Kibana)
    • Logstash:作为日志收集器,解析rsyslog发送的日志。编辑/etc/logstash/conf.d/syslog.conf,添加以下 pipeline:
      input {
        syslog {
          port => 514
          type => "syslog"
        }
      }
      filter {
        if [type] == "syslog" {
          grok {  # 使用正则提取字段
            match => { "message" => "%{SYSLOGTIMESTAMP:timestamp} %{HOSTNAME:hostname} %{DATA:program}\[%{POSINT:pid}\]: %{GREEDYDATA:message}" }
          }
          if [message] =~ /CPU usage/ {
            mutate { add_tag => ["cpu_perf"] }  # 打标签便于后续过滤
          }
          if [message] =~ /Memory low/ {
            mutate { add_tag => ["memory_perf"] }
          }
        }
      }
      output {
        elasticsearch {  # 存储到Elasticsearch
          hosts => ["localhost:9200"]
          index => "syslog-performance-%{+YYYY.MM.dd}"
        }
        stdout { codec => rubydebug }  # 控制台输出(调试用)
      }
      
    • Kibana:可视化分析。访问http://localhost:5601,创建索引模式(如syslog-performance-*),通过Discover查看日志,或用Visualize构建仪表板(如CPU使用率趋势图)。

四、可视化与告警:让性能监控“可见”

  1. 可视化工具
    • Kibana:通过Dashboard展示性能指标(如CPU使用率、内存占用的时间序列图),支持筛选、钻取(如按主机名查看特定主机的性能数据)。
    • Grafana:搭配Prometheus(需将Syslog数据转换为Prometheus格式)或Elasticsearch数据源,创建更丰富的仪表板(如磁盘I/O负载热力图)。
  2. 告警机制
    • ELK Stack + Watcher:Elasticsearch的Watcher功能可根据日志内容触发告警(如CPU使用率超过80%时发送邮件)。示例Watcher配置:
      PUT _watcher/watch/cpu_high_alert
      {
        "trigger": {
          "schedule": { "interval": "5m" }  # 每5分钟检查一次
        },
        "input": {
          "search": {
            "request": {
              "indices": ["syslog-performance-*"],
              "body": {
                "query": {
                  "bool": {
                    "must": [
                      { "match": { "message": "CPU usage is high" } },
                      { "range": { "@timestamp": { "gte": "now-5m" } } }
                    ]
                  }
                }
              }
            }
          }
        },
        "actions": {
          "email_alert": {
            "email": {
              "to": "admin@example.com",
              "subject": "CPU High Usage Alert",
              "body": "CPU usage is high on {{ctx.payload.hits.hits._source.hostname}}: {{ctx.payload.hits.hits._source.message}}"
            }
          }
        }
      }
      
    • 传统监控工具:Nagios、Zabbix等可通过读取Syslog日志或直接采集性能指标(如/proc/stat),设置阈值告警(如内存使用率超过90%时触发SMS通知)。

五、优化与维护:提升监控有效性

  1. 日志轮转:用logrotate防止性能日志过大,占用磁盘空间。编辑/etc/logrotate.d/performance
    /var/log/cpu_usage.log {
      daily  # 每天轮转
      rotate 7  # 保留7天
      compress  # 压缩旧日志
      missingok  # 文件不存在不报错
      notifempty  # 空文件不轮转
    }
    
  2. 调整日志级别:避免无关日志干扰性能监控。例如,将rsyslog的全局日志级别设为warning(只记录警告及以上级别的日志),在/etc/rsyslog.conf中修改:
    .=warning;.=err;.=crit;.=alert;.=emerg /var/log/syslog
    & ~  # 忽略更低级别的日志
    
  3. 定期审查规则:根据业务需求调整性能指标的阈值(如CPU阈值从80%调整为70%)和日志过滤规则(如新增“Disk space low”的过滤条件),确保监控的针对性。

0