How to configure Docker Log rotation?
Tags: devops, docker, monitoring, microservices
Published: 2022-07-11 11:23:00

This tutorial was originally posted on [SigNoz Blog](https://signoz.io/blog/) and is written by [Favour Daniel](https://twitter.com/sheisdhee)

It is essential to configure log rotation for Docker containers. Log rotation is not performed by default, and if it’s not configured, logs on the Docker host can build up and eat up disk space. This guide will teach us how to set up Docker log rotation.

Logs are an essential piece of telemetry data. Logs can be used to debug performance issues in applications. They produce a thorough list of the events that take place in your application, which can be used to troubleshoot issues and identify the root cause of a problem.

With containerization, it is easier to scale applications. But the operation complexity has increased manifolds. Containers are ephemeral. Frequently changing container-based environments are challenging to monitor. Docker logs can help debug performance issues.
Applications in Docker containers emit logs through `stdout` and `stderr` output streams. The logging driver that you choose can access these streams. Based on your logging driver, you can configure the format and storage of Docker logs. You can also send the emitted logs to a central log management system.

Before deep-diving into configuring Docker log rotation, let's briefly overview Docker logs.

## A brief on Docker Logs
Logging in Docker is different from applications hosted on physical or virtual hosts. Container environment is dynamic, and troubleshooting is more complex.

In Docker, primarily, there are two types of log files.

1. **Docker daemon logs**<br></br>
     These logs are generated by the Docker daemon and located on the host. It provides insights into the state of the Docker platform.

2. **Docker container logs**<br></br>
     Docker container logs cover all the logs related to a particular application running in a container.


Docker does not impose a size restriction on logging files. Hence they will inevitably increase over time and consume storage if left unchecked. You can imagine the growth of log files over time and the amount of storage they would require in a scenario where you have numerous containers running.

Limiting the size and quantity of locally stored log files is the main goal of log rotation. Docker logs must be cycled at predetermined intervals because manually deleting logs is a laborious task. But the first question is, where are Docker logs stored?


## Where are Docker logs stored?

Logs are often kept on the Docker host because containers are stateless (failing to remember or save data from previous actions). Docker uses the <a href = "https://docs.docker.com/config/containers/logging/json-file/" rel="noopener noreferrer nofollow" target="_blank">JSON-file</a> logging driver by default, and it records all `stdout` and `stderr` output in JSON format.

Log files are created for each container and are generally stored at:

`/var/lib/docker/containers/[container-id]/[container-id]-JSON.log`

Docker provides support for multiple logging drivers. You can check out other <a href = "https://docs.docker.com/config/containers/logging/configure/#supported-logging-drivers" rel="noopener noreferrer nofollow" target="_blank">logging drivers</a> available.

To know your current logging driver for Docker Daemon, run the following command:

```bash
$ docker info --format '{{.LoggingDriver}}'
```

## Configuring Docker Log Rotation

Let’s first configure the Docker daemon to a particular log driver.

To configure the Docker Daemon to a particular log driver:

**Step 1:** Go to the Docker daemon configuration file location:<br></br>
On Linux: `/etc/docker/` directory

On Windows: `C:\ProgramData\docker\config\daemon.json`

**Step 2:** If your logging driver hasn’t been set yet, use the following command to set it up:
```bash
{
  "log-driver": "local"
}
```

or 

```bash
{
  "log-driver": "json-file"
}
```

You can specify any log driver of your choice but **Docker recommends** using the `local` logging driver to prevent disk exhaustion because it performs log rotation by default.

**Step 3:** Add configuration for log rotation<br></br>
Add the following code to the daemon.json file after editing or creating it to rotate the log.

The final file, when using `json-file` driver looks like this:

```bash
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "15m",
    "max-file": "5",
    }
}
```

You can also update the parameters for `local` logging driver using the same format:

```bash
{
  "log-driver": "local",
  "log-opts": {
    "max-size": "15m"
    "max-file": "5"
  }
}
```

Step 4: Save the file and restart docker.

```bash
systemctl restart docker
```
The change in the default logging driver impacts only the containers created after modifying the daemon configuration. The existing containers carry the initial configuration of the logging driver. In order to update their logging driver for existing containers, they must be recreated with the preferred options.


## Configuring Log Drivers and Rotation for specific containers
To configure a container to use a different logging driver than the Docker daemon’s default, use the `--log-driver` flag. You need to include the container ID or container name alongside the command.

```bash
$ docker run -it --log-driver json-file nginx
```

The `--log-driver` flag specifies the log driver you are assigning to that container. In the above example, the log driver assigned to the container is the `json-file`.

To find the current logging driver for a running container, if the daemon is using the `json-file`
logging driver, run the following command:

```bash
$ docker inspect -f '{{.HostConfig.LogConfig.Type}}' <CONTAINER>
```

Then to setup log rotation for the specified container, run the below commands:

```bash
$ docker run \
    --log-driver json-file \
    --log-opt max-size=15m \
    --log-opt max-file=5 \
    nginx echo hello world
```

Another way to do this is by running the below command

```jsx
docker run  --log-opt max-size=15m --log-opt max-file=5 nginx:latest
```

Simplifying the above command:

`docker run --log-opt max-size=15m` <br></br>
It tells Docker to limit the size of your Docker log file.

`--log-opt max-file=5`  
It instructs Docker to store no more than 5 log files. When the limit is met, Docker is instructed to destroy the older files. 

`nginx:latest`<br></br>
The container image name

You can also have a look at the <a href = "https://docs.docker.com/config/containers/logging/json-file/#options" rel="noopener noreferrer nofollow" target="_blank">logging options</a> the JSON-file accepts.

## Final Thoughts

In this guide, we learned how to set up Docker log rotation. Container environments are highly dynamic, with multiple layers of abstraction. As a result, it's hard to debug such environments, and logs can play a critical role in providing much-needed visibility into performance issues.

Docker provides various terminal commands to interact with Docker logs. You can use your console to view logs while developing your application or debugging a specific scenario. But in production environments, it’s advisable to centralize your logs for storage and analysis. That’s where a log management solution comes into the picture.

The first step for efficient log management is log aggregation. Once the logs are aggregated, you need to store them and set them up for analysis. There are multiple log management solutions out there. But which solution is best suited for modern distributed cloud-native applications?

[SigNoz](https://signoz.io/), a full-stack open-source APM, can help you to store, manage, and analyze logs at scale. It correlates all your telemetry data(logs, metrics, and traces) into a single suite of monitoring. Apart from logs, SigNoz can also help you monitor metrics and track the performance of user requests across services using distributed tracing.

![Upcoming log Management feature in SigNoz](https://signoz.io/img/blog/2022/07/log_management.webp)<figcaption><i>Log management in SigNoz (Currently under development)</i></figcaption>

SigNoz is built to support <a href = "https://opentelemetry.io/" rel="noopener noreferrer nofollow" target="_blank">OpenTelemetry</a> natively. OpenTelemetry, an open-source project backed by <a href = "https://www.cncf.io/" rel="noopener noreferrer nofollow" target="_blank">Cloud Native Computing Foundation</a>, can be used to aggregate and process logs from multiple sources. OpenTelemetry is quietly becoming the world standard for instrumenting cloud-native applications to generate telemetry data.

It’s easy to get started with SigNoz. It can be installed on macOS or Linux computers in just three steps by using a simple installation script.

The install script automatically installs Docker Engine on Linux. However, you must manually install <a href = "https://docs.docker.com/engine/install/" rel="noopener noreferrer nofollow" target="_blank">Docker Engine</a> on macOS before running the install script.

```jsx
git clone -b main https://github.com/SigNoz/signoz.git
cd signoz/deploy/
./install.sh
```

You can visit our documentation for instructions on how to install SigNoz using Docker Swarm and Helm Charts.

[![Deployment Docs](https://signoz.io/img/blog/common/deploy_docker_documentation.webp)](https://signoz.io/docs/install/docker/?utm_source=blog&utm_medium=docker_log_rotation)

You can check out SigNoz GitHub repo here:

[![SigNoz GitHub repo](https://signoz.io/img/blog/common/signoz_github.webp)](https://github.com/SigNoz/signoz)

---
## Further Reading

[SigNoz - an open source alternative to DataDog](https://signoz.io/blog/open-source-datadog-alternative/)