我需要分析 Apache2 网络服务器生成的日志。我正在考虑将日志通过管道传输到仅在标准输入上等待输入的脚本,或者每晚使用批处理作业分析日志。
我的要求之一涉及将一些信息写入数据库(即执行时间、大小、URI、远程 IP)。出于这个原因,我担心管道到脚本并保持数据库连接打开。所以我倾向于夜间分析。
任何人在生产环境中使用这样的设置或有任何想法?
我需要分析 Apache2 网络服务器生成的日志。我正在考虑将日志通过管道传输到仅在标准输入上等待输入的脚本,或者每晚使用批处理作业分析日志。
我的要求之一涉及将一些信息写入数据库(即执行时间、大小、URI、远程 IP)。出于这个原因,我担心管道到脚本并保持数据库连接打开。所以我倾向于夜间分析。
任何人在生产环境中使用这样的设置或有任何想法?
我建议不要使用管道,因为 foreach 请求您将在 apache 中浪费大量时间来管道到脚本并等待脚本结束以释放 apache 资源。因此,如果由于某种原因,您的数据库在执行 INSERT 时变得非常慢,您可能会让所有 apache 线程/进程等待您的脚本完成您的工作,并且不能用于处理新用户请求
您可以尝试使用mod-log-sql记录每个请求的数据库。当您的负载较低时,我的偏好是每晚进行一次,但这取决于您需要数据的最新程度。
如果您不需要实时更新数据,则将日志分析作为夜间作业运行有几个优点:
您可以控制由日志分析引起的 Web 服务器和数据库服务器上的负载,即。它不受交通高峰的影响。如果您愿意,您甚至可以在轮换日志文件后将它们移至不同的服务器进行分析。如果您的应用程序在多个 Web 服务器上运行,这将非常有用。
如果需要,您可以在将数据插入数据库之前对数据执行聚合。
几个数据库引擎支持某种批量插入,这比一次插入一条记录要快得多。
错误处理(分析代码中的错误、数据库不可用等)更简单——只需在问题解决后对相关日志数据重新运行相同的脚本即可。
我敢肯定还有其他的,这取决于您的要求和托管情况。就个人而言,我什至不会考虑从 Apache 进行管道传输,除非实时更新是绝对必要的,即便如此,我也会只提取管道脚本中需要的内容,并在夜间工作中处理其他所有内容。
如果您需要接近实时的解决方案,您应该考虑使用消息队列系统(例如ActiveMQ),并通过 Apache 日志管道将消息发布到队列。