Linux swatch命令详解

swatch(Simple WATCHer)是一个强大的日志监控工具,它可以实时监控日志文件,根据预定义的规则匹配日志内容,并在匹配到特定模式时触发相应的操作,如发送邮件、执行命令、播放声音等。

1. 安装swatch

1.1 Perl安装(依赖)

swatch是用Perl编写的,需要先确保系统已安装Perl:

# 检查Perl是否安装
perl -v

# 如果未安装,安装Perl
# Ubuntu/Debian
sudo apt-get install perl

# CentOS/RHEL
sudo yum install perl

1.2 安装swatch

使用包管理器安装:

Ubuntu/Debian系统:

sudo apt-get update
sudo apt-get install swatch

CentOS/RHEL系统:

# 启用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

2. 基本语法

swatch [选项] --config-file=配置文件

3. 常用选项

选项 说明
--config-file=文件 指定配置文件路径
--tail-file=文件 监控指定的日志文件
--daemon 以守护进程模式运行
--restart-time=时间 指定重启时间(HH:MM)
--pid-file=文件 指定PID文件路径
--help 显示帮助信息
--version 显示版本信息

4. 配置文件详解

4.1 配置文件基本结构

swatch配置文件使用简单的文本格式,每一行定义一个规则:

# 基本格式
watchfor /正则表达式/
    [操作1]
    [操作2]
    ...

4.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/

5. 基本使用示例

5.1 简单监控日志文件

# 创建配置文件
cat > ~/.swatchrc << 'EOF'
watchfor /ERROR/
    echo
    bell 1
EOF

# 启动监控
swatch --config-file=~/.swatchrc --tail-file=/var/log/syslog

5.2 监控多个日志文件

# 创建配置文件
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

5.3 以守护进程模式运行

# 创建配置文件
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

6. 高级配置示例

6.1 完整监控配置文件示例

# /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/

6.2 彩色输出配置

# 使用颜色代码
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

6.3 执行复杂命令

watchfor /数据库连接失败/
    echo
    exec "/bin/bash -c 'echo \"数据库连接失败,正在尝试重启...\" | mail -s \"数据库告警\" admin@example.com && systemctl restart mysql'"

7. 实际应用场景

场景1:Web服务器错误监控

# /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"

场景2:数据库监控

# /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"

场景3:系统安全监控

# /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"

8. 使用脚本自动化

8.1 启动脚本示例

#!/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监控已启动"

8.2 停止脚本示例

#!/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

8.3 Systemd服务配置

# /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

9. 故障排除

问题1: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

问题2:监控无响应

# 检查日志文件是否存在
ls -la /var/log/syslog

# 检查文件权限
ls -la /var/log/syslog

# 检查swatch进程
ps aux | grep swatch

# 检查PID文件
cat /var/run/swatch.pid

问题3:邮件发送失败

# 测试邮件发送
echo "Test" | mail -s "Test" admin@example.com

# 检查mail命令配置
which mail

# 检查swatch的mail配置
grep mail /etc/swatch.conf

10. 相关工具对比

工具 功能 特点 适用场景
swatch 实时日志监控 轻量、配置简单、实时响应 简单监控、快速部署
logwatch 日志分析报告 生成日报、周报、汇总分析 定期报告、趋势分析
multitail 多文件尾随查看 彩色显示、分屏查看 手动监控、多日志查看
rsyslog 系统日志服务 日志收集、转发、过滤 集中式日志管理
Elastic Stack 完整日志方案 搜索、分析、可视化 大型系统、复杂分析
Zabbix 企业监控系统 全面监控、告警、可视化 企业级监控

11. 最佳实践

配置建议

  1. 分类配置:按应用或功能创建不同的配置文件
  2. 使用throttle:避免重复告警骚扰
  3. 记录操作:重要的自动操作应该记录日志
  4. 测试规则:部署前充分测试正则表达式
  5. 备份日志:监控前备份重要日志文件
  6. 权限控制:确保swatch有适当的文件读取权限
  7. 监控swatch自身:确保监控工具本身正常运行

11.1 性能优化建议

# 1. 避免过于复杂的正则表达式
# 2. 对高频率日志使用ignore过滤
# 3. 定期清理旧日志文件
# 4. 使用专门的监控账户
# 5. 配置合理的throttle时间

11.2 安全注意事项

# 1. 限制exec命令的权限
# 2. 不要使用root运行swatch(除非必要)
# 3. 配置文件设置适当权限
chmod 600 /etc/swatch.conf
# 4. 定期审计swatch操作日志
# 5. 避免在配置中硬编码密码

12. 扩展功能

与其他工具集成
与Slack集成
# 配置文件中添加Slack通知
watchfor /ERROR/
    exec "curl -X POST -H 'Content-type: application/json' \
          --data '{\"text\":\"发现错误: $0\"}' \
          https://hooks.slack.com/services/XXX/YYY/ZZZ"
与Telegram集成
watchfor /ALERT/
    exec "curl -s -X POST https://api.telegram.org/botTOKEN/sendMessage \
          -d chat_id=CHAT_ID -d text=\"告警: $0\""
与Webhook集成
watchfor /重要事件/
    exec "curl -X POST http://monitor.example.com/webhook \
          -H 'Content-Type: application/json' \
          -d '{\"event\":\"$0\", \"timestamp\":\"$(date)\"}'"

实用技巧

  • 使用 --test 选项测试配置文件
  • 结合 tail -fgrep 进行调试
  • 为不同的日志级别使用不同的颜色
  • 使用 throttle 避免告警风暴
  • 定期更新监控规则以适应系统变化