日志记录和电子邮件不适用于 Django 500

Posted

技术标签:

【中文标题】日志记录和电子邮件不适用于 Django 500【英文标题】:Logging and email not working for Django for 500 【发布时间】:2016-11-03 00:43:28 【问题描述】:

我无法在我的 Django Web 应用程序中进行日志记录。

我的设置文件如下所示:

EMAIL_HOST = "smtp.gmail.com"
EMAIL_PORT = 465
EMAIL_HOST_USER = "paulhtremblay@gmail.com"
EMAIL_HOST_PASSWORD = "password"
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = "paulhtremblay@gmail.com"
SERVER_EMAIL = 'smtp.gmail.com'

ADMINS = (
      ('Paul Tremblay', 'paulhtremblay@gmail.com'),
      )

 LOGGING =  
'version': 1,
'disable_existing_loggers': False,
'handlers': 
    'file': 
        'level': 'ERROR',
        'class': 'logging.FileHandler',
        'filename': '/var/log/django_logs/debug.log'
    ,
    'mail_admins': 
     'level': 'ERROR',
       'class': 'django.utils.log.AdminEmailHandler'
               ,
,  
'loggers': 
    'django': 
    'handlers': ['file'],
    'level': 'ERROR',
    'propagate': True,
    ,
    'django.request': 
    'handlers': ['file'],
    'level': 'ERROR',
    'propagate': True,
    ,
,  
 

我的视图文件中有这个:

 def five_hundred_test(request):
   raise ValueError("raising this on purpose for testing for 500")
   return render(request, 'my_test/basic_css.html')

当我将浏览器指向此功能时,我收到 500 错误(如预期的那样),但没有任何内容发送到我的电子邮件,也没有任何内容放入日志文件中。我正在使用带有 python3 的 Django 1.9,使用 Apache 来运行服务器。

【问题讨论】:

如果您正确粘贴代码,LOGGING = 之前的空格太多。在任何情况下,您都应该始终从控制台添加错误回溯。 我一定没有正确粘贴。我还看到“记录”之前有太多空间。但是,代码不会引发任何错误(所以我不能包含跟踪)。它只是没有做它应该做的事情。 您的环境变量有错误:SERVER_EMAIL 收到一个电子邮件地址。我会相应地更新我的答案。 【参考方案1】:

这是我的工作设置。我没有添加console logger,因为我只在生产中使用它。灵感来自 Django 文档的相关Logging Examples。

这是我的电子邮件和日志设置,这里是相关django docs for the email backend的链接:

from os.path import join

# Email Configuration ==========================================================
ADMINS = [('Me', 'my@email'), ]
MANAGERS = ADMINS
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
DEFAULT_FROM_EMAIL = 'My Name To Display <my@email>'
SERVER_EMAIL = 'error_from@email'
EMAIL_HOST = 'smtp.server'  # An IP may work better
EMAIL_HOST_USER = 'username_for_login'
EMAIL_HOST_PASSWORD = 'password_for_login'
EMAIL_PORT = 587
EMAIL_USE_TLS = True

# Logging Configuration ========================================================
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'
        ,
    ,
    'handlers': 
        'file': 
            'level': 'ERROR',
            'class': 'logging.FileHandler',
            'filename': join(HOME_DIR, 'my_logs', 'debug.log'),
            'formatter': 'verbose'
        ,
        'mail_admins': 
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler',
            'formatter': 'simple'
        ,
    ,
    'loggers': 
        'django': 
            'handlers': ['file'],
            'level': 'ERROR',
            'propagate': True,
        ,
        'django.request': 
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        ,
    ,

我发现您的环境变量有两个错误:

SERVER_EMAIL 设置必须是电子邮件地址。 您使用的是TLS,因此正确的端口应该是587。

此外,您正在尝试将 Google 用作 SMTP 服务器,但根据updated answer,此服务不再可从 google 获得,您必须搜索另一个 SMTP 服务器。

如果您需要使用,我还有assembled a post 提供了一些调试技术。

【讨论】:

【参考方案2】:

这可以更简单地完成。如果您想同时登录到电子邮件和 Apache 日志文件,您需要在 settings.py 中执行以下操作:

    配置电子邮件设置 - 这确保 Django 可以发送电子邮件

     SERVER_EMAIL = 'me@me.eu'
    
     EMAIL_HOST = 'smtp.me.eu'
     EMAIL_PORT = 587
     EMAIL_USE_TLS = True
     EMAIL_HOST_USER = SERVER_EMAIL
     EMAIL_HOST_PASSWORD = 'password'
    

    DEBUG 设置为False - 这会启用错误电子邮件发送

     DEBUG = False
    

    将错误电子邮件接收者添加到ADMINS(您可能也需要MANAGERS) - 这指定谁接收错误电子邮件

     ADMINS = (
       ('Me', 'me@me.eu'),
     )
    
     MANAGERS = ADMINS
    

    最后,删除在禁用调试模式时不允许消息通过的默认控制台过滤器 - 这会使错误最终出现在 Apache 错误日志中

     from django.utils.log import DEFAULT_LOGGING
    
     # Assure that errors end up to Apache error logs via console output
     # when debug mode is disabled
     DEFAULT_LOGGING['handlers']['console']['filters'] = []
    

    这必须在settings.py 中,因为在导入设置后将立即使用DEFAULT_LOGGING 配置日志记录。

如果您想添加对从您自己的代码进行日志记录的支持,请同时在 settings.py 中配置根记录器:

# Enable logging to console from our modules by configuring the root logger
DEFAULT_LOGGING['loggers'][''] = 
    'handlers': ['console'],
    'level': 'INFO',
    'propagate': True

最后,您可能想要打开详细日志记录:

# Detailed log formatter
DEFAULT_LOGGING['formatters']['detailed'] = 
    'format': 'levelname asctime pathname:funcName:lineno message',
    'style': '',

DEFAULT_LOGGING['handlers']['console']['formatter'] = 'detailed'

然后您可以按如下方式使用它:

log = logging.getLogger(__name__)
log.info('Logging works!')

【讨论】:

【参考方案3】:

还要检查您的电子邮件客户端规则,了解电子邮件到达后如何处理。

我的电子邮件客户端中有一些规则有错误,它们正在阻止我的 Django 记录邮件进入/显示。

【讨论】:

以上是关于日志记录和电子邮件不适用于 Django 500的主要内容,如果未能解决你的问题,请参考以下文章

Django-Q 设置 Q_CLUSTER 'sync': True 不适用于单元测试

django-templated-email 不适用于 heroku

Spring Security 3 日志记录不适用于 Eclipse 中的 GAE

docker-compose 日志记录不适用于 syslog 选项

控制台目标日志记录不适用于 NUnit 测试用例源提供程序中调用的方法

解密不适用于在加密数据上使用解密值查询的记录