Как записывать журналы в контейнер docker в проекте Django?

Я пытаюсь настроить мой локальный регистратор для записи логов в контейнер docker, чтобы я мог видеть логи в списке, отображаемом командой docker[-compose] logs <container> --tail 100

В settings.py я настроил переменную LOGGING следующим образом:

 LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'default': {
            'format': '[DJANGO] %(levelname)s %(asctime)s %(module)s '
                      '%(name)s.%(funcName)s:%(lineno)s: %(message)s'
        },
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'default',
        }
    },
    'loggers': {
        '': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': True,
        }
    },
}

В файлах, где мне нужны регистраторы, в начале я пишу:

import logging
logger = logging.getLogger(__name__)

Затем, в коде, где мне это нужно, я пишу:

.......
logger.error('something happened')
.......

Как я настроил свой логгер, журнал будет отображаться в консоли. Но моя проблема заключается в следующем:

Как я могу отобразить его в контейнере docker при вызове вышеупомянутой команды?

Пример желаемого вывода:

........
web_1 | [2022-02-23 17:37:10 +0200] [9] [INFO] ASGI 'lifespan' protocol appears unsupported.
web_1 | [2022-02-23 17:37:10 +0200] [9] [INFO] Application startup complete.
web_1 | [2022-02-23 17:37:10 +0200] [10] [INFO] Application startup complete.
web_1 | My log somewhere here..
........

Большое спасибо!

Вы сделали все правильно в Django, чтобы ваши журналы были видны в журналах docker. Единственное, что я заметил, это то, что вы распространяете такие журналы на обработчик более высокого уровня (например, gunicorn). У вас есть два варианта:

Первый вариант - избежать распространения, установив propagate на False:

    'loggers': {
        '': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        }
    },

Другой вариант - настроить ваш сервер приложений так, чтобы избежать фильтрации, но это зависит от конфигурации вашего сервера приложений.

Можно добавить эту команду в docker-compose для запуска при старте.

docker logs --tail 1000 -f 'your_container_id_here'
Вернуться на верх