我运营一个高流量网站,需要稍微控制一下 Apache2 访问日志。据我所知,一种方法是限制 Apache2 记录的内容类型。最明显的选择是限制以下三种类型的请求:
- 机器人发出的请求
- 对图像、js 文件和 css 的请求(我只对页面请求感兴趣。而不是所有资产)
- localhost(Web 服务器本身)发出的请求
我正在运行 Apache2 mod设置但当我查看访问日志时,似乎我的任何更改都不会生效tail -f
。我还运行 cronolog(如果这很重要)作为日志轮转器。以下是我的 VirtualHost conf 中的内容:
# LogLevel warn
# Variable is_local_referrer = requests made by the server itself
SetEnvIfNoCase Referer "^http://*.mysite.com/" is_local_referrer
# Variable dont_log = standard file requests
SetEnvIf Request_URI ".(jpg|jpeg|png|css|gif|ico|js)$" dont_log
# Variable is_a_robot = user agent is a robot
SetEnvIfNoCase User-Agent Robot is_a_robot
ErrorLog "|/usr/bin/cronolog /home/me/public/mysite.com/log/error_%Y_%m.log"
CustomLog "|/usr/bin/cronolog /home/me/public/mysite.com/log/access_%Y_%m.log" combined env=!is_local_referrer|!dont_log|!is_a_robot
再次,当我 tail /usr/bin/cronolog /home/me/public/mysite.com/log/access_X_X.log 时,Apache2 正在记录每个请求。
答案1
我不相信(并且文档也没有表明)您可以创建类似的 CustomLog 语句env=!is_local_referrer|!dont_log|!is_a_robot
,即跨越多个环境变量。
您可以让所有 SetEnvIf 语句设置“dont_log”,然后只需说env=!dont_log
,或者您可以让其他 SetEnvIf 语句对其他环境变量进行操作以设置将在 CustomLog 指令中使用的其他变量,以防您is_local_referrer
在其他地方使用,例如:
SetEnvIfNoCase Referer "^http://*.mysite.com/" is_local_referrer
SetEnvIf Request_URI ".(jpg|jpeg|png|css|gif|ico|js)$" is_static_asset
SetEnvIfNoCase User-Agent Robot is_a_robot
SetEnvIf is_local_referrer .* dont_log
SetEnvIf is_static_asset .* dont_log
SetEnvIf is_a_robot .* dont_log
“.*” 是为了满足所示的语法要求http://httpd.apache.org/docs/2.2/mod/mod_setenvif.html#setenvif可能还有更好的方法,因为我还没有测试过这个配置。也许你可以设置,例如,is_local_referrer=1
然后1
在“dont_log”语句中打开正则表达式。