![apache 是否在每次访问时打开和关闭每个日志?](https://linux22.com/image/769973/apache%20%E6%98%AF%E5%90%A6%E5%9C%A8%E6%AF%8F%E6%AC%A1%E8%AE%BF%E9%97%AE%E6%97%B6%E6%89%93%E5%BC%80%E5%92%8C%E5%85%B3%E9%97%AD%E6%AF%8F%E4%B8%AA%E6%97%A5%E5%BF%97%EF%BC%9F.png)
问题是关于访问和错误日志,特别是在多个主机(安装在多台服务器上的 apache 实例)以及将日志集中保存在网络文件系统上时。
apache 每次写入后都会关闭每个日志文件吗?
如果是,那么在托管许多站点且每个站点都有自己的日志的繁忙服务器上,这似乎是一个潜在的性能瓶颈?
如果不是,那么当多个服务器写入网络文件系统上的单个日志位置时,解决方案是什么?
答案1
apache 每次写入后都会关闭每个日志文件吗?
你可以从中读到:
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 等)将所有集群节点的日志事件发送到单个大数据数据库