apache 是否在每次访问时打开和关闭每个日志?

apache 是否在每次访问时打开和关闭每个日志?

问题是关于访问和错误日​​志,特别是在多个主机(安装在多台服务器上的 apache 实例)以及将日志集中保存在网络文件系统上时。

apache 每次写入后都会关闭每个日志文件吗?

如果是,那么在托管许多站点且每个站点都有自己的日志的繁忙服务器上,这似乎是一个潜在的性能瓶颈?

如果不是,那么当多个服务器写入网络文件系统上的单个日志位置时,解决方案是什么?

答案1

apache 每次写入后都会关闭每个日志文件吗?

使用源,它位于: https://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/modules/loggers/mod_log_config.c?view=markup

你可以从中读到:

251     * log_writer is NULL before the log file is opened and is
252     * set to a opaque structure (usually a fd) after it is opened.

这暗示它只打开一次。事实上,如果你看一下代码,你会发现它在初始化时很早就打开了,然后就再也没有关闭过,这是出于明显的性能原因。

如果不是,那么当多个服务器写入网络文件系统上的单个日志位置时,解决方案是什么?

绝对不要这样做,原因有二。首先不要以这种方式进行远程记录。本地记录(并单独发送日志文件,例如,您可以每小时轮换一次)或使用适当的守护进程,syslog默认情况下知道如何通过 UDP(或 TCP)发送日志内容,新解决方案也是如此。不要安装远程磁盘并向其中写入日志文件,这会降低性能并产生一大堆问题(特别是如果您指的是“NFS”中的远程)。

即使在本地,每个应用程序也应该记录到自己的日志文件中,不要让多个应用程序记录到同一个文件,这必然会产生各种竞争条件、覆盖等。即使分叉,Apache 本身也是一个应用程序,但如果你在同一台主机上分别运行两个具有不同配置的 Apache,它们应该分别记录到自己的日志文件中。

或者查看 Apache 功能以记录到管道,但这也有缺点。

答案2

据我所知,不能让多个 Apache Web 服务器同时写入同一个日志文件。

对于集群,你可以让每个节点写入自己的日志文件,然后进行一些后期处理来合并它们,或者让 Apache 生成 syslog 事件,将它们发送到中央 syslog 服务器,然后你可以在那里将它们合并为一个文件,或者使用日志聚合解决方案(如 ELK Stack、Graylog、Splunk 等)将所有集群节点的日志事件发送到单个大数据数据库

相关内容