1

Python 3.8、Django 3.0

我使用docker-compose logsdjango 来显示和处理容器的日志。为确保所有输出具有相同的格式,我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,而是日志配置仅适用于某些特定模块?

这里到底有什么问题?为什么这行为如此奇怪?还是我理解错了?

4

0 回答 0