Django:记录配置位置

时间:2017-11-20 13:18:41

标签: python django logging

我在views.py上面有以下行以启用日志记录:

logger = logging.getLogger(__name__)

要将所有记录器的loglevel更改为debug,我已将以下行放入settings.py:

if DEBUG:
    logging.getLogger().setLevel(logging.DEBUG)

但是如果我在views.py中使用loglevel INFO记录某些东西,它就不会显示出来。为什么呢?

1 个答案:

答案 0 :(得分:3)

要获取django层次结构之外的任何日志记录,您必须为自己的层次结构配置记录器(或配置“root”记录器,但您可能获得的要求远远超过您的要求) - Django仅默认配置django层次结构。你可以see some examples here,特别是“相当复杂的日志设置”(实际上与我们相比很简单):

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    },
    'filters': {
        'special': {
            '()': 'project.logging.SpecialFilter',
            'foo': 'bar',
        },
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'handlers': {
        'console': {
            'level': 'INFO',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler',
            'filters': ['special']
        }
    },
    'loggers': {
        'django': {
            'handlers': ['console'],
            'propagate': True,
        },
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': False,
        },
        'myproject.custom': {
            'handlers': ['console', 'mail_admins'],
            'level': 'INFO',
            'filters': ['special']
        }
    }
}

注意最后一个条目 - 这是您为自己的项目/应用程序(或第三方应用程序或库FWIW)添加日志记录的方式。

wrt /根据DEBUG标志更改级别,我所做的是在{}之前定义DEFAULT_LOGGING_LEVEL

# settings.py

DEBUG = <....>
# ....

DEFAULT_LOGGING_LEVEL = "DEBUG" if DEBUG else "INFO"

然后将它用于所有记录器,除了那些我想要更具体的记录器:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,

    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(name)s %(module)s '
                      '%(process)d %(thread)d %(message)s'
            },
        'simple': {
            "datefmt": "%Y-%m-%d %H:%M:%S %z",
            'format': '[%(asctime)s] [%(process)d] [%(levelname)s] %(name)s %(message)s',
            },
        },
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse',
            }
        },

    'handlers': {
        'null': {
            'level': 'DEBUG',
            'class': 'logging.NullHandler',
            },
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'simple',
            },
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler',
            'formatter': 'verbose',
            'include_html': True
            },
        'warn_admins': {
            'level': 'WARN',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler',
            'formatter': 'verbose',
            'include_html': True
            },
        },
    'loggers': {
        # ----------------------------------------
        # general
        # ----------------------------------------
        # make sure we have anything >= WARN whatsoever
        'root': {
            'handlers':  ["console"],
            'level': "WARN",
            'formatter': "verbose",
            },

        # ----------------------------------------
        # apps loggers - django (default)
        # ----------------------------------------
        'django': {
            'handlers':  ["console",],
            'level': "INFO",
            'formatter': "verbose",
            'propagate': True,
            },
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
            },

        # ----------------------------------------
        # app loggers - third part
        # ----------------------------------------
        'reportlab.platypus': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': True,
            },

        # ----------------------------------------
        # app loggers - our own apps
        # ----------------------------------------
        'account': {
            'handlers':  ["console",],
            'level': DEFAULT_LOGGING_LEVEL,
            'propagate': True,
            },
        'core': {
            'handlers':  ["console",],
            'level': DEFAULT_LOGGING_LEVEL,
            'propagate': True,
            },
        'shop': {
            'handlers':  ["console",],
            'level': DEFAULT_LOGGING_LEVEL,
            'propagate': True,
            },
        'shop.views': {
            'handlers':  ["console", "warn_admins"],
            'level': DEFAULT_LOGGING_LEVEL,
            'propagate': True,
            },

    # etc

您可以注意到我不必手动调用logging模块本身,所有操作都通过LOGGING dict完成(Djano负责将其传递给logging.dictConfig() )。

注意:dictConfig格式已完全记录,因此我不会在此解释。