Rotate Nginx logs without logrotate
I wanted a quick and easy way to rotate Nginx logs, preferably without having to install and configure extra software.
After some searching I discovered that the access_log directive supports setting variables in the file path. That means if you have a variable with the current date then it can be placed in the path and, when the variable changes, the log path updates and the logs get rotated.
There are a few caveats to using variables in the access_log
path though so
worth checking the documentation to see if they’re a good fit before using them.
For my use case they seemed like a good fit.
Looking at the documentation the most useful looking variable to get the current date from is time_iso8601 which can be used to extract the date (and time if wanted) from.
The solution I ended up with was adding this to the http config:
http {
# ..rest of http config...
open_log_file_cache max=1000 inactive=30s valid=1m min_uses=1;
map $time_iso8601 $year_month {
default 'date-parse-error';
'~^(?<yearmonth>\d{4}-\d{2})' $yearmonth;
}
}
And then updating the access_log
directive in the server configs to:
server {
# ..rest of server config...
access_log /srv/example.com/logs/$year_month-access.log;
}
Unfortunately this doesn’t work for the error_log
directive but for my
purposes that’s not really an issue.
Comments