Django在日志中使用AdminEmailHandler发送邮件(同步),及celery异步发送日志邮件的实现
    		       		warning:
    		            这篇文章距离上次修改已过419天,其中的内容可能已经有所变动。
    		        
        		                
                在Django中,你可以使用AdminEmailHandler来在日志中发送邮件。这个处理器会将日志信息转换为邮件发送给管理员。
首先,你需要在你的settings.py中配置日志系统,并且添加AdminEmailHandler。
# settings.py
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'admin_email': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler',
            'include_html': True,
        },
    },
    'loggers': {
        'django.request': {
            'handlers': ['admin_email'],
            'level': 'ERROR',
            'propagate': True,
        },
    },
}这样配置后,任何在django.request logger下的错误级别日志都会通过邮件发送给管理员。
对于异步发送邮件,你可以使用Celery。首先,你需要安装并设置Celery。
pip install celery然后,在你的Django项目中设置Celery。
# celery.py
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
 
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project_name.settings')
 
app = Celery('your_project_name')
 
app.config_from_object('django.conf:settings', namespace='CELERY')
 
app.autodiscover_tasks()在你的Django应用中创建一个tasks.py文件,并定义一个异步发送邮件的任务。
# tasks.py
from __future__ import absolute_import, unicode_literals
from celery.task import task
from django.core.mail import send_mail
 
@task
def send_email(subject, message, recipient_list):
    send_mail(subject, message, None, recipient_list, fail_silently=False)然后,你可以在日志处理中使用这个异步任务来发送邮件。
# settings.py
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'async_admin_email': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler',
            'include_html': True,
            'formatter': 'verbose',
            'filters': ['special'],
            'email_backend': 'django.core.mail.backends.smtp.EmailBackend',
        },
    },
    'loggers': {
        'django.request': {
            'handlers': ['async_admin_email'],
            'level': 'ERROR',
            'propagate': True,
        },
    },
}在这个配置中,async_admin_email处理器会调用AdminEmailHandler,但是会异步通过Celery发送邮件。你需要确保你的邮件后端配置正确,并且Celery服务正在运行。
评论已关闭