Python 3.8、Django 3.0
我使用docker-compose logs
django 来显示和处理容器的日志。为确保所有输出具有相同的格式,我LOGGING
在内部定义settings.py
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'detailed': {
'format': '{levelname} [{asctime}]{name} : {message}',
'style': '{',
},
},
'handlers': {
'console': {
'level': env('DJANGO_LOG_LEVEL'),
'class': 'logging.StreamHandler',
'formatter': 'detailed'
},
},
'loggers': {
'': {
'handlers': ['console'],
'propagate': False,
'level': 'DEBUG',
},
'django': {
'handlers': ['console'],
'propagate': False,
'level': env('DJANGO_LOG_LEVEL'),
},
# django.template and django.backends must not use DEBUG-level, since it is buggy
'django.template': {
'propagate': True,
'level': 'INFO',
},
'django.db.backends': {
'propagate': True,
'level': 'INFO',
},
# use same format for logs from uvicorn
'uvicorn': {
'handlers': ['console'],
'propagate': False,
'level': 'INFO',
},
}
}
但是,在运行容器时,我在日志中得到以下输出:
django_1 | INFO [2020-04-28 16:00:25,482]uvicorn.error : Started server process [16]
django_1 | INFO [2020-04-28 16:00:25,482]uvicorn.error : Waiting for application startup.
django_1 | INFO [2020-04-28 16:00:25,482]uvicorn.error : ASGI 'lifespan' protocol appears unsupported.
django_1 | INFO [2020-04-28 16:00:25,482]uvicorn.error : Application startup complete.
django_1 | WARNING: Detected file change in 'myproject/settings.py'. Reloading...
django_1 | INFO [2020-04-28 16:04:01,080]uvicorn.error : Shutting down
django_1 | INFO [2020-04-28 16:04:01,180]uvicorn.error : Finished server process [16]
django_1 | INFO [2020-04-28 16:04:01,888]uvicorn.error : Started server process [18]
django_1 | INFO [2020-04-28 16:04:01,888]uvicorn.error : Waiting for application startup.
django_1 | INFO [2020-04-28 16:04:01,888]uvicorn.error : ASGI 'lifespan' protocol appears unsupported.
django_1 | INFO [2020-04-28 16:04:01,888]uvicorn.error : Application startup complete.
如您所见,uvicorn 使用我指定的 logging.config。但是,这一调用WARNING: Detected file change in 'myproject/settings.py'. Reloading...
不遵循该模式。这很奇怪,因为消息在内部被lib/python3.8/site-packages/uvicorn/supervisors/statreload.py
调用
logger = logging.getLogger("uvicorn.error")
# ...
# ...
# ...
display_path = os.path.normpath(filename)
if Path.cwd() in Path(filename).parents:
display_path = os.path.normpath(os.path.relpath(filename))
message = "Detected file change in '%s'. Reloading..."
logger.warning(message, display_path)
至少这就是我认为这个警告的来源。那么为什么我的配置不适用于此?
在试图找出问题的根源时,我发现了一件更奇怪的事情:
当我直接在其中调用记录器时,settings.py
它也不会应用配置:
import logging
logger = logging.getLogger("django")
logger.warning("hello")
只会显示
WARNING: hello
但是当我在视图中使用相同的代码时,myapp/views.py
我得到
django_1 | INFO [2020-04-28 16:14:07,960]uvicorn.error : Application startup complete.
django_1 | WARNING [2020-04-28 16:14:12,789]django : hello
django_1 | INFO [2020-04-28 16:14:12,942]uvicorn.access : 172.20.0.5:43470 - "GET / HTTP/1.0" 200
因此,问题的根源似乎不是 uvicorn,而是日志配置仅适用于某些特定模块?
这里到底有什么问题?为什么这行为如此奇怪?还是我理解错了?