Django在日志中使用AdminEmailHandler发送邮件(同步),及celery异步发送日志邮件的实现

目录

一、使用AdminEmailHandler实现发送日志通知邮件

1,配置日志项

2,配置邮件项

3,在视图里使用日志

二、继承AdminEmailHandler使用celery实现异步发送邮件

1,安装配置celery

2,继承AdminEmailHandler类,重写方法

3,编写异步任务

4,配置日志项

5,在视图里使用日志

6,启动celery并测试


在django的项目配置日志功能后,响应发送日志邮件到邮箱进行通知

一、使用AdminEmailHandler实现发送日志通知邮件

1,配置日志项

# settings.py# 日志配置
LOGGING = {"version": 1,"formatters": {"simple": {"format": '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'},"standard": {"format": '%(levelname)s:%(asctime)s:%(filename)s:%(lineno)d:%(message)s'}},"handlers": {"console": {"class": "logging.StreamHandler","level": "DEBUG","formatter": "simple"},"file": {"class": "logging.FileHandler","formatter": "simple","filename": "monitoring.log",  # 将日志信息写入本地文件中"encoding": "utf-8"},'mail_admins': {  # 新增mail_admins的handler,class为AdminEmailHandler'level': 'INFO',  # 发送邮件的级别,INFO及以上的级别会发送邮件'class': 'django.utils.log.AdminEmailHandler',  # 'formatter': "simple"}},"loggers": {"simple": {"level": "DEBUG","handlers": ["file", "mail_admins"],  # 添加mail_admins项"propagate": True},"standard": {"level": "ERROR","handlers": ["console", "file"],"propagate": True}}
}

2,配置邮件项

# 邮件配置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.qq.com'  # 如果是 163 改成 smtp.163.com
EMAIL_PORT = 587
EMAIL_HOST_USER = 'xxxx@qq.com'  # 登录邮箱的账号
EMAIL_HOST_PASSWORD = 'yxamfessnijaie'  # 授权码,各邮箱的设置中启用smtp服务时获取SERVER_EMAIL = 'xxxx@qq.com'  # 日志邮件的发送方
ADMINS = [('admin', 'xxxxx@qq.com')]  # 日志邮件的接收方

3,在视图里使用日志

import logginglogger = logging.getLogger('simple')  # 使用配置的simple项
logging.basicConfig(level=logging.INFO)  # 配置级别class MessageView(View):def get(self, request):# 查询的逻辑logger.info("查询成功")return JsonResponse({"status": 200})

为MessageView视图配置url后使用postman请求测试

可以看到视图请求成功返回了,邮件也收到了

但是存在一个问题:如此配置的发送日志邮件的功能是同步的,也就是说是阻塞的,需要邮件发送成功后视图才能返回结果,所以下面使用celery自定义一个异步的

二、继承AdminEmailHandler使用celery实现异步发送邮件

在项目根目录下创建celery_tasks文件夹,以下是目录结构:

1,安装配置celery

pip install celery django-redis
# settings.pyINSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','celery',  # 添加celery
]

在celery_tasks目录 下创建celery.py文件,定入下面的内容:

import os
from celery import Celeryos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'MediaManager.settings')app = Celery('MediaManager')  # 项目的名
app.config_from_object('celery_tasks.config', namespace='CELERY')  # 配置文件
app.autodiscover_tasks()  # 任务

在celery_tasks目录 下创建config.py文件,写入下面的内容:

CELERY_BROKER_URL = 'redis://127.0.0.1:6379/4'  # 存储celery任务队列的数据库
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/5'  # 存储结果的数据库
CELERY_TASK_SERIALIZER = 'json'
# celery时区
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERY_ENABLE_UTC = False

 在与settings.py同级的__init__.py文件里写入以下内容:

from celery_tasks.celery import app as celery_app
__all__ = ['celery_app']

2,继承AdminEmailHandler类,重写方法

在celery_tasks目录下创建handlers.py,写入下面的内容:

from django.utils.log import AdminEmailHandler
from celery_tasks.sms.tasks import send_email_asyncclass CeleryAdminEmailHandler(AdminEmailHandler):def emit(self, record):message = self.format(record)  # 邮件正文内容subject = super(CeleryAdminEmailHandler, self).format_subject(message)  # 邮件标题send_email_async.delay(subject, message)

重写AdminEmailHandler类里的emit方法

CeleryAdminEmailHandler的emit方法调用send_mail_async.delay()方法异步执行任务

3,编写异步任务

在在celery_tasks/sms目录下创建tasks.py,写入下面的内容:

