我有一个带有许多(数千个)VirtualHost 的 Web 服务器。在当前配置下,Apache 为每个 VirtualHost 填充 2 个文件:error.log + access.log。Apache 以 prefork 模式工作,为了避免同时打开太多文件描述符,我希望所有 VirtualHost 都使用一个 access.log 和 error.log。
CRON 任务将每天为每个 VirtualHost 拆分一次文件,因此我需要在 *.log 文件的每一行上显示 VirtualHost 名称。这对于 access.log 来说非常简单:
LogFormat "%V:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
CustomLog /var/log/apache2/vhosts_access.log vhost_combined
%V 给了我 VirtualHost 名称,这对于拆分文件来说已经足够了。
但我就是找不到 ErrorLog 的等效设置。
问题:
- 您认为尝试识别每个 error.log 行的来源是否有意义
- 你知道解决办法吗?
答案1
ErrorLog
中的指令Apache
无法定制。
如果您的目的是减少 FD,那么使用单个访问日志和数千个虚拟主机,您将至少减少 n*virtualhosts 的数量(FD)。
我的建议是保留每个 VH 的错误日志,并且正如您所说,拆分您的访问日志,就像您已经这样做了。
如果必须配置单个错误日志,则 error_log 中的每个条目在 access_log 中都有对应的条目,因此使用一些 perl magic 就可以完成这项工作,但我认为这不值得付出努力,因为它需要一些时间来处理并且很容易出错。
答案2
你可以使用错误日志带有管道的指令到单行 bash 脚本 - 即
ErrorLog "| /script_location 'log destination' 'virtualhost.com'"
...脚本:
#!/bin/bash
read INCOMING_LOG && echo ${2}" - "${INCOMING_LOG} >> $1