Как записывать журналы в контейнер 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'