How to rotate nginx log files in ubuntu?

Why do we need to rotate logs?

Logs are very useful when debugging an application. You might store different types of logs on your server for example:

  • nginx logs
  • application logs

Keep in mind that if you do not manage your log files than it will grow in size and it will full your server disk in some days. If you are storing tons of logs everyday you need to store them on daily basis and later you want to access them.

Logrotate is a linux utility that helps you manage & rotate the logs based on their size, date etc..

How to install logrotate?

You can install logrotate on different operating systems like RHEL/CentOS, Dabian/Ubuntu, Fedora as show below:

# install on RHEL/CentOS
yum install logrotate

# install on Debian/Ubuntu/Linux
sudo apt-get install logrotate

# install on Fedora
dnf install logrotate

How to configure logrotate?

Once you have logrotate installed on your machine you can configure it based on your requirement.

Sample configuration file can be found in /etc/logrotate.conf:

# rotate log files weekly

# use the adm group by default, since this is the owning group
# of /var/log/syslog.
su root adm

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones

# use date as a suffix of the rotated file

# uncomment this if you want your log files compressed

# use files in below directory for specific log rotation
include /etc/logrotate.d

According to above configuration file it includes all configuration stored in /etc/logrotate.d directory. Let say that we want to rotate our nginx log files. We would create a file called /etc/logrotate.d./nginx with following configurations:

/var/log/nginx/*.log {
	rotate 14
	create 0640 www-data adm
		invoke-rc.d nginx rotate >/dev/null 2>&1

Let's understand what above configuration means:

  • rotate all logs that found in /var/log/nginx/*.log
  • daily: rotate them on daily basis
  • missingok: errors are not to be written logs
  • notifempty: logs are not to be rotated if empty
  • rotate: we will keep last 14 log files
  • prerotate/postrotate: tells logrotate that the script to run, starts on the next line
  • endscript: command says that the script is done

Once the configuration file has been saved. By default, logrotate automatically configures a cron job scheduled to be run daily.

How to check if logrotate is configured correctly?

Once configuration file is saved you can run following command to make sure logrotate is configured correctly:

# run logrotate forcefully
logrotate -d /etc/logrotate.conf

# run logrotate forcefully with verbose mode
logrotate -vf /etc/logrotate.conf

# run logrotate in a debug mode
logrotate -d /etc/logrotate.conf

# check the status file to see which files rotated
cat /var/lib/logrotate.status

Hope this helps to all developer who are seeking to rotate application or server logs on daily basis. You can rotate as many logs files you want customize according to your need.