使用Apache虚拟主机的“Catch-All”访问日志?

我在Web服务器上设置了许多虚拟主机,每个主机都有自己的错误和访问日志。 httpd.conf的相关行是这样的:

 ErrorLog /var/log/httpd-error.log LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined CustomLog /var/log/httpd-access.log combined NameVirtualHost *:80 <VirtualHost *:80> ServerName myhost.com ServerAlias www.myhost.com DocumentRoot /var/www/myhost.com/htdocs ErrorLog /var/www/myhost.com/log/error.log CustomLog /var/www/myhost.com/log/access.log combined </VirtualHost> # ... many more VirtualHosts 

目前,我在/var/log/httpd-error.log中得到了一些随机错误,但是我在/var/log/httpd-access.log中什么都没有。 是否有可能将所有访问和错误复制到共享日志文件? 是否有可能做到这一点,而不是添加到每个虚拟主机的新条目?

    请参阅http://httpd.apache.org/docs/2.2/logs.html#virtualhost

    如果CustomLog或ErrorLog指令放置在某个节中,则该虚拟主机的所有请求或错误将只logging到指定的文件。 任何没有logging指令的虚拟主机仍然会将其请求发送到主服务器日志。

    换句话说,如果将Logging指令放在VirtualHost部分中,它将覆盖主服务器configuration中的Logging指令。 如果您想logging到一个日志文件,那么从VirtualHost部分中删除日志configuration。

    为了简单起见,我更愿意将所有Access数据logging到一个日志文件中。 稍后,您可以处理日志并将日志文件分成虚拟主机的日志文件。 另外,写入单个日志文件可以更高效地使用计算机资源,然后一次写入30个日志文件。 只要确保您的LogFormat包含'%v',它将logging虚拟主机的名称。

    是否有可能将所有访问和错误复制到共享日志文件?

    您可以logging所有错误并访问共享日志文件,但日志文件很难看。 首先,将Apache日志数据发送到syslog,然后使用syslog发送到本地文件或远程日志服务器。

     # Send access logs to syslog LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined CustomLog "|/usr/bin/logger -t httpd -i -p local7.notice" combined # Send error logs to syslog ErrorLog syslog:local7 

    然后在/etc/syslog.conf中

     # Send all HTTP log data to this file local7.* /var/log/http-all.log 

    我所做的是在VirtualHost部分添加第二个CustomLog行。 但是我必须为每个单独的虚拟主机configuration文件执行此操作。 它的作品,现在在我的模板,所以新的鬼魂被采取的车。

    我的apache2现在logging到两个地方:

    1. 该虚拟主机的目录中的虚拟主机的具体情况
    2. 到所有虚拟主机的组合文件中的/var/log/apache2

    当然,我对这两个日志中的每一个应用不同的LogFormat。 /var/log/apache2 Perlparsing的,并被吸收到高度规范化的MySQL结构中进行分析和报告。 Logrotate每周清扫一次。

    我不认为这是可能的。 至less文件没有提到这样的事情。

    模拟这种行为的最佳方法是以格式定义%v标记,并在日志轮转时将日志文件的副本分割为虚拟主机特定文件。

    我不知道你的日志文件位置在虚拟主机之间是否遵循任何forms的模式,但是如果他们这样做的话,我会忘记让Apache创build一个重复的日志,而只是在我需要的时候把日志文件logging下来。

     cat /var/www/*/log/access.log > /var/www/logs/access.log 

    我也在寻找这个问题的答案。 到目前为止,我有两个解决scheme:

    1. 解决schemejoebert提到
    2. 我自己的尾巴解决scheme: tail -f /var/log/httpd/*access_log

    我希望能够在主机上的所有Web服务器活动中看到一个tail -f的视图。 我宁愿能尾巴只是一个文件,但是,因为我真的不喜欢尾处理多个文件的方式。

    你有2个可能使用ErrorLog指令http://httpd.apache.org/docs/2.2/mod/core.html#errorlog

    1)使用syslog并在[r] syslog.conf中处理重复

    2)使用pipe道,将日志条目发送到应用程序/脚本,并处理该应用程序/脚本中的重复

    是否严格遵守所有访问日志? 如果错误实际上是由虚拟主机的请求引起的,则应该在虚拟主机错误日志中logging一些内容。 在这种情况下,ls -t /var/www/*/log/error.log来确定哪个虚拟主机是罪魁祸首,然后看着这个访问日志文件似乎是一个很好的第一步,消除了很多不必要的日志读取。