我们有 30 多个 apache httpd 服务器,希望对日志进行分析,以便了解历史趋势和近乎“实时”的监控/警报。我主要对错误率 (4xx/5xx)、响应时间、总体请求率等感兴趣,但提取更多计算密集型统计数据(如单位时间内的唯一客户端 IP 和用户代理)也非常有用。
我倾向于将其构建为集中式收集器/服务器/存储,并且还考虑在同一系统中存储非 Apache 日志(即通用系统日志、防火墙日志等)的可能性。
显然,这其中很大一部分可能必须是定制的(至少是各个部分之间的连接以及我们进行的解析/分析),但我无法找到太多关于做过这样的事情的人的信息,至少在比谷歌/Facebook/等更小的商店。他们可以将他们的日志数据放入一百个节点的计算集群并在其上运行 Map/Reduce。
我主要寻找的是:
- 全部开源
- 某种从 Apache 机器收集日志的方法,这种方法不太占用资源,而且可以通过网络相对较快地传输日志
- 在后端以某种方式存储它们(NoSQL?键值存储?),存储一定时间(然后将它们汇总为历史平均值)
- 在这中间,一种近乎实时的绘图方式(可能还带有一些统计分析)并且希望根据这些图表发出警报。
任何关于“产品”/项目的建议/建议/想法,或者其他人如何做到这一点的描述,都会非常有帮助。不幸的是,我们并不是一个新时代的 DevOps 商店,有很多旧东西、同质基础设施和紧张的盒子。
答案1
rsyslog 可以很好地工作,如果你尝试记录的数据量足够小,你甚至可以使用免费版本的Splunk。完整版可能是一个更全面的解决方案,可能符合您想要实现的目标,从而节省您开发自己的内部监控工具的时间。
在我的工作中,我们只坚持使用 syslogd、Nagios 和 Ganglia 来满足所有监控需求,因为即使有 600 台左右的机器,它们都非常稳定。
答案2
Jason,您提到有兴趣使用 Ganglia 来监控您的 Apache Web 服务器。您是否考虑过将 mod-sflow 与 Ganglia 结合使用?
最近,添加了活动、空闲、最大工作量指标。虽然 Ganglia 非常适合趋势集群指标,但您需要使用日志分析器来报告详细的日志数据。mod-sflow 通过 UDP 将计数器和日志数据作为二进制 XDR 编码结构发送。您可以使用 sflowtool 将二进制数据转换为标准 ASCII 日志,或将其作为您自己的分析工具的基础。
答案3
如果您想要设置通用系统日志服务器,我强烈建议您看看 rsyslog,它是一款非常强大的现代系统日志实现。我喜欢它的一个原因是它可以记录到关系数据库而不是平面文件,这使得数据处理变得容易得多。
我从未在 Apache 中使用过 syslog,因此很遗憾我无法帮助您解答这部分问题。
答案4
这不像您要求的那样是一个通用的解决方案,但回想一下伦敦 PHP 会议的一次会议,BBC 说他们有一种巧妙的方法,可以实时将 apache 日志文件从许多服务器传输到中央服务器,我想他们给它起了个绰号叫 teleportd。
我记不清具体细节了,但大意是他们在每个 Apache 服务器上运行了一个小型自动重启脚本,该脚本基本上打开了一个名为 /var/log/apache2/access_log 的 fifo 命名管道,并使用 netcat 将其复制到日志服务器上的唯一 tcp 端口。然后,日志服务器将其再次发送到 /var/log/myApacheServer/access_log。
小心一点,这种方法也适用于一般的系统日志文件,尽管可能需要在系统启动期间进行初始同步。
如果您对半实时没意见,那么我会选择一个更简单的解决方案,即每 n 分钟轮换一次日志文件,并在 [postrotate] 中将它们 rsync 到中央服务器。
许多 webstats 软件包(例如 awstats 及其朋友)都假定日志文件已排序,因此在运行您需要的结果统计之前,类似 awstats 的 logresolvemerge.pl 之类的程序可能是 logServer:/var/log/*/access_log 上的有用预处理器。
Cacti 会使用 rrdtool 绘制您想要的图表,但您需要从 webstats 内部数据文件中获取数据来提供数据,这对我来说有点非结构化。
这种方法是可编写脚本的,但是当虚拟主机数量很多时会变得繁琐,因为最终会得到 vhosts*serverCount 数量的 TCP 流。
由于这都是基于文件系统的,所以在今天的世界里技术含量有点低,抱歉。