Apache CustomLog 支持条件日志记录,可通过 env= 实现请求级过滤、多站点日志分离、真实IP记录及原生管道轮转,提升日志精准性与可维护性。

Apache 的 CustomLog 支持条件日志记录,这是控制日志噪音、聚焦关键请求的核心能力。它不靠外部脚本过滤,而是在写入前就决定“这条要不要记”,既节省磁盘 IO,又避免后期分析被无效条目淹没。
用 env= 实现请求级过滤
通过 SetEnvIf 设置环境变量,再在 CustomLog 中用 env= 或 env=!xxx 控制是否记录:
-
屏蔽健康检查路径:
SetEnvIf Request_URI "^/health|^/ping$" no_logCustomLog logs/access.log combined env=!no_log -
只记录错误响应:
SetEnvIf Status "^[45]" log_errorCustomLog logs/error_only.log combined env=log_error -
排除特定 User-Agent(如监控探针):
SetEnvIfNoCase User-Agent "Zabbix|Datadog|UptimeRobot" no_log
按虚拟主机或路径分离日志文件
多站点共用 Apache 时,必须为每个站点单独配置 CustomLog,否则所有请求混在一个文件里无法归因:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 在
<VirtualHost *:80>块内直接写:CustomLog /var/log/apache2/site-a-access.log combinedErrorLog /var/log/apache2/site-a-error.log - 对静态资源集中过滤:
SetEnvIf Request_URI "\.(jpg|jpeg|png|gif|css|js|woff2?)$" staticCustomLog logs/access.log combined env=!static
真实客户端 IP 的可靠记录
挂了 CDN 或反向代理后,%h 变成代理 IP。需启用 mod_remoteip 并配置可信代理段,再用 %a 替代 %h:
- 加载模块:
LoadModule remoteip_module modules/mod_remoteip.so - 在全局或虚拟主机中设置:
RemoteIPHeader X-Forwarded-ForRemoteIPInternalProxy 192.168.0.0/16 10.0.0.0/8 172.16.0.0/12RemoteIPTrustedProxy 173.245.48.0/20 103.21.244.0/22(Cloudflare 网段示例) - 自定义格式中使用
%a获取真实 IP:LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" realip_combined
日志轮转不中断服务
避免用 logrotate kill -USR1 导致短暂丢日志,推荐 Apache 原生管道轮转:
- 用
rotatelogs按时间切分(每 2 小时):CustomLog "|/usr/bin/rotatelogs -l /var/log/apache2/access_%Y%m%d%H.log 7200" realip_combined - 按大小切分(单个文件不超过 100MB):
CustomLog "|/usr/bin/rotatelogs -l /var/log/apache2/access_%Y%m%d.log 100M" realip_combined -
注意:路径中含
%会被rotatelogs解析为时间格式符;加-l使用本地时区,避免 GMT 时间错乱。

















