Что нужно знать о логировании в Docker перед запуском проекта в продакшен

Экспериментировать — с Docker в небольших проектах, конечно, увлекательно, но перенос приложения в продакшен сопряжен с рядом важных задач. Что вам точно понадобится — логирование. Здесь не без подводных камней…

  1. По умолчанию уничтожение контейнера приводит к удалению логов. Если вам нужны логи, укажите опцию --log-driver:

    docker run --log-driver=journald
    

    Или используя синтаксис docker-compose.yml:

    mycontainer:
        image: myimage
        logging:
            driver: journald
            options:
                tag: mytag
    

    Просмотр логов с фильтрацией:

    journalctl -u docker CONTAINER_NAME=mycontainer_name
    journalctl -u docker CONTAINER_TAG=mytag
    
  2. В Docker Community Edition (CE) или Docker Engine Enterprise (EE) до версии 18.03 команда docker logs не позволяет просматривать логи, предоставляемые несколькими драйверами логирования.

  3. Инструменты обслуживания логов не работают с драйвером json-file. Логи не ротируются и не ограничены размером. Объемные логи могут переполнять систему, а пользователи даже и не знать, куда расходуется дисковое пространство.

    Можно настроить ротацию с помощью logrotate на хост-машине:

    $ vim /etc/logrotate.d/docker-containers
    

    Заполнить примерно так:

    /var/lib/docker/containers/*/*.log {
     rotate 7
     daily
     size 50M
     compress
     missingok
     notifempty
     copytruncate
     dateext
    }
    

    Принудительно проктурить логи:

    logrotate -f /etc/logrotate.conf
    
  4. В стандартном контейнере Docker любой сервис, который записывает сообщения в syslog, по умолчанию отбрасывается. Docker не запишет ничего, пока сообщение не попадает в STDOUT/STDERR.

  5. Логи могут быть утеряны, если syslog не смог доставить их на удаленный сервер. Логи не буферизируются на диске.

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

  7. Команда docker logs работает только с драйверами json-file и journald. Вы получите сообщение об ошибке, если для логирования будет использоваться какой-нибудь другой драйвер. Эта проблема будет проявляться при работе с другими инструментами, использующими с API логирования (Portainer, Logspout и др.).

  8. Временная проблема с сетью или высокие задержки в соединении могут блокировать развертывание контейнеров, если syslog отправляет данные через TCP/TLS на центральный сервер. Кроме того, перезапуск сервера syslog может вызвать падение контейнеров.

  9. Драйвер Gelf поддерживает только UDP. Если отбрасываются пакеты UDP, можно потерять и логи.

  10. Многострочные логи не поддерживаются. Например, трассировка стека ошибок. Она используется довольно часто и по своей природе многострочная. С использованием логирования Docker каждая строка трассировки становится новым событием.