swatch(Simple WATCHer)是一个强大的日志监控工具,它可以实时监控日志文件,根据预定义的规则匹配日志内容,并在匹配到特定模式时触发相应的操作,如发送邮件、执行命令、播放声音等。
swatch是用Perl编写的,需要先确保系统已安装Perl:
# 检查Perl是否安装
perl -v
# 如果未安装,安装Perl
# Ubuntu/Debian
sudo apt-get install perl
# CentOS/RHEL
sudo yum install perl
使用包管理器安装:
sudo apt-get update
sudo apt-get install swatch
# 启用EPEL仓库
sudo yum install epel-release
# 安装swatch
sudo yum install swatch
# 下载源码
wget https://github.com/ToddAtkins/swatch/archive/refs/tags/v3.2.4.tar.gz
# 解压
tar -xzf v3.2.4.tar.gz
cd swatch-3.2.4
# 编译安装
perl Makefile.PL
make
sudo make install
swatch [选项] --config-file=配置文件
| 选项 | 说明 |
|---|---|
--config-file=文件 |
指定配置文件路径 |
--tail-file=文件 |
监控指定的日志文件 |
--daemon |
以守护进程模式运行 |
--restart-time=时间 |
指定重启时间(HH:MM) |
--pid-file=文件 |
指定PID文件路径 |
--help |
显示帮助信息 |
--version |
显示版本信息 |
swatch配置文件使用简单的文本格式,每一行定义一个规则:
# 基本格式
watchfor /正则表达式/
[操作1]
[操作2]
...
| 指令 | 说明 | 示例 |
|---|---|---|
watchfor |
定义要匹配的正则表达式 | watchfor /ERROR/ |
echo |
在终端显示匹配内容 | echo |
bell |
终端响铃 | bell 3(响铃3次) |
exec |
执行系统命令 | exec "command" |
mail |
发送邮件 | mail address=admin@example.com,subject=Alert |
throttle |
限制重复告警频率 | throttle 01:00(1小时内只告警一次) |
continue |
继续匹配后续规则 | continue |
ignore |
忽略特定模式 | ignore /INFO/ |
# 创建配置文件
cat > ~/.swatchrc << 'EOF'
watchfor /ERROR/
echo
bell 1
EOF
# 启动监控
swatch --config-file=~/.swatchrc --tail-file=/var/log/syslog
# 创建配置文件
cat > /etc/swatch.conf << 'EOF'
# 监控系统日志
watchfor /ERROR/
echo red
bell 2
# 监控认证日志
watchfor /Failed password/
echo yellow
mail addresses=admin@example.com,subject="SSH登录失败"
EOF
# 使用脚本监控多个文件
#!/bin/bash
LOG_FILES="/var/log/syslog /var/log/auth.log"
for LOG_FILE in $LOG_FILES; do
swatch --config-file=/etc/swatch.conf --tail-file=$LOG_FILE &
done
# 创建配置文件
cat > /etc/swatch.conf << 'EOF'
watchfor /CRITICAL/
echo
exec "/usr/local/bin/send_alert.sh"
EOF
# 以守护进程模式启动
swatch --config-file=/etc/swatch.conf \
--tail-file=/var/log/app.log \
--daemon \
--pid-file=/var/run/swatch.pid
# /etc/swatch/security.conf
# SSH登录失败监控
watchfor /Failed password/
echo magenta
bell 3
mail addresses=admin@example.com,subject="SSH登录失败告警",body="发现SSH登录失败尝试!\n\n$0\n\n时间: $timestamp"
throttle 00:05 # 5分钟内只告警一次
# 系统错误监控
watchfor /ERROR|CRITICAL|FATAL/
echo red
exec "/usr/local/bin/log_error.sh '$0'"
# 磁盘空间不足监控
watchfor /No space left on device/
echo yellow
mail addresses=admin@example.com,subject="磁盘空间不足"
exec "df -h > /tmp/disk_usage.txt"
# 忽略INFO级别日志
ignore /INFO/
# 使用颜色代码
watchfor /ERROR/
echo red on_white blink # 红色字体,白色背景,闪烁
bell
watchfor /WARNING/
echo yellow bold # 黄色粗体
watchfor /SUCCESS/
echo green # 绿色
# 颜色选项:
# 字体颜色: black, red, green, yellow, blue, magenta, cyan, white
# 背景颜色: on_black, on_red, on_green, on_yellow, on_blue, on_magenta, on_cyan, on_white
# 效果: bold, underscore, blink, reverse
watchfor /数据库连接失败/
echo
exec "/bin/bash -c 'echo \"数据库连接失败,正在尝试重启...\" | mail -s \"数据库告警\" admin@example.com && systemctl restart mysql'"
# /etc/swatch/nginx.conf
# 监控Nginx错误日志
watchfor /error|crit|alert|emerg/
echo red
mail addresses=webadmin@example.com,subject="Nginx错误告警"
throttle 00:10
# 监控HTTP 5xx错误
watchfor /HTTP\/1\.1" 5[0-9][0-9]/
echo yellow
exec "/usr/local/bin/notify_webadmin.sh '$0'"
# 监控访问频率过高
watchfor /同一个IP.*10次/
echo magenta
exec "echo '疑似CC攻击: $0' >> /var/log/firewall.log"
# /etc/swatch/mysql.conf
# 监控MySQL错误日志
watchfor /ERROR|Warning|Aborted connection/
echo yellow
mail addresses=dba@example.com,subject="MySQL异常"
# 监控慢查询
watchfor /Query_time.*[5-9]\.[0-9]/
echo red
exec "/usr/local/bin/analyze_slow_query.sh"
# 监控死锁
watchfor /deadlock/
echo red blink
bell 5
exec "/usr/local/bin/kill_deadlock.sh"
# /etc/swatch/security.conf
# 监控sudo使用
watchfor /sudo.*COMMAND/
echo cyan
exec "echo 'sudo使用记录: $0' >> /var/log/sudo_monitor.log"
# 监控文件修改
watchfor /File modified.*\/etc\//
echo red
mail addresses=secadmin@example.com,subject="关键文件被修改"
# 监控root登录
watchfor /session opened for user root/
echo magenta bold
exec "/usr/local/bin/log_root_login.sh"
#!/bin/bash
# /usr/local/bin/start_swatch.sh
# 启动所有swatch监控
CONFIG_DIR="/etc/swatch"
LOG_DIR="/var/log"
PID_DIR="/var/run/swatch"
# 创建PID目录
mkdir -p $PID_DIR
# 为每个配置文件启动swatch
for CONFIG in $CONFIG_DIR/*.conf; do
CONFIG_NAME=$(basename $CONFIG .conf)
LOG_FILE="$LOG_DIR/${CONFIG_NAME}.log"
echo "启动监控: $CONFIG_NAME"
swatch --config-file=$CONFIG \
--tail-file=$LOG_FILE \
--daemon \
--pid-file=$PID_DIR/${CONFIG_NAME}.pid
done
echo "所有swatch监控已启动"
#!/bin/bash
# /usr/local/bin/stop_swatch.sh
# 停止所有swatch监控
PID_DIR="/var/run/swatch"
if [ -d "$PID_DIR" ]; then
for PID_FILE in $PID_DIR/*.pid; do
if [ -f "$PID_FILE" ]; then
PID=$(cat $PID_FILE)
echo "停止进程: $PID"
kill $PID
rm $PID_FILE
fi
done
echo "所有swatch监控已停止"
else
echo "swatch未运行"
fi
# /etc/systemd/system/swatch.service
[Unit]
Description=Swatch Log Monitor
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/start_swatch.sh
ExecStop=/usr/local/bin/stop_swatch.sh
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
# 启用服务
sudo systemctl daemon-reload
sudo systemctl enable swatch
sudo systemctl start swatch
# 检查Perl依赖
perl -c /usr/bin/swatch
# 检查配置文件语法
swatch --config-file=config.conf --test
# 查看错误信息
swatch --config-file=config.conf --tail-file=logfile 2>&1 | head -20
# 检查日志文件是否存在
ls -la /var/log/syslog
# 检查文件权限
ls -la /var/log/syslog
# 检查swatch进程
ps aux | grep swatch
# 检查PID文件
cat /var/run/swatch.pid
# 测试邮件发送
echo "Test" | mail -s "Test" admin@example.com
# 检查mail命令配置
which mail
# 检查swatch的mail配置
grep mail /etc/swatch.conf
| 工具 | 功能 | 特点 | 适用场景 |
|---|---|---|---|
| swatch | 实时日志监控 | 轻量、配置简单、实时响应 | 简单监控、快速部署 |
logwatch |
日志分析报告 | 生成日报、周报、汇总分析 | 定期报告、趋势分析 |
multitail |
多文件尾随查看 | 彩色显示、分屏查看 | 手动监控、多日志查看 |
rsyslog |
系统日志服务 | 日志收集、转发、过滤 | 集中式日志管理 |
Elastic Stack |
完整日志方案 | 搜索、分析、可视化 | 大型系统、复杂分析 |
Zabbix |
企业监控系统 | 全面监控、告警、可视化 | 企业级监控 |
# 1. 避免过于复杂的正则表达式
# 2. 对高频率日志使用ignore过滤
# 3. 定期清理旧日志文件
# 4. 使用专门的监控账户
# 5. 配置合理的throttle时间
# 1. 限制exec命令的权限
# 2. 不要使用root运行swatch(除非必要)
# 3. 配置文件设置适当权限
chmod 600 /etc/swatch.conf
# 4. 定期审计swatch操作日志
# 5. 避免在配置中硬编码密码
# 配置文件中添加Slack通知
watchfor /ERROR/
exec "curl -X POST -H 'Content-type: application/json' \
--data '{\"text\":\"发现错误: $0\"}' \
https://hooks.slack.com/services/XXX/YYY/ZZZ"
watchfor /ALERT/
exec "curl -s -X POST https://api.telegram.org/botTOKEN/sendMessage \
-d chat_id=CHAT_ID -d text=\"告警: $0\""
watchfor /重要事件/
exec "curl -X POST http://monitor.example.com/webhook \
-H 'Content-Type: application/json' \
-d '{\"event\":\"$0\", \"timestamp\":\"$(date)\"}'"
--test 选项测试配置文件tail -f 和 grep 进行调试throttle 避免告警风暴