from celery import shared_task
from django.core import mail
from django.core.mail import get_connection
from django.conf import settingsdef connection():return get_connection(backend=settings.EMAIL_BACKEND, fail_silently=True)@shared_task
def send_email_async(subject, message, *args, **kwargs):try:mail.mail_admins(subject, message, *args, connection=connection(), **kwargs)return "success"except Exception as e:print("发生错误:" + str(e))return "fail"

4,配置日志项

将日志配置中的mail_admins的class项替换为handlers.py里写的CeleryAdminEmailHandler类

# settings.py# 日志配置
LOGGING = {"version": 1,"formatters": {"simple": {"format": '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'},"standard": {"format": '%(levelname)s:%(asctime)s:%(filename)s:%(lineno)d:%(message)s'}},"handlers": {"console": {"class": "logging.StreamHandler","level": "DEBUG","formatter": "simple"},"file": {"class": "logging.FileHandler","formatter": "simple","filename": "monitoring.log",  # 将日志信息写入本地文件中"encoding": "utf-8"},'mail_admins': {  # 新增mail_admins的handler,class为AdminEmailHandler'level': 'INFO',  # 发送邮件的级别,INFO及以上的级别会发送邮件'class': 'celery_tasks.handlers.CeleryAdminEmailHandler',  # 替换为自己写的类'formatter': "simple"}},"loggers": {"simple": {"level": "DEBUG","handlers": ["file", "mail_admins"],  # 添加mail_admins项"propagate": True},"standard": {"level": "ERROR","handlers": ["console", "file"],"propagate": True}}
}

5,在视图里使用日志

import logginglogger = logging.getLogger('simple')  # 使用配置的simple项
logging.basicConfig(level=logging.INFO)  # 配置级别class MessageView(View):def get(self, request):# 查询的逻辑logger.info("查询成功")return JsonResponse({"status": 200})

6,启动celery并测试

先启动django项目,然后在项目根目录下启动celery

celery -A MediaManager  worker -l INFO -P eventlet

 

为MessageView视图配置url后使用postman请求测试

 可以发现postman返回的很快,因为这时发送邮件的耗时任务交由celery执行了,邮件也异步收到了

 redis查看任务返回的结果,result参数为success也提示成功了,这个success是在tasks.py里return过来的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/764121.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全知识核心之TCP与UDP区别

TCP 面向连接(如打电话要先拨号建立连接)提供可靠的服务;UDP 是无连接的,即发送数据之前不需要建立连接,;UDP 尽最大努力交付,即不保证可靠交付。(由于 UDP 无需建立连接,因此 UDP 不会引入建立…

HTML元素语义化(二)及补充

文章目录 HTML5新增元素 - audio**常见属性**代码展示 audio支持的音频格式input元素的扩展内容新增全局属性data–css属性 –white–spacecss属性–text–overflow HTML5新增元素 - audio HTML 元素用于在文档中嵌入音频内容, 和video的用法非常类似 常见属性 常见属性 值…

ts js vue 验证文件 MD5 值 spark-md5

ts js vue 验证文件 MD5 值 spark-md5 如何在前端中验证要上传的文件的 md5 值 一、安装 spark-md5 插件 需要用到 spark-md5 这个插件 官方 github:https://github.com/satazor/js-spark-md5/tree/master yarn add spark-md5 // 或 npm i spark-md5使用的时候引…

基于python+vue文学名著分享系统的设计与实现flask-django-nodejs-php

随着世界经济信息化、全球化的到来和互联网的飞速发展,推动了各行业的改革。若想达到安全,快捷的目的,就需要拥有信息化的组织和管理模式,建立一套合理、动态的、交互友好的、高效的文学名著分享系统。当前的信息管理存在工作效率…

有没有适合pr剪辑视频使用的蓝色魔法火焰能量特效素材模板

12个蓝色魔法火焰能量特效VFX元素pr素材模板。 可定制的能量电荷、灰尘等离子体和发光的电火花是游戏电影、电影特效或有影响力的视频内容的理想选择,增添了史诗般的电影质量。无论是神秘的爆炸、闪闪发光的闪电还是旋转的漩涡,每一部动画都是力量的灯塔…

Git版本控制

这是两个学习Git推荐必看的文档,第一个链接是Git的官方权威文档,第二个链接是国内程序员在开发中,总结的Git快速入门教程,掌握这个,也足够应付在工作中的场景。 Git权威书籍《ProGit》中文版https://gitee.com/progit…

Android Studio 编译报错 ( Could not find com.android.tools.build:gradle:4.2.1.)

检查下根目录下的 build.gradle 配置 , 是否只配置了 jcenter 仓库 ,加上 google()mavenCentral() 重新编译试一下

全网最靠谱的短网址平台,你知道几个?

在当今互联网时代,短网址平台成为了人们分享链接的常用工具。它们不仅可以将冗长的网址压缩为简洁的短链接,还能提供更多的功能和优势。在众多的短网址平台中,有几个平台以其可靠性和出色的性能脱颖而出。今天,我们就来介绍几个全…

《数字人》三个灵魂拷问 是什么?为什么?怎么用?

数字人的出现和发展是由于人工智能和计算机图形学等技术的进步,使得我们可以更好地模拟和创造人类的外貌、行为和交流能力。 1.数字人是什么? 数字人通常是指利用计算机技术和人工智能技术创建的虚拟人物或角色。这些数字化的人物可以具有各种外貌、行为…

计算机网络基础知识

一、网络概述 1.网络定义与功能 利用通信线路物理地将不同的终端连接起来,按照网络协议相互通信,以共享软件、硬件和数据资源为目标的系统 数据通信:在计算机之间传送各种信息 资源共享:硬件资源共享、软件资源共享 负荷均衡&am…

鸿蒙开发钱途不可限量!万人大厂岗位激增月入2万机会来了

抢人!抢人!抢人! 抢滩鸿蒙,人才先行。2024年鸿蒙人才抢夺大战一触即发,刻不容缓。 随着时代的发展,就业竞争愈加激烈,内卷化越来越严重。如今互联网行业以及计算机软件开发领域成为了很多大学…

transformer的学习:Attention is all you need

目录 整体概述:​编辑​编辑 encoder: embedding: ​编辑 self-attention: 向量的相似度计算: qkv怎么来的​编辑 softmax: code multi-head-attention 位置编码: 残差&&FFN&…

使用ansible剧本进行lvm分盘

使用 Ansible 剧本(Playbook)进行 LVM 分区管理是一种自动化的方式,可以帮助管理员在多台主机上批量管理逻辑卷。 部署环境 3台主机,添加硬盘 ansible-galaxy collection install community.general 联网执行,下…

Linux课程____Samba文件共享服务

一、 Samba服务基础 SMB协议,服务消息块 CIFS协议,通用互联网文件系统 1.Samba 服务器的主要程序 smbd:提供对服务器中文件、打印资源的共享访问 nmbd:提供基于 NetBlOS 主机名称的解析 2.目录文件 /etc/samba/smb.conf 检查工具:test…

d3dcompiler_47.dll缺失怎么修复?分享五种方法

在计算机编程和游戏开发中,D3DCompiler47.dll文件是一个非常重要的组件。它是由微软公司开发的DirectX SDK的一部分,主要用于编译DirectX的Shader代码。然而,对于许多初学者和开发者来说,他们可能对这个文件的属性和功能并不完全了…

python的O2O生鲜食品订购flask-django-nodejs-php

用户只能通过一些类似软件进行查看生鲜超市,这样的管理方式仍然是比较机械传统的,本文通过对市面上常见的线上管理系统与现实生活中结合问题的讨论,从一个微信小程序的O2O生鲜食品订购角度进行需求分析,提供一些新的思路&#xff…

RHCSA(第一天)

1.部署Linux环境: 安装Vmware之后,在windows会产生两个虚拟网卡:vmnet1, vmnet8 部署Linux:需要有网卡,必须要知道root用户的密码,和你普通的用户的用户名和密码 远程连接配置&#xff1a…

Linux:文件读取指令

Linux:文件读取指令 cat指令more指令less指令head指令 & tail指令grep指令 cat指令 cat指令用于查看目标文件的内容。 语法:cat [选项][文件] 比如直接使用cat读取一个文件: 可以看到,其直接在指令的下方,输出了t…

Python中错误和异常的区别你搞清楚了吗?

​ 在Python编程的世界里,错误(Error)和异常(Exception)都是用来处理运行时出现的问题的。但它们之间有着微妙的差别,今天我们就来弄清楚。 错误(Error)通常指的是那些更严重、不可…

OrangeDAO联合创始人Don Ho确认出席Hack.Summit() 2024区块链开发者大会

随着Web3技术的快速发展,区块链领域备受关注的盛会——Hack.Summit() 2024 区块链开发者大会即将于 2024 年 4 月 9 日至 10 日在香港数码港隆重启幕。本次大会不仅是 Hack.Summit() 系列在亚洲的首次亮相,更象征着全球区块链行业对亚洲,尤其…