nginxopenbsdlogrotatelog-rotation

What's the easiest way to rotate nginx log files monthly?


In OpenBSD, there's no logrotate in ports, and newsyslog seems to have limited features as far as monthly rotation of a huge number of log files is concerned.

I have a lot of domains, a huge number of nginx log-files names like /var/www/logs/*/*.{access,error}.log.

I'm thinking a small shell script and cronjob. What would be the easiest way to rotate them all monthly, and append the prior month to the filename?


Solution

  • I think the following crontab should work:

    0   0   1   *   *   /etc/nginx/logrotate.monthly.sh
    

    Where /etc/nginx/logrotate.monthly.sh should have the following content:

    find /var/www/logs/ -name "*log" -exec \
    mv -i {} {}.`sh -c 'date -r $(expr $(date +%s) - 1209600) +%Y-%m'` \; ; \
    kill -USR1 `cat /var/run/nginx.pid`
    

    The -i/--interactive ("prompt before overwrite") option to mv is important to ensure that files don't get overwritten. We get the date for the filename by moving today's date two weeks back (as per « tcsh: print date 2 weeks ago in shell »).

    As documented, "NGINX will re-open its logs in response to the USR1 signal."