繁体   English   中英

Django:设置LOGGER不起作用

[英]Django: Setting LOGGER doesn't work

我在Django的记录系统上遇到问题。 我的目标是将所有类型的日志记录到文件中,并且仅在DEBUG设置为True (现在是正确的)时才记录到控制台。

照原样,日志文件保持空白(尽管它们是由Django创建的)。 当我启动服务器(使用python3 manage.py runserver )时,在外壳中看到以下内容:

Warning!
Error!

... (normal server stuff)

但是没有任何内容写入任何日志文件。

如果我取消注释__init__.py中的 logging.error('== == START LOGGER == ==')logr.setLevel('DEBUG') ,则外壳读取:

ERROR:root:== == START LOGGER == ==
DEBUG:project:Debug!
INFO:project:Info!
WARNING:project:Warning!
ERROR:project:Error!

... (normal server stuff)

并且django.log显示:

DEBUG (0.000) SET SQL_AUTO_IS_NULL = 0; args=None
DEBUG (0.000) SET SQL_AUTO_IS_NULL = 0; args=None
DEBUG (0.001) SHOW FULL TABLES; args=None
DEBUG (0.000) SELECT `django_migrations`.`app`, `django_migrations`.`name` FROM `django_migrations`; args=()

但是所有其他日志保持空白。

这是我的项目应用

__init__.py

import logging

#logging.error('== == START LOGGER == ==')
logr = logging.getLogger('project')
#logr.setLevel('DEBUG')

logr.debug('Debug!')
logr.info('Info!')
logr.warning('Warning!')
logr.error('Error!')

这是我的记录设置

settings.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
        'simpler': {
            'format': '%(message)s'
        },
    },
    'filters': {
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'handlers': {
        'default':{
            'level': 'WARNING',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': 'logs/err.log',
            'maxBytes': 5242880, # 5MB file size
            'encoding': 'utf-8',
            'backupCount': 5,
            'formatter': 'simple',
        },
        'debug':{
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': 'logs/debug.log',
            'maxBytes': 5242880, # 5MB file size
            'encoding': 'utf-8',
            'backupCount': 5,
            'formatter': 'simple',
        },
        'django':{
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': 'logs/django.log',
            'maxBytes': 5242880, # 5MB file size
            'encoding': 'utf-8',
            'backupCount': 5,
            'formatter': 'simple',
        },
        'mail':{
            'level': 'WARNING',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': 'logs/mail.log',
            'maxBytes': 5242880, # 5MB file size
            'encoding': 'utf-8',
            'backupCount': 5,
            'formatter': 'simple',
        },
        'console': {
            'level': 'DEBUG',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'simpler',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['django'],
            'level': 'DEBUG',
            'propagate': False,
        },
        'django.db.backends': {
            'handlers': ['django'],
            'level': 'DEBUG',
            'propagate': False,
        },
        'django.request': {
            'handlers': ['mail'],
            'level': 'DEBUG',
            'propagate': False,
        },
        'project': {
            'handlers': ['default', 'debug', 'console'],
            'level': 'DEBUG',
            'propagate': False,
        },
    },
}

为什么在编写logging.error('== == START LOGGER == ==')logr.setLevel('DEBUG')时显示DEBUGINFO 为什么不将日志文件写入? 我搜索了类似的问题及其答案达数小时之久没有成功。 谢谢。

编辑:我尝试过的事情:

'disable_existing_loggers'更改为False

'level': 'DEBUG',更改为'level': 'NOTSET',并将'level': 'ERROR',

删除所有但不必要的设置

'propagate'更改为True

'handlers'删除'console' (这绝对不起作用)

我没有足够的分数来添加评论,因此在这里我要提到,如果您的日志记录格式使用%(name)s那么上述答案的一个有用扩展是在您拥有的文件中:

logr = logging.getLogger('project')

您可以使用:

logr = logging.getLogger('project.%s' % __name__)

然后,这意味着您的项目记录器将报告完整的应用程序名称,例如。 'project.polls.views'

您的__init__.py文件在settings.py之前被调用

将您的代码从__init__.py移至其他任何文件,这些文件将在settings.py之后调用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM