Как посмотреть логи docker?

Вопрос или проблема

Я собираю и запускаю 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 не показывает эти лог данные, а только стандартные логи приложения, такие как предупреждения и ошибки.

Применение

  1. Просмотр логов контейнера: Чтобы посмотреть логи вашего контейнера, используйте команду:

    sudo docker logs 7cd6aa6bd4eab91867b0aad48ad3a84b589a0ad969f830009b959a69e6f8f8cb

    Флаг -f (или --follow) позволяет следить за новыми записями в реальном времени.

  2. Конфигурация логов: Поскольку файл /etc/docker/daemon.json отсутствует, вы можете создать его для настройки ротации и ограничения лог-файлов. Добавьте следующие параметры в этот файл:

    {
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "10m",
        "max-file": "3"
      }
    }

    Здесь max-size указывает максимальный размер файла логов, а max-file — количество ротаций.

  3. Перезапуск Docker: После внесения изменений перезапустите Docker:

    sudo systemctl restart docker
  4. Редактирование приложения: Если необходимо чтобы логи выводились только в stdout, вам потребуется изменить конфигурацию самого приложения Asterisk, где региcтрируются такие логи. Подробности можно найти в документации к приложению.

  5. Понимание JSON логов: Если логи записываются в формате JSON, это может указывать на внутренние настройки приложения, которые заставляют его записывать структурированные данные. Для изменения этого потребуется ознакомиться с настройками Asterisk или других компонентов системы, которые могут это вызывать.

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

Оцените материал
Добавить комментарий

Капча загружается...