官方文档: https://docs.djangoproject.com/zh-hans/2.2/topics/logging/
Django 版本 2.2
Django 使用 Python 内置的 logging 模块处理系统日志.
logging 由4个部分组成: Loggers, Handlers, Filters, Formatters
loggers
loggers 是日志系统的入口, 可以配置日志级别。Python 定义了如下几种日志级别:
每一条写入 logger 的消息都是一条日志记录, 日志记录包含 日志级别,一些元数据等。当logger处理一条消息时,会将消息的日志级别与自己的级别比对,只处理匹配或高于自己的日志级别,低于的会被忽略
接着 logger 会将消息传给 handler
Handlers
Handler 决定如何处理这一条消息。 描述了特定的日志行为,比如把消息输出到屏幕, 文件或网络socket。
handler 也有日志级别的概念。 一个 logger 可以有多个 handler, 每个handler对应不同的级别,这样就可以根据消息的重要性不同,来提供不同格式的输出。
Filters
filter 用来在消息从 logger 传递到 handler 过程中做额外的控制。
例如:
formatters
最终的日志是通过文本呈现的,Formatter 描述了文本的格式。
一个 formatter 通常由包含 LogRecord attributes 的 Python 格式化字符串组成
我们可以通过在 setting.py 增加一些配置,实现如下的功能:
在 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', '[email protected]'), ('Peter', '[email protected]')] # 邮件接收人,可以有多个
如果使用别人的邮箱的话,不同的邮箱有很多不同的规定。
下面以 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 = '用户名'
ADMINS = [('admin', '[email protected]')]
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
各种坑:
EMAIL_USE_TLS
为 False.用户名
, 用户名是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