Set up Logrotate with Ansible

linux

February 13, 2021  |  2 min read

TLDR

Logrotate can really come in handy when you need to manage logfiles on your Linux machine. And this tutorial shows you how to set up logrotate via Ansible.

Example - Managing Rails Logfile with Logrotate

Details

  • Triggers hourly
  • Rotate when log file is bigger than 100M
  • Only keep 10 copies

Configuring Ansible for Logrotate

  • roles/logrotate/tasks/main.yml

    - name: set up logrotate for rails log
      template:
        src: rails.j2
        dest: /etc/logrotate.d/rails
        owner: root
        group: root
        mode: 0644
     
    - name: ensure logrotate is in /etc/cron.hourly
      file:
        src: /etc/cron.daily/logrotate
        dest: /etc/cron.hourly/logrotate
        state: link
        force: yes
        mode: 0755 # the file needs to be excutable
  • roles/logrotate/templates/rails.j2

    Modify /path/to/your/rails/log/{{ each_group.rails.env }}.log to your logfile's path on your machine.

    /path/to/your/rails/log/{{ each_group.rails.env }}.log {
        size 100M             # triggers when file is bigger than 100M
        dateext               # use date extension
        dateformat -%Y%m%d-%s # the extention format
        rotate 10             # keep 10 files
        copytruncate          # truncates the original file
        missingok             # does not throw error if the file is missing
        notifempty            # does not rotate if the file is empty
    }

Provisioning Logrotate with Ansible

Refer to Executing playbooks.

Bonus

Checking whether Logrotate can be Called by Cron

# Should print "/etc/cron.hourly/logrotate"
$ run-parts --test /etc/cron.hourly

Getting File/Directory Permission Numerical Value in Linux

I usually use sites like Chmod Calculator to map values.

$ stat --format '%a' your-filename

Finding out when cron.hourly Really Executes

$ cat /etc/cron.d/0hourly

References