为每个 apache 虚拟主机单独记录日志,必须将 errorlog 和 customlog 指令明确写入对应 块内,配合 ${apache_log_dir} 变量、唯一 logformat 别名及 setenvif 条件日志,实现路径隔离、格式定制与内容过滤。

要为每个 Apache 虚拟主机单独记录日志,关键不是“全局统一再筛选”,而是把 ErrorLog 和 CustomLog 指令明确写在对应的 <virtualhost></virtualhost> 块内部。这样 Apache 才会为该站点启用独立的日志流,避免多个站点日志混在一起。
日志指令必须放在 VirtualHost 块内
Apache 不会自动按站点区分日志。只有把日志路径和格式声明放在 <virtualhost></virtualhost> 或 <virtualhost></virtualhost> 内部,才能实现真正的隔离:
ErrorLog /var/log/apache2/site-a-error.logCustomLog /var/log/apache2/site-a-access.log combined
如果这些指令写在主配置(如 apache2.conf)顶层,所有站点都会共用同一份日志文件,无法归因。
推荐使用 ${APACHE_LOG_DIR} 简化路径
Linux 发行版(如 Ubuntu/Debian)预定义了变量 ${APACHE_LOG_DIR},指向 /var/log/apache2;CentOS/RHEL 则常用 /var/log/httpd。用变量可提升配置可移植性:
ErrorLog ${APACHE_LOG_DIR}/blog.example.com-error.logCustomLog ${APACHE_LOG_DIR}/blog.example.com-access.log combined
注意:确保目标目录存在,且运行用户(如 www-data 或 apache)对该目录有写权限。
Apache 2.4.62 官方 tar.gz 源码包是 Linux 及类 Unix 系统构建 Web 服务器的核心基础。通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
自定义日志格式需配合别名使用
若需为不同站点设置不同字段(例如加应用标识、响应时间或排除静态资源),应在对应 <virtualhost></virtualhost> 中定义专属 LogFormat 并起唯一名称:
LogFormat "%h %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"app1\" %D" app1_fullCustomLog ${APACHE_LOG_DIR}/app1-access.log app1_full
同名 LogFormat 在后出现的虚拟主机中会覆盖前一个,因此建议各站点使用不同别名,避免意外覆盖。
配合条件日志进一步过滤内容
在站点级日志基础上,还可添加请求级过滤,减少无效条目。例如在 <virtualhost></virtualhost> 内加入:
SetEnvIf Request_URI "\.(js|css|png|jpg|gif)$" staticCustomLog ${APACHE_LOG_DIR}/site-access.log combined env=!staticSetEnvIf Status "^[45]" error_responseCustomLog ${APACHE_LOG_DIR}/site-errors-only.log combined env=error_response
这类条件日志直接在写入前判断,不增加磁盘 IO,也避免后期清洗负担。










