我是靠谱客的博主 真实彩虹,最近开发中收集的这篇文章主要介绍使用 Django 的日志模块,同时发送错误邮件到163邮箱,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

官方文档: https://docs.djangoproject.com/zh-hans/2.2/topics/logging/

Django 版本 2.2

Django 使用 Python 内置的 logging 模块处理系统日志.

Logging 的组成

logging 由4个部分组成: Loggers, Handlers, Filters, Formatters

loggers

loggers 是日志系统的入口, 可以配置日志级别。Python 定义了如下几种日志级别:

  • DEBUG:排查故障时使用的低级别系统信息
  • INFO:一般的系统信息
  • WARNING:描述系统发生了一些小问题的信息
  • ERROR:描述系统发生了大问题的信息
  • CRITICAL:描述系统发生严重问题的信息

每一条写入 logger 的消息都是一条日志记录, 日志记录包含 日志级别,一些元数据等。当logger处理一条消息时,会将消息的日志级别与自己的级别比对,只处理匹配或高于自己的日志级别,低于的会被忽略

接着 logger 会将消息传给 handler

Handlers

Handler 决定如何处理这一条消息。 描述了特定的日志行为,比如把消息输出到屏幕, 文件或网络socket。
handler 也有日志级别的概念。 一个 logger 可以有多个 handler, 每个handler对应不同的级别,这样就可以根据消息的重要性不同,来提供不同格式的输出。

Filters

filter 用来在消息从 logger 传递到 handler 过程中做额外的控制。

例如:

  • 可以添加一个 filter 只允许某个特定来源的 ERROR 消息输出
  • 可以写一个 filter,当满足一定条件时,把日志记录从 ERROR 降到 WARNING 级别。

formatters

最终的日志是通过文本呈现的,Formatter 描述了文本的格式。
一个 formatter 通常由包含 LogRecord attributes 的 Python 格式化字符串组成

在 Django 中进行配置, 使用日志

我们可以通过在 setting.py 增加一些配置,实现如下的功能:

  • INFO 级别的日志均输出到 djangoblog.log 文件, 最大 16 MB
  • DEBUG 为 Flase 时, INFO 级别的日志输出到控制台
  • DEBUG 为 True 时, ERROR 级别的日志写邮件自动发送给Admin

在 setting.py 中增加如下的内容:

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
# 定义日志输出的格式
'verbose': {
'format': '%(levelname)s [%(asctime)s]
%(filename)s-%(funcName)s-%(lineno)s: %(message)s'
},
},
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse',
},
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
'handlers': {
# 将级别高于 INFO 的日志输出到文件
'file': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
'filename': 'djangoblog.log',
# 保存日志的文件名
'maxBytes': 16777216,
# 16 MB
'formatter': 'verbose'
# 输出日志的格式
},
# 将级别高于 INFO 的日志输出到控制台
'console': {
'level': 'INFO',
'class': 'logging.StreamHandler',
'filters': ['require_debug_true'],
'formatter': 'verbose'
},
# 将级别高于 ERROR 的日志消息作为邮件发送给Admin
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler'
}
},
'loggers': {
'django': {
'handlers': ['file', 'console'],
'level': 'INFO',
'propagate': True,
},
# 会将堆栈等错误信息输出到文件和发送到邮箱中
'django.request': {
'handlers': ['console', 'file', 'mail_admins'],
'level': 'INFO',
'propagate': False,
},
}
}

发送邮件功能的配置

为了能让 Django 将错误日志发送到邮箱, 还需要在 setting.py 中添加如下配置:

EMAIL_HOST = 'your smtp'
# SMTP服务器
EMAIL_HOST_USER = 'your email' # 邮箱名
EMAIL_HOST_PASSWORD = 'your password'# 邮箱密码
EMAIL_PORT = 25
# 发送邮件的端口
EMAIL_USE_TLS = True
# 是否使用 TLS
DEFAULT_FROM_EMAIL = 'your email'
# 默认的发件人
ADMINS = [('John', 'John@gmail.com'), ('Peter', 'Peter@gmail.com')]
# 邮件接收人,可以有多个

如果使用别人的邮箱的话,不同的邮箱有很多不同的规定。
下面以 163 邮箱为例(2019/8/18):

EMAIL_HOST = 'smtp.163.com'
EMAIL_PORT = 25
EMAIL_USE_TLS = False
EMAIL_HOST_USER = '邮箱名'
EMAIL_HOST_PASSWORD = '授权码'
DEFAULT_FROM_EMAIL = EMAIL_FROM = EMAIL_HOST_USER
SERVER_EMAIL = '用户名<xxx@163.com>'
ADMINS = [('admin', 'admin@gmail.com')]
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'

各种坑:

  • 如果上面的邮箱配置有问题, Django 不会显示任何错误消息,反正就是收不到邮件。
  • 如果163邮箱端口选25, 注意这个端口是非 SSL 的, 必须设置 EMAIL_USE_TLS 为 False.
  • EMAIL_HOST_PASSWORD 是163邮箱设置的授权码而不是邮箱密码, 在163邮箱中开启SMTP服务。
  • SERVER_EMAIL: 一定得是这种形式: 用户名<xxx@163.com>, 用户名是163邮箱的用户名, 如果是新邮箱, 先发一次邮件,他会让你设置一个用户名。
  • 很多地方写什么: DEFAULT_FROM_EMAIL, EMAIL_FROM 设置成上面这样, 必须也要设置 SERVER_EMAIL。Django 文档中关于 mail_admins() 方法, 说明 From: 的值是从SERVER_EMAIL 这个设置中获得的

其他问题

没有显示堆栈的错误信息

发现ERROR级别的消息,并没有显示错误堆栈信息在控制台或者log文件中。
需要注意下面的配置

'django.request': {
'handlers': ['file', 'mail_admins', 'console'],
'level': 'INFO',
'propagate': False,
},

需要给 django.request 这个logger添加 handler

阿里云服务器上发送邮件不成功

应该是服务器的原因。阿里云新开通的ECS云服务器已默认封闭 25 邮件发送端口

使用 465 端口即可:

EMAIL_PORT = 465
EMAIL_USE_SSL = True

最后

以上就是真实彩虹为你收集整理的使用 Django 的日志模块,同时发送错误邮件到163邮箱的全部内容,希望文章能够帮你解决使用 Django 的日志模块,同时发送错误邮件到163邮箱所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部