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,一经查实,立即删除!

相关文章

【excel】常用的50个函数与基础操作(查询函数)

查询函数 (1)VLOOKUP与MATCH综合 1. VLOOKUP 按列纵向查找,输出单元格内容 VLOOKUP(用谁找,在哪找,在哪列,精确/模糊) 条件用&连接 VLOOKUP(用谁找,在…

网络安全知识核心之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

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

编程题:二叉树层次遍历(Java)

有一棵二叉树,每个节点由一个大写字母标识(最多26个节点)。 现有两组字母,分别表示后序遍历(左孩子->右孩子->父节点)和中序遍历(左孩子->父节点->右孩子)的结果,请你输…

有没有适合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() 重新编译试一下

ArrayList的常用方法

ArrayList是Java中常用的动态数组类&#xff0c;它提供了一系列用于操作和管理数组的方法。下面是一些ArrayList常用方法的介绍&#xff1a; add()方法&#xff1a;向ArrayList中添加元素&#xff0c;可以指定位置添加元素或者在末尾添加元素。 ArrayList<String> list …

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

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

跟我学C++中级篇——STL的中的删除

一、介绍 在STL中一般删除的方式有两类&#xff0c;一种是使用全局的std::remove(remove_if类似)&#xff0c;一种是使用容器自带的erase&#xff0c;前者其实并没有真正的删除数据&#xff0c;而后者则是在移动时&#xff0c;会有一些细节的处理&#xff0c;否则要么程序崩溃…

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

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

SOCKS5代理、代理IP、HTTP与网络安全的深层探寻

在这个数字化时代&#xff0c;网络技术的迅猛发展与网络安全的挑战相伴而生。作为一名软件工程师&#xff0c;深入探索SOCKS5代理、代理IP、HTTP协议及其在网络安全领域的应用&#xff0c;不仅是技术提升的必经之路&#xff0c;更是守护网络世界安全的关键。本文将带您深入理解…

计算机网络基础知识

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

C++ 小玉在游泳

文章目录 一、题目描述小玉在游泳题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 二、参考代码 一、题目描述 小玉在游泳 题目描述 小玉开心的在游泳&#xff0c;可是她很快难过的发现&#xff0c;自己的力气不够&#xff0c;游泳好累哦。已知小玉第一步能游 …

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

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

transformer的学习:Attention is all you need

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

使用ansible剧本进行lvm分盘

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