概述
官方文档: 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邮箱所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复