apache默认access_log不记录虚拟主机名,需通过%{host}i变量提取请求头host字段实现区分;推荐为各virtualhost单独配置customlog并用绝对路径命名日志文件,以提升分析效率。

Apache 默认的访问日志(access_log)本身不直接记录虚拟主机名,但可以通过自定义日志格式,把 ServerName 或请求头中的 Host 字段显式写入日志行,从而区分不同虚拟主机的流量。
在日志格式中加入虚拟主机标识
最常用且可靠的方式是使用 %{Host}i 变量,它提取 HTTP 请求头里的 Host 字段(即用户实际访问的域名),不受虚拟主机配置中 ServerName 是否匹配的影响,适合多域名共存场景:
- 在
httpd.conf或虚拟主机配置中定义新日志格式:
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
其中 %v 表示“被匹配的虚拟主机的 ServerName”,而 %{Host}i 更推荐用于真实访问域名(尤其当存在 ServerAlias 或泛域名时)。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 为每个虚拟主机单独指定 CustomLog,并启用该格式:
ServerName siteA.example.com
DocumentRoot /var/www/siteA
CustomLog /var/log/httpd/siteA_access.log vhost_combined
按虚拟主机分离日志文件更利于分析
将不同站点的日志写入独立文件,比后期从混合日志里过滤更高效、更准确:
- 每个
<virtualhost></virtualhost>块内配置专属CustomLog和ErrorLog - 路径建议用绝对路径,避免因
ServerRoot变动导致日志写入失败 - 文件名可包含域名或站点标识,例如:
siteA_access.log、blog.example.com_error.log
验证日志是否正确捕获 Host 域名
发起一次真实访问(如用 curl 或浏览器),然后检查对应日志行是否含预期域名:
siteA.example.com:80 192.168.1.100 - - [20/Aug/2026:10:25:33 +0800] "GET / HTTP/1.1" 200 1234 "-" "curl/7.68.0"若看到 siteA.example.com:80 开头,说明 %v 生效;若想看到用户实际输入的域名(比如 www.siteA.example.com),应改用 %{Host}i 并确保请求头携带该值。
注意事项与常见问题
- HTTP/1.0 请求可能不带 Host 头,%{Host}i 会为空,此时建议配合 %v 使用
- 反向代理环境下,原始 Host 可能被覆盖,需在代理层透传(如 Nginx 中加
proxy_set_header Host $host;) - 日志轮转工具(如 logrotate)需同步配置多个站点日志文件,避免遗漏
- 不建议开启
HostnameLookups On来解析 IP 主机名——性能损耗大,且对区分虚拟主机无帮助










