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

Tha*_*Guy 3 apache-2.2

我们有一个使用 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
Run Code Online (Sandbox Code Playgroud)

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

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

此前,%vLogFormat指令将匹配客户端请求的主机名,我们会得到几个子目录下的/ var /日志/的Apache2 /题外话对应于使用各种客户端的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
Run Code Online (Sandbox Code Playgroud)

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

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

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

Cra*_*ine 5

还有%V(注意上限)和useCanonicalName选项

  • ...这正是 %V 所做的。记录处理请求的虚拟服务器的主机名。useCanonicalName 选项可让您控制是希望服务器对其名称的看法,还是客户端对名称的看法。%{Host}i 始终是客户的意见,所以 %V 是另一种方式,加上一种方式来做 %{host}i 不能做的事情。 (2认同)