一个用Go语言实现的日志监控工具,能够实时监控指定的日志文件,当检测到错误关键词时自动发送告警消息到飞书或钉钉机器人。
- 🔍 实时监控: 使用文件系统事件监控,实时检测日志文件变化
- 📁 目录监控: 支持监控整个目录,自动发现新增日志文件
- 🔄 递归监控: 支持递归监控子目录,灵活配置监控范围
- 🎯 关键词过滤: 支持自定义错误关键词,精确匹配告警内容
- 📝 格式过滤: 支持指定文件扩展名,只监控特定格式的日志文件
- 📱 多平台通知: 支持飞书和钉钉机器人消息推送
- ⚙️ YAML配置: 简单易用的YAML配置文件
- 🚀 轻量高效: 低资源占用,高性能监控
- 🔒 安全支持: 支持钉钉机器人签名验证
- 💾 内存优化: 智能内存管理,支持大规模文件监控
- 🧹 自动清理: 定期清理无效文件记录,保持系统稳定
go mod tidy
go build -o log-monitor复制并修改 config.yaml 文件:
# 监控的日志文件列表
log_files:
- path: "/var/log/app/application.log"
keywords:
- "ERROR"
- "FATAL"
- "Exception"
enabled: true
# 通知器配置
notifiers:
# 飞书机器人
- type: "feishu"
webhook: "https://open.feishu.cn/open-apis/bot/v2/hook/your-webhook-url"
enabled: true# 使用默认配置文件监控单个文件
./log-monitor
# 指定配置文件
./log-monitor -config /path/to/your/config.yaml创建测试目录和配置:
# 创建测试目录结构
mkdir -p test-logs/app1 test-logs/app2 test-logs/backup
# 创建测试配置文件
cat > test-directory-config.yaml << EOF
log_directories:
- path: "./test-logs"
keywords: ["ERROR", "FATAL"]
extensions: [".log", ".txt"]
recursive: true
exclude_dirs: ["backup"]
enabled: true
notifiers:
- type: "feishu"
webhook: "your-webhook-url"
enabled: true
EOF
# 运行监控
./log-monitor -config test-directory-config.yaml在另一个终端中创建测试日志:
# 创建会触发告警的日志
echo "$(date) ERROR: This is a test error message" >> test-logs/app1/test.log
# 创建不会触发告警的日志
echo "$(date) INFO: This is an info message" >> test-logs/app1/test.log
# 在排除目录中创建日志(不会被监控)
echo "$(date) ERROR: This error will be ignored" >> test-logs/backup/backup.loglog_files:
- path: "/path/to/logfile.log" # 日志文件路径
keywords: # 错误关键词列表
- "ERROR"
- "FATAL"
- "Exception"
enabled: true # 是否启用监控log_directories:
- path: "/var/log/apps" # 监控目录路径
keywords: # 错误关键词列表
- "ERROR"
- "FATAL"
- "Exception"
extensions: [".log", ".txt"] # 监控的文件扩展名
recursive: true # 是否递归监控子目录
exclude_dirs: ["backup", "temp"] # 排除的子目录
enabled: true # 是否启用监控path: 要监控的目录路径(绝对路径)keywords: 触发告警的关键词列表extensions: 要监控的文件扩展名,如[".log", ".txt", ".out"]recursive: 是否递归监控子目录true: 监控所有子目录false: 只监控指定目录,不包含子目录
exclude_dirs: 要排除的子目录名称列表enabled: 是否启用此目录监控
notifiers:
- type: "feishu"
webhook: "https://open.feishu.cn/open-apis/bot/v2/hook/your-webhook-url"
enabled: truenotifiers:
- type: "dingtalk"
webhook: "https://oapi.dingtalk.com/robot/send?access_token=your-access-token"
secret: "your-secret-key" # 可选,用于签名验证
enabled: truenotifiers:
- type: "dingtalk"
webhook: "https://oapi.dingtalk.com/robot/send?access_token=your-access-token"
enabled: true- 在飞书群聊中添加机器人
- 选择"自定义机器人"
- 复制Webhook地址到配置文件
- 在钉钉群聊中添加机器人
- 选择"自定义机器人"
- 设置安全设置(推荐使用加签方式)
- 复制Webhook地址和密钥到配置文件
当检测到错误时,会发送如下格式的消息:
🚨 日志告警
文件: /var/log/app/application.log
时间: 2024-01-15 14:30:25
内容: ERROR: Database connection failed
- 文件权限: 确保程序有读取日志文件和目录的权限
- 文件路径: 使用绝对路径指定日志文件和目录
- 关键词匹配: 关键词匹配不区分大小写
- 网络连接: 确保服务器能访问飞书/钉钉的API
- 资源占用: 监控大量文件时注意系统资源使用情况
- 文件大小限制: 默认限制单个文件最大100MB,超过限制的文件会被跳过
- 内存管理: 程序会定期清理无效文件记录,每30分钟执行一次
- 目录监控:
- 递归监控会监控所有子目录,请合理设置排除目录
- 新创建的文件会自动被监控
- 删除的文件会自动从监控列表中移除
- Go 1.21 或更高版本
- Linux/macOS/Windows 操作系统
- 网络连接(用于发送通知)
github.com/fsnotify/fsnotify: 文件系统事件监控gopkg.in/yaml.v3: YAML配置文件解析
MIT License
欢迎提交Issue和Pull Request来改进这个项目!