Vanilla Django在日志记录中投射了一个ResourceWarning:"unclosed file"

fur*_*ins 3 python django logging python-3.x

我的Django 1.8/Python 3.4设置存在问题.跑步时

python -Wall ./manage.py runserver
Run Code Online (Sandbox Code Playgroud)

我收到以下警告:

/lib/python3.4/logging/config.py:763: 
ResourceWarning: unclosed file <_io.TextIOWrapper name='/Users/furins/logs/test-project.log' mode='a' encoding='UTF-8'>
  for h in logger.handlers[:]:
Run Code Online (Sandbox Code Playgroud)

这些是settings.py与日志记录相关的设置:

LOGGING_LEVEL = 'DEBUG'

LOG_DATE_FORMAT = '%d %b %Y %H:%M:%S'

LOG_FORMATTER = logging.Formatter(
    '%(asctime)s | %(levelname)-7s | %(name)s | %(message)s',
    datefmt=LOG_DATE_FORMAT)

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    'formatters': {
        'standard': {
            'format': "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
            'datefmt': LOG_DATE_FORMAT
        },
    },
    'handlers': {
        'logfile': {
            'level': LOGGING_LEVEL,
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': PROJECT_DIR / 'logs/test-project.log',
            'maxBytes': 1024 * 1024 * 5,  # 5 MB
            'backupCount': 5,
            'formatter': 'standard',
        },
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        },
        'null': {
            'level': 'DEBUG',
            'class': 'django.utils.log.NullHandler',
        },
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'standard'
        },
    },
    'loggers': {
        'django': {
            'handlers': ['console', 'logfile'],
            'propagate': True,
            'level': 'DEBUG',
        },
        'django.db.backends': {
            'handlers': ['console', 'logfile'],
            'level': 'INFO',
            'propagate': False,
        },
        'django.request': {
            'handlers': ['console', 'mail_admins', 'logfile'],
            'level': 'DEBUG',
            'propagate': True,
        },
        'eurogielle': {
            'handlers': ['console', 'logfile', 'mail_admins'],
            'level': LOGGING_LEVEL,
            'propagate': True
        },
        'eurogielle2': {
            'handlers': ['console', 'logfile', 'mail_admins'],
            'level': LOGGING_LEVEL,
            'propagate': True
        },
        'eurogielle_management': {
            'handlers': ['console', 'logfile', 'mail_admins'],
            'level': LOGGING_LEVEL,
            'propagate': True
        },
        'eurogielle_prodotti': {
            'handlers': ['console', 'logfile', 'mail_admins'],
            'level': LOGGING_LEVEL,
            'propagate': True
        },
    }
}
Run Code Online (Sandbox Code Playgroud)

我试图在Google和SO上搜索类似的问题,但没有运气.当然,我知道如何沉默这个警告,但我想知道这个警告是否指的是可能泄漏生产资源的东西以及是否有办法"关闭文件".

任何Stackoverflow Django忍者都有同样的问题吗?

fur*_*ins 7

在进一步搜索之后,我发现了一个潜在的相关问题一篇博客文章,它推动了我的正确方向.

确实很简单.我只需要添加一个'delay': True配置:

    'logfile': {
        'level': LOGGING_LEVEL,
        'class': 'logging.handlers.RotatingFileHandler',
        'filename': PROJECT_DIR / 'logs/test-project.log',
        'maxBytes': 1024 * 1024 * 5,  # 5 MB
        'backupCount': 5,
        'formatter': 'standard',

        'delay': True  // <- this line solved the problem!

    },
Run Code Online (Sandbox Code Playgroud)

并且警告消失了!有关进一步的参考,该属性在python文档中解释:

如果delay为true,则文件打开将推迟到第一次调用emit().