如何在Django日志文件中记录Python警告?

Jon*_*hop 6 python django

我有一个从v1.8迁移到v1.10的Django应用程序。在执行此工作的过程中,我通过以下方式运行了我的应用程序:

python -Wall manage.py runserver

这样做会使控制台中出现许多Python警告。我想在我的Django应用程序日志中显示这些警告,以便稍后进行检查。我以为我的应用程序的日志处理程序会捕获这些警告,但事实并非如此。日志处理程序如下所示(取自settings.py):

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
            'datefmt': "%d/%b/%Y %H:%M:%S"
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    },
    'handlers': {
        'file': {
            'level': 'WARNING',
            'class': 'logging.FileHandler',
            'filename': 'myapp.log',
            'formatter': 'verbose'
        },
    },
    'loggers': {
        'django': {
            'handlers': ['file'],
            'propagate': True,
            'level': 'WARNING',
        },
        'myapp': {
            'handlers': ['file'],
            'level': 'WARNING',
        },
    }
}
Run Code Online (Sandbox Code Playgroud)

如何捕获-WallDjango日志中的Python警告(带有)以供以后检查?

小智 5

显示的警告python -Wall manage.py <command>是使用警告模块生成的。在Python2.7日志记录模块文档中,它们有一部分显示了如何将警告模块中的消息集成到日志记录中。

将它们添加到您的设置文件。

import logging
logging.captureWarnings(True)

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
            'datefmt': "%d/%b/%Y %H:%M:%S"
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    },
    'handlers': {
        'file': {
            'level': 'WARNING',
            'class': 'logging.FileHandler',
            'filename': 'myapp.log',
            'formatter': 'verbose'
        },
    },
    'loggers': {
        'django': {
            'handlers': ['file'],
            'propagate': True,
            'level': 'WARNING',
        },
        'myapp': {
            'handlers': ['file'],
            'level': 'WARNING',
        },
        'py.warnings': {
            'handlers': ['file'],
            'level': 'WARNING',
            'propagate': True
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

添加它之后,尝试运行任何manage.py命令,您将看到写入myapp.log文件的警告。

此行指示日志记录以捕获py.warnings 警告

    logging.captureWarnings(True)
Run Code Online (Sandbox Code Playgroud)

这指示日志记录从py.warnings记录器路由(在此示例中为文件处理程序)警告:

    'py.warnings': {
        'handlers': ['file'],
        'level': 'WARNING',
        'propagate': True
    }
Run Code Online (Sandbox Code Playgroud)