django日志
1、概述
django框架的日志通过python内置的logging模块实现的,日记可以记录自定义的一些信息描述,也可以记录系统运行中的一些对象数据,还可以记录包括堆栈跟踪、错误代码之类的详细信息
logging主要由4部分组成:Loggers、Handlers、Filters和Formatters
2、settings中完整的配置
LOGGING = {
# 固定值
'version':1,
# 格式器,详细见第6点
'formatters': {
},
# 过滤器,详细见第5点
'filters':{
},
# 处理器,详细见第4点
'handlers':{
},
# 记录器,详细见第3点
'loggers':{
},
# 根记录器,配置等同普通记录器,但是没有propagate配置项
'root':{
},
# 默认为False。True:是将配置解释为现有配置的增量。False:配置会覆盖已有默认配置
'incremental':True,
# 默认为True。禁用任何现有的非root记录器。如果设置了incremental=True,则此配置无效
'disable_existing_loggers': False
}
3、Loggers
这个类是logging系统的入口
python定义了日志的5个级别,分别对应python程序中日志信息的不同严重性(严重程度从上到下越来越严重,也就是级别越高):
- DEBUG:用于调试的最低级的系统信息
- INFO:一般性的系统信息
- WARNING:一些警告性的信息,发生了一些小问题,这些问题不影响系统的正常运行,但是也不建议出现
- ERROR:系统出现错误了,该错误会影响系统的正常运行,记录错误相关的信息
- CRITICAL:非常严重的问题,譬如可能引起系统崩溃的问题等
在使用logger记录日志时,每条日志消息也有日志级别,当logger记录该日志消息时,会将消息的级别和logger配置的日志级别进行比较,只有消息的级别达到或超过logger配置的日志级别,才会将该日志消息传递给handler进一步处理,否则该日志消息会被忽略
PS:一般开发环境时,会启用DEBUG级别,而在生产环境中,启用WARNING或ERROR级别
1.settings中配置
通过在settings中配置LOGGING配置项实现日志配置,共4个配置项(都是可选的,不过一般会指定handler):
- level:指定记录日志的级别,没有配置则处理所有级别的日志
- propagate:设置该记录器的日志是否传播到父记录器,不设置则是True
- filters:指定过滤器列表
- handlers:指定处理器列表
示例如下:
LOGGING = {
'version': 1, # 固定值,现在只有这一个版本
'disable_existing_loggers': False, # 设置已存在的logger不失效
'loggers': {
'': {
'handlers': ['console'],
},
'django': {
'handlers': ['console'],
'propagate': True,
},
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': False,
},
'myproject.custom': {
'handlers': ['console', 'mail_admins'],
'level': 'INFO',
'filters': ['special']
}
}
}
说明:
配置了4个 logger, 分别对应2个不同的handler(console输出日志到控制台,mail_admins输出日志到邮件)
- ‘’:默认的记录器,不指定特定名称,那么就是使用这个记录器,没有配置level,那么就是处理所有级别的日志,传递所有级别的日志到console控制器
- django:传递所有级别的日志到console控制器
- django.request:django记录器的子记录器,处理ERROR级别及以上的日志,propagate设置为 False,表明不传播日志给 “django”,该logger传递日志到mail_admins控制器
- myproject.custom:处理INFO级别及以上的日志,应用了一个 special 的过滤器来过滤日志,传递日志到2个控制器([‘console’, ‘mail_admins’])处理
django框架有个默认的配置:DEFAULT_LOGGING,一旦配置了自己的LOGGING后,那么所有的默认的LOGGER全部都失效,失效不等于没有记录器了,而是说记录器不起作用了,即不会记录日志,也不会将日志传播给父记录器。因此你应该非常小心使用,因为你会感觉你丢了日志一样,可以手动设置同名的logger实现覆盖,如:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': '/path/to/django/debug.log',
},
},
'loggers': {
# 覆盖了 django 记录器,所有django的记录日志最后全部写入到文件中
'django': {
'handlers': ['file'],
'level': 'DEBUG',
'propagate': True,
},
},
}
disable_existing_loggers默认是True,除非设置disable_existing_loggers为False,那么默认配置的记录器才会起作用
LOGGING = {
'disable_existing_loggers': False,
}
配置还可以使用系统变量,如下示例中读取 DJANGO_LOG_LEVEL 环境变量:
import os
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django': {
'handlers': ['console'],
'level': os.getenv('DJANGO_LOG_LEVEL'</