Вопрос или проблема
Я собираю и запускаю Asterisk 22 в контейнере Docker на моем Ubuntu 24.04, и он начал использовать 100% ЦП и через несколько часов израсходовал 100% дискового пространства.
После проведения различных экспериментов, см. мой блог для получения подробностей, я выяснил, что файл /var/lib/docker/containers/7cd6aa6bd4eab91867b0aad48ad3a84b589a0ad969f830009b959a69e6f8f8cb/7cd6aa6bd4eab91867b0aad48ad3a84b589a0ad969f830009b959a69e6f8f8cb-json.log
постоянно растет. (где 7cd6aa6bd4eab91867b0aad48ad3a84b589a0ad969f830009b959a69e6f8f8cb
— ID контейнера Asterisk). И сообщения журнала, такие как это:
{"log":"\u0000\u0000\u0000\u0000\u0000 ... u0000\u0000\u0000\u0000","stream":"stdout","time":"2025-01-31T10:44:08.116965488Z"}
активно появляются в этом файле.
Какую команду я должен использовать, чтобы увидеть эти журналы?
И какой правильный способ ограничить и ротировать эти журналы? Моя первая идея была возможно обновить /etc/docker/daemon.json
, но этот файл не существует на моем компьютере.
Команда
sudo docker logs -f 7cd6aa6bd4eab91867b0aad48ad3a84b589a0ad969f830009b959a69e6f8f8cb
не отображает их, но отображает следующее:
> Registered custom function 'QUEUE_MEMBER_PENALTY'
> app_queue.so => (True Call Queueing)
> Loading res_manager_devicestate.so.
> Manager registered action DeviceStateList
> res_manager_devicestate.so => (Manager Device State Topic Forwarder)
[Jan 31 10:44:07] WARNING[6]: loader.c:2563 load_modules: Some non-required modules failed to load.
[Jan 31 10:44:07] WARNING[6]: loader.c:2657 load_modules: Module 'res_adsi' has been loaded but may be removed in a future release.
[Jan 31 10:44:07] WARNING[6]: loader.c:2657 load_modules: Module 'app_getcpeid' has been loaded but may be removed in a future release.
[Jan 31 10:44:08] WARNING[6]: loader.c:2657 load_modules: Module 'app_adsiprog' has been loaded but may be removed in a future release.
[Jan 31 10:44:08] ERROR[6]: loader.c:2678 load_modules: cdr_sqlite3_custom declined to load.
[Jan 31 10:44:08] ERROR[6]: loader.c:2678 load_modules: cel_sqlite3_custom declined to load.
[Jan 31 10:44:08] WARNING[12]: pbx_config.c:1997 startup_event_cb: users.conf is deprecated and will be removed in a future version of Asterisk
Asterisk Ready.
Еще один вопрос: почему журнал ведется в файл JSON, а не в stdout? Где это изменить?
Ответ или решение
Чтобы понять, как просматривать логи контейнера Docker, рассмотрим несколько аспектов, связанных с особенностями работы Docker с логами и вариантами их ограничения и ротации. В представленной ситуации, вы использовали Docker для запуска Asterisk 22 на Ubuntu 24.04, и столкнулись с проблемами переполнения дискового пространства из-за постоянного роста лог-файлов.
Теория
Docker управляет логами каждого контейнера по умолчанию с использованием драйвера логов json-file
. Этот драйвер сохраняет все выходные данные контейнера в файл JSON, который расположен по пути /var/lib/docker/containers/[container-id]/[container-id]-json.log
. Этот лог-системный файл может быстро увеличиваться в размерах, если контейнер генерирует большое количество логов без ротации и ограничения размера.
Существует несколько важных аспектов, на которые необходимо обратить внимание:
- Логирование в Docker: Docker перенаправляет стандартные потоки вывода (stdout и stderr) контейнера в систему логирования, определенную драйвером.
- Лимит и ротация логов: Ограничение на размер логов и их ротация не настроены по умолчанию, что может привести к их значительному увеличению.
- Драйверы логов: Docker поддерживает различные драйверы логов, такие как
json-file
,syslog
,journald
и другие, которые могут различаться в способах записи и управления логами.
Пример
В представленной проблеме вашлог-файл /var/lib/docker/containers/7cd6aa6bd4eab91867b0aad48ad3a84b589a0ad969f830009b959a69e6f8f8cb/7cd6aa6bd4eab91867b0aad48ad3a84b589a0ad969f830009b959a69e6f8f8cb-json.log
постоянно растет, заполняя все доступное дисковое пространство. Используемая команда sudo docker logs -f 7cd6aa6bd4eab91867b0aad48ad3a84b589a0ad969f830009b959a69e6f8f8cb
не показывает эти лог данные, а только стандартные логи приложения, такие как предупреждения и ошибки.
Применение
-
Просмотр логов контейнера: Чтобы посмотреть логи вашего контейнера, используйте команду:
sudo docker logs 7cd6aa6bd4eab91867b0aad48ad3a84b589a0ad969f830009b959a69e6f8f8cb
Флаг
-f
(или--follow
) позволяет следить за новыми записями в реальном времени. -
Конфигурация логов: Поскольку файл
/etc/docker/daemon.json
отсутствует, вы можете создать его для настройки ротации и ограничения лог-файлов. Добавьте следующие параметры в этот файл:{ "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } }
Здесь
max-size
указывает максимальный размер файла логов, аmax-file
— количество ротаций. -
Перезапуск Docker: После внесения изменений перезапустите Docker:
sudo systemctl restart docker
-
Редактирование приложения: Если необходимо чтобы логи выводились только в stdout, вам потребуется изменить конфигурацию самого приложения Asterisk, где региcтрируются такие логи. Подробности можно найти в документации к приложению.
-
Понимание JSON логов: Если логи записываются в формате JSON, это может указывать на внутренние настройки приложения, которые заставляют его записывать структурированные данные. Для изменения этого потребуется ознакомиться с настройками Asterisk или других компонентов системы, которые могут это вызывать.
Эти шаги позволят вам не только корректно отображать логи, но и управлять их количеством и размером, предотвращая перенаполнение файловой системы. Это особенно важно для стабильной работы в условиях интенсивного логирования как в случае с Asterisk, когда агрегирование и анализ данных может потребоваться для диагностических и аналитических нужд.