我想要什么:我希望能够在 Grafana 或 Chronograf(或任何 InfluxDB 前端)中查看图表,其中包含有关特定字符串何时出现在日志文件中的信息。该图将有两个轴:
- 水平(X):时间
- 垂直 (Y):字符串的出现次数(在此特定时间点)。
这些图表的一些具体示例可以是(Linux 服务器):
- 获取 SSH 登录尝试失败的次数(在安全日志中检查“无效用户的密码失败”)
- 获取 Nginx 日志中 404 个 HTTP 代码的数量。
想法:我已经尝试了几件事,但我找不到任何好的解决方案。
我的第一个想法是使用Rsyslog:
- 将日志添加到 Syslog(或直接在 Syslog 中登录)
- 创建一个 /opt/increase.sh 脚本,该脚本执行 curl -XPOST 到 Influx 添加值“1”。
- 使用 omprog 监控 Syslog,并在每次消息匹配“无效用户的密码失败”(或您想要的字符串)时调用 increase.sh。
我喜欢这个解决方案的地方:
- 您几乎可以实时获得发生次数。
- 非常颗粒状。每个计数的元素都有自己的时间戳。
我不喜欢的:
- 如果我得到足够多的事件(假设一秒钟内发生 20 次),一个执行 + 一个请求对系统来说看起来很重。它可以扩展到我基本上窒息的地步。
第二个想法:计算最后 X 分钟内出现的次数。在这种情况下,我将有一个脚本(occurrences.sh):
- 打印所有日志文件并获取最近 X 分钟内出现的次数(我们假设所有日志条目都有一个 DateTime 值),并计算它们。
- 发送此值,以及有关何时调用occurrences.sh 的时间戳(这将通过 Cron 作业或 Telegraf 执行文件完成)。
我喜欢这个解决方案的地方:
- 如果您有 1 次出现 1000 无关紧要,您向数据库发送单个请求,系统负载/性能不会受到影响。
我不喜欢它的地方:
- 很难更改何时调用脚本(您需要每 X 分钟调用一次并且只读取最后 X 分钟),以避免出现两次读取相同值等错误。
- 你失去了粒度。如果您每 10 分钟阅读一次,并且出现 1000 次,则可能是每分钟 100 次,或者在同一秒内全部出现。你不会知道的。
所以我不确定哪种解决方案会更好,或者如果有人有其他想法或知道任何其他工具,那就太棒了。
谢谢!