How to stop logging HTTP-Requets from check_http in Apache 2
Photo by Sena: https://www.pexels.com/photo/wood-covered-in-snow-10944259/
I encountered a situation where the HTTP(S)-Requests done by Icinga via check_http checkplugin seriously messed up the generated website traffic reports. The software used to generate said reports wasn't capable of filtering out certain requests based on User-Agents. Restructuring the report in a way that the hits from the monitoring requests could be easily identified was also out of the question as this would generate too much follow-up work for other involved parties & systems.
The solution (or rather: workaround...) was to simply omit the logging of said monitoring requests to the logfile of the Apache vHost.
The relevant line in the virtual host config was the following:
CustomLog /var/log/apache2/host.domain-tld-access.log combined
This defines where to store the logfile in the "NCSA extended/combined log format" as specified on https://httpd.apache.org/docs/2.4/mod/mod_log_config.html#formats respectively in the /etc/apache2/apache2.conf
in Debian.
root@host:~ # grep LogFormat /etc/apache2/apache2.conf
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
SetEnvIf to the rescue!
Apache2 allows us to set environment variables for each request via the SetEnvIf directive (among others). This is documented on the page for mod_setenvif
: https://httpd.apache.org/docs/2.4/mod/mod_setenvif.html#setenvif
A typical line in the access.log would log like the following:
256.133.7.42 - - [30/Dec/2024:05:46:18 +0100] "GET / HTTP/1.0" 302 390 "-" "check_http/v2.3.1 (monitoring-plugins 2.3.1)
Since the requests were for the URI /
we can't exclude requests based on Request_URI. Instead, we have to go for the supplied user-agent. Fortunately this is quite unique.
To catch future versions we use a wildcard-regex for the version numbers. As environment variable I choose monitoring
.
# Don't log Icinga monitoring requests
SetEnvIf User-Agent "check_http/v(.*) \(monitoring-plugins (.*)\)" monitoring
Now all that is needed is to adopt the CustomLog-directive in the virtual host configuration. As the documentation for the CustomLog-directive explains we can access the environment variables via the env= option. Negating this will simply omit all requests with that environment variable set.
Therefore our resulting CustomLog line now looks like this:
CustomLog /var/log/apache2/admin.brennt.net-access.log combined env=!monitoring
Now just check your configuration for errors via apach2ctl configtest
and restart your Apache webserver.