As far as I can see Nginx supports by default 2 log files: error_log
(tracks issues related to the Nginx server itself) and access_log
(tracks requests processed by Nginx). Whilst it is possible to control the format of access_log
with the log_format
directive, I have been unsuccessful at finding a way of logging only certain requests to a separate file, and therefore would like to ask the question on SF as a reference for future readers:
Is there a way to log certain requests to a different log file than the one defined by access_log
?
FYI the reason behind this question is that I have a rule that denies access to unwanted crawlers with a 200 (because 403 would give them a hint that they're being blocked), and filtering those requests out of the access_log
becomes more difficult.
cjc
put me on the right track. Usingaccess_log
in anif
statement by itself is not possible (You get anginx: [emerg] "access_log" directive is not allowed here
error). So the workaround is as follows:access_log supports if:
(access_log path [format [buffer=size [flush=time]] [if=condition]];)
access_log /var/.... if $crawler;
Source:
http://nginx.org/en/docs/http/ngx_http_log_module.html
You should be able to put an
access_log
directive inside anif
block, according to the documentation:http://wiki.nginx.org/HttpLogModule
So, you should be able to do something like:
When I came upon this post I was looking for a way to send AWS ELB healthcheck logs to a separate file as they were clogging up
access.log
. I was never able to getaccess_log
to work withif
inside alocation
block, and this does not work either:In a sea of braces it is easy to forget that the NGINX configuration file is not a programming language.
What I ended up with, albeit clunky looking, is this:
Regular traffic goes to
access.log
and ELB healthcheck logs go toelb-healthcheck.log
.