使用Apache虚拟主机的“全部捕获”访问日志?


16

我在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中却没有得到任何错误。是否可以将所有访问和错误复制到共享日志文件?是否可以在不向每个VirtualHost添加新条目的情况下执行此操作?

Answers:


17

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

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

换句话说,如果将Logging指令放在VirtualHost部分中,它将覆盖主服务器配置中的Logging指令。如果要登录到单个日志文件,请从VirtualHost部分中删除日志配置。

为简单起见,我更喜欢将所有Access数据记录到一个日志文件中。以后,您可以处理日志并将日志文件拆分为虚拟主机的日志文件。同样,写入单个日志文件比使用一次写入30个日志文件更有效地利用了计算机资源。只要确保您的LogFormat包含'%v',它将记录虚拟主机的名称。

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

您可以记录所有错误并访问共享日志文件,但是该日志文件很丑陋。首先,将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

2

我所做的是在VirtualHost部分中添加了第二条CustomLog行。但是我必须对每个单独的vhost conf文件执行此操作。它可以正常工作,并且现在在我的模板中,因此可以使用新的虚拟主机。

我的apache2现在将点击数记录到两个位置:

  1. 该虚拟主机目录中虚拟主机的详细信息,以及
  2. /var/log/apache2所有虚拟主机的组合文件中。

当然,我对这两个日志分别应用了不同的LogFormat来容纳。该/var/log/apache2日志被解析用Perl和吸进了一个高度规范化的MySQL结构进行分析和报告。Logrotate每周扫描一次。


1

好吧,如果您只想查看所有虚拟主机的实时日志,则只需键入:

tail -f /var/www/*/access.log

相同的规则适用于带有grep的cat:

 cat /var/www/*/access.log | grep "something"

或者如果日志轮转已压缩文件:

gzip -d /var/www/*/access.log.2.gz

示例已在Debian / Ubuntu上测试


0

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

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


0

我不知道您的日志文件位置是否在虚拟主机上遵循任何模式,但是如果这样做,我会忘记让Apache创建重复的日志,只在需要时才整理日志。

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

0

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

  1. 中提到的解决方案joebert
  2. 我自己的尾巴解决方案: tail -f /var/log/httpd/*access_log

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


获得多尾巴。非常有用
直到


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.