Apache 虚拟主机的“全能”访问日志?

pix*_*x0r 16 log-files virtualhost apache-2.2

我在 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
Run Code Online (Sandbox Code Playgroud)

目前,我在 /var/log/httpd-error.log 中收到了一些随机错误,但在 /var/log/httpd-access.log 中却什么也没有。是否可以将所有访问和错误复制到共享日志文件中?是否可以在不向每个 VirtualHost 添加新条目的情况下执行此操作?

Ste*_*ski 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
Run Code Online (Sandbox Code Playgroud)

然后在 /etc/syslog.conf

# Send all HTTP log data to this file
local7.*        /var/log/http-all.log
Run Code Online (Sandbox Code Playgroud)


Kim*_*ais 0

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

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