在 Apache LogFormat 定义中使用 %v 匹配 ServerName,而不是请求的特定 vhost

在 Apache LogFormat 定义中使用 %v 匹配 ServerName,而不是请求的特定 vhost

我们有一个使用 DNS 通配符的应用程序,即 *.app.example.com。我们在 Ubuntu Hardy 上使用 Apache 2.2。Apache 配置的相关部分如下。

在 /etc/apache2/httpd.conf 中:

LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" vlog

在 /etc/apache2/sites-enabled/app.example.com 中:

ServerName app.example.com
ServerAlias *.app.example.com
...
CustomLog "|/usr/sbin/vlogger -s access.log /var/log/apache2/vlogger" vlog

客户端使用自己的 URL 访问此应用程序,例如 company1.app.example.com、company2.app.example.com 等。

以前,指令%v中的LogFormat将与客户端请求的主机名匹配,并且我们会在 /var/log/apache2/vlogger 下获得与正在使用的各种客户端 URL 相对应的几个子目录。

现在,%v似乎与值匹配ServerName,因此我们只能在 /var/log/apache2/vlogger/app.example.com 下获得一个日志。这会破坏我们的日志文件分析,因为日志文件没有指示日志与哪个客户端相关。

我可以通过将其更改LogFormat为以下内容来轻松修复此问题:

LogFormat "%{Host}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" vlog

这将使用 HTTP Host: 标头来告诉 vlogger 在哪个子目录中创建日志,一切都会正常。

我唯一担心的是,这种方法在过去是有效的,但我找不到任何迹象表明最近发生了变化。

是否有其他人使用类似的配置,即通配符 + vlogger 并使用%v?它工作正常吗?

答案1

%v 一直是 vserver 的规范名称,我刚刚查看了 1.3、2.0 和 2.2 的手册,它们都说

%...v:          The canonical ServerName of the server serving the request.

https://httpd.apache.org/docs/1.3/mod/mod_log_config.html

https://httpd.apache.org/docs/2.0/mod/mod_log_config.html

https://httpd.apache.org/docs/2.2/mod/mod_log_config.html

答案2

还有%V(注意帽子)和使用规范名称选项

相关内容