我们已经使用 ELK 堆栈(Elastic、Logstash、Kibana)设置了一个中央日志系统。我们的发送器(客户端)是 fluentd,它会向 ELK 发送大量日志数据。在 fluentd 流量到达 logstash 之前,它会经过 Apache httpd 反向代理。它运行良好,但我们注意到 Apache httpd 访问日志充斥着 fluentd 访问的条目,例如:
10.x.y.z - fluentd [02/Aug/2018:10:31:12 +0200] "POST /elasticsearch/_bulk HTTP/1.1" 200 6471
我们一直在测试 If 块以设置变量“dontlogme”,然后使用 !dontlogme 配置 AccessLog。如果我们匹配 User-Agent,则此方法有效。但是如果我们尝试根据(登录)用户名制定条件,则此方法无效。
我们想要实现的是:如果用户名(来自 Basic Auth)是“fluentd”,则不要在 access.log 中记录请求。
有没有人成功做到这一点?
答案1
如果 Apache 确实无法检查“授权”标头,您可以随时通过过滤 fluentd 行的 shell 脚本来传输您的访问日志(就像使用 rotatelogs 一样)。
CustomLog "|/usr/local/bin/nofluentd.sh" combined
nofluentd.sh 脚本类似如下:
#! /usr/bin/ksh
awk '$3 != "fluentd"' | /usr/bin/rotatelogs -n 7 /var/log/apache2/access.log 86400
答案2
正如我所料,Apache 使用 SetEnvIfExpr 检查 Authorization 标头没有问题,之后您可以使用条件日志记录,例如。我创建了一个用户 fluentd,密码为 haltingd,Apache 配置如下:
SetEnvIfExpr "req('Authorization') == 'Basic Zmx1ZW50ZDpoYWx0aW5nZA=='" \
user_fluentd
CustomLog "|/usr/bin/rotatelogs -n 7 ${APACHE_LOG_DIR}/druptest.log 86400" \
combined env=!user_fluentd
Zmx1ZW50ZDpoYWx0aW5nZA== 只是 fluentd:haltingd 的 base64 编码,是浏览器进行基本身份验证时会发送的内容。