文章目录
一、logging模块
django使用python的内置模块logging来管理自己的日志
logging模块的四大组件
- Loggers
- Handlers
- Filters
- Formatters
- Loggers
Loggers(日志记录器)
- 系统中的每一条日志都是由该组件进行记录的,每一个记录器都应该有其自己的名称并标记其最低记录的等级
- DEBUG:所有等级中最低,其信息一般用来作为调试的辅助信息
- INFO:程序的一般信息
- WARNING:警告,通常用来对某些可能出现的错误且不会影响程序正常运行的信息进行警告。
- ERROR:错误,表示出现了某种错误。
- CRITICAL:奔溃,出现了严重级别的错误。
- 日志文件中的每一条信息都是一条信息记录,都应该有其对应的级别,然后记录一些打印该条日志时的一些元数据,来告诉查阅者出现这条日志时程序的大致情况,例如调用堆栈或者状态码等等。
- 当一条日志给到logger时,logger会对该条信息的级别与自身的级别进行比较,如果该日志级别不低于本身级别,logger就会进行下一步操作。相反,如果日志的信息级别比logger的低,那么其会忽略这条日志,不进行任何操作。
- 当logger经过级别的比较之后决定要对某条日志进行处理时,就将该条日志交给了Handlers
Handlers(日志处理器)
- 他来处理具体每条信息,例如是将日志打印到屏幕还是记录到文件或者发送至某个网络连接。
- 和记录器(logger)一样,Handlers也有自己的记录级别,如果日志级别低于handler的级别,handler同样会忽略掉该条日志。
- 另外,一个logger可以拥有多个handler,而且不同的handler可以拥有不同的记录级别。这样,我们就可以根据不同的日志级别对同一个logger做不同的事情,例如我们可以将级别为WARNING和ERROR的日志打印到屏幕,而级别为CRITICAL级别的日志直接发送到管理者邮箱。
Filters(日志过滤器)
- 提供了传递给handler之前的附加功能。
- 在通常情况下,一条日志信息只要达到logger的级别之后就会传递给handler处理,但是我们可以通过使用filter来对日志进行额外的过滤。例如我们可以使用某个filter来控制只允许某个特定的源的ERROR级别的日志。
- Filter还运行在处理之前修改日志,例如降低或者提高日志的级别。
- Filter可以在logger和handler中同时使用,而且多个filter会同时工作。
Formatters(日志记录格式化)
- 定义了怎么显示内容,因为最终的日志都会是以文本的形式展现,formatter就是描述怎么来做这件事。
- formatter通常都是使用python格式化字符串的方法来对日志进行格式化,具体的属性列表可参考
二、django官方中文文档
三、django日志配置,简单例子分析
这几个例子,官方文档上都有,这里只做简要分析
- 第一种,输出到文件
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': '/path/to/django/debug.log', # 输出日志到指定位置的文件中
},
},
'loggers': {
'django': { # django框架的输出日志配置
'handlers': ['file'],
'level': 'DEBUG',
'propagate': True,
},
},
}
- 第二种,输出到控制台(屏幕)
import os
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django': {
'handlers': ['console'],
'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG'), # 此为True时,可看到所有日志。包含ORM生成的sql语句
},
},
}
- 第三种,复杂点的配置
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
# verbose输出稍复杂信息,等级、日志、附加时间、进程号等等
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
},
# simple只输出日志级别和日志信息
'simple': {
'format': '%(levelname)s %(message)s'
},
},
'filters': {
# 使用别名special,如果这个过滤器需要附加参数,它可以提供一个配置字典
# 在本例中,在实例化SqecialFilter时参数foo会被赋值为bar
'special': {
'()': 'project.logging.SpecialFilter',
'foo': 'bar',
},
# 只有在环境变量DEBUG等于True时才输出日志
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
'handlers': {
# 直接输出级别为DEBUG(或更高)的信息到控制台,本handler使用名称为simple的format
'console': {
'level': 'INFO',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
# 使用AdminEmailHandler发送级别为ERROR(或更高)的信息到网站管理员邮箱,这个handler使用名称为special的过滤器
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
'filters': ['special']
}
},
'loggers': {
# 打印所有信息到名称为console的handler
'django': {
'handlers': ['console'],
'propagate': True,
},
# 传递ERROR级别的信息到名为mail_admins的handler
# 另外的,该条记录器标示了如果使用本记录器处理日志,那么将不使用django处理
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': False, ###
},
# 传递所有INFO级别(或更高)信息到名称为special的过滤器和两个handler
# 这样就实现了如果是INFO级别的信息则打印到控制台,如果是ERROR或者CRITICAL级别的则通过email发送给管理员
'myproject.custom': {
'handlers': ['console', 'mail_admins'],
'level': 'INFO',
'filters': ['special']
}
}
}