一、前置准备:配置Syslog收集性能日志
要让Syslog成为系统性能监控的数据源,需先确保其能收集与性能相关的日志。以rsyslog(Linux主流Syslog实现)为例,需完成两项基础配置:
/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。/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格式发送到服务器。常用指标及实现方法:
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。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
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)以便分析。常用工具:
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。/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 } # 控制台输出(调试用)
}
http://localhost:5601,创建索引模式(如syslog-performance-*),通过Discover查看日志,或用Visualize构建仪表板(如CPU使用率趋势图)。四、可视化与告警:让性能监控“可见”
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}}"
}
}
}
}
/proc/stat),设置阈值告警(如内存使用率超过90%时触发SMS通知)。五、优化与维护:提升监控有效性
logrotate防止性能日志过大,占用磁盘空间。编辑/etc/logrotate.d/performance:/var/log/cpu_usage.log {
daily # 每天轮转
rotate 7 # 保留7天
compress # 压缩旧日志
missingok # 文件不存在不报错
notifempty # 空文件不轮转
}
warning(只记录警告及以上级别的日志),在/etc/rsyslog.conf中修改:.=warning;.=err;.=crit;.=alert;.=emerg /var/log/syslog
& ~ # 忽略更低级别的日志