Поиск по сайту:

Как очистить журналы запущенных контейнеров Docker


Долго работающие контейнеры Docker могут быстро накапливать большое количество строк журнала. Они потребляют емкость хранилища и снижают производительность при доступе и фильтрации данных. Хотя Docker включает в себя встроенные инструменты для просмотра журналов, встроенного механизма для их очистки нет.

В этой статье вы узнаете, как очистить логи запущенных контейнеров Docker, не перезапуская и не заменяя их. Вы также познакомитесь с некоторыми методами более эффективной обработки больших журналов при сохранении старых данных.

Понимание проблемы

Docker собирает журналы из стандартного вывода и потоков ошибок процессов переднего плана контейнера. Команда docker logs используется для извлечения этих журналов, но не позволяет удалять старые строки.

Docker поддерживает множество различных драйверов ведения журналов, поэтому невозможно предложить стандартизированный механизм очистки. В этой статье основное внимание уделяется стандартному драйверу ведения журнала json-file, в котором строки журнала хранятся в файле JSON в файловой системе хоста вашего контейнера. Обратитесь к документации вашего драйвера хранилища, если вам нужно очистить журналы, передаваемые на удаленный хост.

Файлы журнала, созданные драйвером json-file, хранятся в каталоге /var/lib/docker/containers. Каждый контейнер получает свой собственный файл журнала, который используется в течение всего срока его службы. По умолчанию ротация журналов не настроена.

Простое удаление файла журнала не является эффективным решением. Docker ожидает, что файл будет доступен постоянно, и не будет автоматически воссоздавать его, если он будет удален. Безопаснее очистить содержимое существующего журнала, чтобы не повлиять на текущую запись.

Обнаружение пути к файлу журнала

Сначала найдите путь к файлу журнала целевого контейнера. Вы можете получить путь к файлу журнала для контейнера с именем my-app, выполнив следующую команду:

$ docker inspect --format='{{.LogPath}}' my-app
/var/lib/containers/1380d936...-json.log

Очистка файла журнала

Вы можете очистить содержимое журнала, не удаляя его, выводя пустую строку в его содержимое. Файл будет принадлежать root, поэтому вам нужно будет выполнить эту операцию в корневой оболочке. Следующая команда очистит для вас файл журнала:

$ sudo sh -c 'echo "" > $(docker inspect --format="{{.LogPath}}" my-app)'

Интерполяция оболочки используется для динамического получения пути к файлу журнала для контейнера my-app. Вместо этого вы можете вручную заменить путь, полученный ранее.

Когда вы запустите docker logs my-app, теперь вы увидите пустой вывод, если в промежутке времени контейнер не возобновил запись строк.

Ограничение вывода журнала

Команда docker logs принимает несколько аргументов, которые можно использовать для ограничения вывода зашумленных журналов. Это помогает уменьшить потребность в очистке журнала, предотвращая заполнение терминала старыми строками при каждом доступе к файлу.

  • --tail — этот флаг указывает Docker создавать только определенное количество старых строк журнала, начиная с самой последней.
  • --until и --since. Эти флаги ограничивают вывод строками журнала, созданными в течение определенного периода времени. Они полезны, когда вы знаете приблизительные временные рамки, в которых произошло событие.

Вот несколько примеров:

Показать 100 последних строк журнала

docker регистрирует my-app --tail 100

Отображение строк журнала, написанных за последний час

docker регистрирует мое приложение -- с 1 часа

Отображение до 100 строк журнала, написанных за последний час

docker регистрирует my-app --tail 100 --since 1h

Настройка ротации журналов

Регулярная очистка файлов журналов таким образом обычно сигнализирует о том, что журналы вашего приложения либо слишком многословны, либо слишком много активности для хранения в одном файле.

Многие драйверы ведения журналов Docker, в том числе json-file, имеют дополнительную поддержку ротации журналов, которую можно включить глобально для демона Docker или для каждого контейнера.

Настройки демона настраиваются в /etc/docker/daemon.json. Вот пример, который меняет журналы контейнеров, как только они достигают 8 МБ. В любое время будет сохраняться до пяти файлов, а старые автоматически удаляются при появлении новых ротаций.

{
    "log-opts": {
        "max-size": "8m",
        "max-file": "5"
    }
}

Перезапустите демон Docker, чтобы применить изменения:

$ sudo service docker restart

Ротация на уровне демона применяется ко всем вновь созданным контейнерам. Изменения не повлияют на контейнеры, которые уже существуют на вашем хосте.

Ротация может быть настроена для отдельных контейнеров с помощью флагов --log-opts. Они переопределят ваши настройки демона Docker по умолчанию.

docker run --name app \
    --log-driver json-file \
    --log-opts max-size=8M \
    --log-opts max-file=5 \
    app-image:latest

Краткое содержание

Журналы контейнера Docker могут стать шумными, когда занятые приложения записывают обширный вывод. Доступ к подробным журналам полезен для отладки, но они занимают место в хранилище, затрудняют просеивание данных и могут снизить производительность.

Вы можете очистить файлы журналов по требованию, используя команды оболочки для очистки их содержимого. Однако лучше настроить ротацию журналов, чтобы она происходила автоматически, как только файлы достигают определенного размера. Команда docker logs также поддерживает флаги, которые помогают укротить громоздкие журналы в точке доступа.




Все права защищены. © Linux-Console.net • 2019-2024