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

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

答案1

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 文件都执行此操作。它有效,并且现在在我的模板中,因此新的 vhost 已处理完毕。

我的 apache2 现在将点击记录到两个地方:

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

当然,我对这两个日志分别应用不同的 LogFormat 以适应不同的情况。日志/var/log/apache2使用 Perl 进行解析,并被吸入高度规范化的 MySQL 结构中进行分析和报告。Logrotate 每周清理一次。

答案3

如果你只想在一个地方查看所有虚拟主机的实时日志,那么你可以输入:

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

同样的规则适用于 cat 和 grep:

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

或者如果 log rotate 已经压缩了文件:

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

示例在 Debian/Ubuntu 上测试

答案4

我不知道您的日志文件位置是否在虚拟主机中遵循任何类型的模式,但如果它们确实如此,我会忘记让 Apache 创建重复日志,而只是在我需要它们时对日志进行 cat 处理。

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

相关内容