Log rotation with rsyslog
=========================

*Written by Michael Meckelein*

Situation
---------

Your environment does not allow you to store tons of logs? You have
limited disc space available for logging, for example you want to log to
a 124 MB RAM usb stick? Or you do not want to keep all the logs for
months, logs from the last days is sufficient? Think about log rotation.

Log rotation based on a fixed log size
--------------------------------------

This small but hopefully useful article will show you the way to keep
your logs at a given size. The following sample is based on rsyslog
illustrating a simple but effective log rotation with a maximum size
condition.

Use Rainerscript rotation parameters for fixed-length syslog files
------------------------------------------------------------------

Lets assume you do not want to spend more than 100 MB hard disc space
for you logs. With rsyslog you can configure the
``rotation.sizeLimit`` and ``rotation.sizeLimitCommand`` parameters of
the :doc:`omfile action <../configuration/modules/omfile>` to achieve
this. The Rainerscript fragment below writes all messages to a file and
rotates it once the size limit is exceeded.

.. code-block:: rsyslog

    action(
        type="omfile"
        file="/var/log/log_rotation.log"
        rotation.sizeLimit="52428800"        # 50 MiB per file
        rotation.sizeLimitCommand="/home/me/log_rotation_script"
        rotation.sizeLimitCommandPassFileName="on"
        template="RSYSLOG_TraditionalFileFormat"
    )

When the configured limit is reached, rsyslog executes the command
specified in ``rotation.sizeLimitCommand``. By default, the current file
name is appended as the last argument; set
``rotation.sizeLimitCommandPassFileName="off"`` if your script expects no
additional arguments. In our case it runs ``/home/me/log_rotation_script``
which contains a single command:

::

    mv -f /var/log/log_rotation.log /var/log/log_rotation.log.1

This moves the original log to a kind of backup log file. After the
action was successfully performed rsyslog creates a new
``/var/log/log_rotation.log`` file and fills it with new logs. So the
latest logs are always in ``log_rotation.log``. The two rotation
parameters are documented in
:doc:`../reference/parameters/omfile-rotation-sizelimit` and
:doc:`../reference/parameters/omfile-rotation-sizelimitcommand`.

.. note::

   Older examples use the ``$outchannel`` directive. That syntax maps to
   the same rotation parameters shown above but is kept solely for
   backward compatibility. New configurations should always use
   Rainerscript objects and attributes.

Conclusion
----------

With this approach two files for logging are used, each with a maximum
size of 50 MB. So we can say we have successfully configured a log
rotation which satisfies our requirement. We keep the logs at a
fixed-size level of 100 MB.
