日志记录
总览
Django利用并扩展了Python自带的logging模块,并以此来进行系统日志记录。

不同的角色
Python 日志配置由四个部分组成:
- Loggers
- Handlers
- Filters
- Formatters
Loggers
一个logger是日志系统的入口。每个logger都是一个命名的存储块,处理消息的存储。
一个logger配置一个日志等级。这个等级描述了该logger处理的信息安全等级。
- DEBUG: debug目的的低等级系统信息
- INFO: 一般系统信息
- WARNING: 次严重发生的问题
- ERROR: 主要严重发生的问题
- CRITICAL: 非常严重发生的问题
每个写入logger的信息都是一个Log Record。每个日志记录也具有一个日志等级来表示信息的安全等级。一个日志记录也包含一些描述记录的事件。通常也好办一个堆栈追踪或一个错误代码。
当信息到达logger时,信息的等级会与logger的等级比较,只有信息等级≥logger信息等级时,信息才会被进一步处理,否则信息会被忽略。
一旦logger认为一条信息需要被处理时,这个信息就会交给handler处理。
Handlers
handler决定了在logger内部如何处理信息。它用来描述特定的日志记录行为,例如将信息输出到屏幕,文件或网络socket。
和logger类似,handler也具有日志等级。如果日志记录的等级大于handler的日志等级,handler将不会处理这条日志信息。
一个logger具有多个handler,每个handler具有不同的日志等级。这样就可以针对不同的日志等级,予以不同的处理方式。
Filters
filter用来进一步控制哪些信息可以从logger传递给handler。
默认情况下,任何满足日志等级要求的信息都会被处理。但是,添加filter之后,可以添加额外的限制。例如,添加一个filter,用来限制只有来自特定资源的ERROR等级信息被处理。
filter可以在处理日志信息之前,处理日志日志记录。例如,可以添加一个满足一定条件时,将日志等级从ERROR降低为WARNING
filter可以安装在logger上,也可以安装在handler上。filter可以链式使用。
Formatters
最终一个日志记录,将以文本信息表示。Formatter描述了文本的具体形式。
formatter通常由一个Python包含LogRecord属性的文本字符串表示。同样,也可以编写继承了特定格式化行为的自定义formatter。
安全影响
日志系统处理潜在敏感信息。例如,日志记录可能包含web请求或堆栈追踪信息,同样自定义logger中收集的信息也可能具有一些安全影响。需要明确的知道如下信息:
- 收集什么信息
- 在哪里存储信息
- 信息如何转换
- 谁将获取这些信息
为了帮助控制敏感信息集合,可以明确哪些敏感信息在错误报告中过滤掉。
AdminEmailHandler
内置的AdminEmailHandler需要提一下。如果include_html选项被启用,邮件信息将包含完整的追踪信息,同时包括本地变量的名字和值,如果配置中DEBUG设置为True,则Django的配置也会被输出。
通常不建议通过邮件来发送这种敏感信息。应考虑使用第三方服务工具进行管理。
Django日志配置
- LOGGING_CONFIG: 设定解析日志配置方式,其值为一个以LOGGING为形参的可调用对象。设置为None时,可以阻止Django默认的logging配置。设为None后,Django依旧会发送logging请求,并走向自定义日志配置。
LOGGING_CONFIG = None
import logging.config
logging.config.dictConfig(...)
- LOGGING: 日志详细配置
- version: 设置版本
- disable_existing_logger: 推荐设置为False,关闭默认logger
- formatters:配置格式化器
- 值为多个键值对,定义多个formatter
- format:定义格式化时显示的内容
- style:格式的表示符
- filters:配置过滤器
- 值为多个键值对,定义多个filter
- (): 配置过滤器名称
- 形参名: 配置过滤器名称中使用形参的实参值
- handlers:配置处理器
- 值为多个键值对,定义多个handler
- level: 配置其处理的日志等级
- class:配置日志处理可回调对象名
- 形参名:配置class中可回调对象的形参的实参值
- formatter: 配置格式化器的键名
- filters: 配置过滤器列表,值为过滤器的键名
- loggers:配置日志管理器
- 值为多个键值对,定义多个logger
- handlers: 配置处理器列表,值为处理器的键名
- level:配置日志等级
- filters:配置过滤器列表,值为过滤器的键名
- propagate: 配置是否传播,True时表示传播至其他logger,False时表示不传播
# setting.py
LOGGING_CONFIG = "logging.config.dictConfig"
LOGGING = {
"version":1,
"disable_existing_logger": False,
"formatters": {
"verbose": {
'format': "{levelname} {asctime} {module} {process:d} {thread:d} {message}",
'style': "{"
},
"simple": {
'format': "{levelname} {message}",
'style': "{"
}
},
"filters":{
"special":{
"()":"project.logging.SpecialFilter",
"foo":"bar"
},
"require_debug_true":{
"()":"django.utils.log.RequireDebugTrue"
}
},
"handlers":{
"console":{
"level": "INFO",
"filters": ['require_debug_true'],
"class":"logging.StreamHandler",
"formatter":"simple"
},
"mail_admins":{
"level":"ERROR",
"class":"django.utils.log.AdminEmailHandler",
"filters":["special"]
}
},
"loggers":{
"django":{
"handlers":['console'],
'propagate':True
},
"django.request":{
"handlers":['mail_admins'],
"level":"ERROR",
'propagate':False
},
"myproject.customer":{
"handlers":["console", "mail_admins"],
"level":"INFO",
"filters":["special"]
}
}
}

浙公网安备 33010602011771号