django使用python内建的logging模块去建造本身的系统日志的,若是你想详细了解这个模块的话,请本身去看python的说明文档,这里仅仅介绍django中的日志系统html
日志配置包括四个部分:记录器,处理器,过滤器和格式器,下面咱们来一一讲解python
一个记录器是日志系统的一个实体,每个记录器是一个已经命名好的能够将消息为进程写入的“桶”。sql
每个记录器都会有一个日志等级,每一个等级描述了记录器即将处理的信息的严重性,python定义了如下五个等级:django
debug:出于调试目的的低层次系统信息网络
每一条被写入记录器的信息成为一条日志记录,每条日志记录都有一个代表该记录严重性的日志等级,每条日志信息也会包含一些有用的元信息代表已经被记录的事件,好比栈追溯和错误代码。socket
当一条信息被发往记录器的时候,消息的记录等级会和记录器的等级相比较,若是符合甚至超越当前等级,则被发往处理器处理,不然会被忽略掉。函数
处理器是决定日志记录器中对应的实体消息发生了什么的引擎,描述了一个具体的日志行为,好比输出到屏幕,或者一个文件,抑或一个网络socket。post
和记录器同样,没有到达相应等级的消息会被忽略。网站
一个记录器能够有多个处理器,一个处理器能够有不一样的日志等级,所以你能够根据消息的重要性而提供不一样的提示。ui
过滤器是用来提供额外的控制,控制哪些日志记录能够被传给处理器处理。
默认状况下,只要日志消息符合相应的等级要求就会传给对应的处理器处理,然而,经过安装过滤器,你能够在日志记录过程当中设置额外的内容,例如,你能够安装一个过滤器使得某个源只有error级别的消息才会被发送。你也可使用过滤器修改以前会被发送的消息,例如,你能够写一个过滤器使得符合某些条件的error等级的消息降级为warning等级。
过滤器能够给处理器和记录器使用,多个过滤器能够级联使用。
控制日志输出的格式,格式使用python的字符串控制格式
一旦配置好你的记录器,处理器,过滤器和格式器,你须要在你的代码中调用日志功能,下面是一个简单的例子:
# import the logging library import logging # Get an instance of a logger logger = logging.getLogger(__name__) def my_view(request, arg1, arg): ... if bad_mojo: # Log an error message logger.error('Something went wrong!')
logging.getLogger()的调用得到一个记录器的实体,记录器实体经过名字来辨别。
像上面的那个例子,通常是使用__name__,包含记录器的python模块的名字,这使得基于每一个模块的记录成为可能
或者你能够是用点号相连的名字,这意味着记录器的层次,点号以前的是点号以后的父模块,例如
# Get an instance of a specific named logger logger = logging.getLogger('project.interesting.stuff')
这种方式也很重要,由于经过层次,子层次的消息能够把消息发送给本身的父层次,若是你不想把消息发给你的父层次,记得把发送开关关闭掉。(下面会有介绍到)
对应日志的五个等级,日志调用有五个对应的方法:
还有两个可用的日志方法能够调用:
在代码中调用日志的前提是已经配置好了日志系统的记录器,处理器,过滤器和格式器,咱们经过一个复杂的例子来详细讲解吧:
LOGGING = { 'version': 1,#指明dictConnfig的版本,目前就只有一个版本,哈哈 'disable_existing_loggers': True,#禁用全部的已经存在的日志配置 'formatters': {#格式器 'verbose': {#详细 'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s' }, 'simple': {#简单 'format': '%(levelname)s %(message)s' }, }, 'filters': {#过滤器 'special': {#使用project.logging.SpecialFilter,别名special,能够接受其余的参数 '()': 'project.logging.SpecialFilter', 'foo': 'bar',#参数,名为foo,值为bar } }, 'handlers': {#处理器,在这里定义了三个处理器 'null': {#Null处理器,全部高于(包括)debug的消息会被传到/dev/null 'level':'DEBUG', 'class':'django.utils.log.NullHandler', }, 'console':{#流处理器,全部的高于(包括)debug的消息会被传到stderr,使用的是simple格式器 'level':'DEBUG', 'class':'logging.StreamHandler', 'formatter': 'simple' }, 'mail_admins': {#AdminEmail处理器,全部高于(包括)而error的消息会被发送给站点管理员,使用的是special格式器 'level': 'ERROR', 'class': 'django.utils.log.AdminEmailHandler', 'filters': ['special'] } }, 'loggers': {#定义了三个记录器 'django': {#使用null处理器,全部高于(包括)info的消息会被发往null处理器,向父层次传递信息 'handlers':['null'], 'propagate': True, 'level':'INFO', }, 'django.request': {#全部高于(包括)error的消息会被发往mail_admins处理器,消息不向父层次发送 'handlers': ['mail_admins'], 'level': 'ERROR', 'propagate': False, }, 'myproject.custom': {#全部高于(包括)info的消息同时会被发往console和mail_admins处理器,使用special过滤器 'handlers': ['console', 'mail_admins'], 'level': 'INFO', 'filters': ['special'] } } }
相信看完这个例子,对日志系统的配置你们基本了解了吧
若是你自定义了一个处理器,而后再settings.py文件有配置,若是这是你在类实现文件里面导入settings模块的时候,就会出现循环导入的问题,建议只在settings.py配置文件里面配置
使用LOGGING_CONFIG属性自定义和禁用日志配置,LOGGING_CONFIG=None禁用
django提供三个自带的记录器:
django记录器是捕捉全部消息的记录器,没有消息是直接发往django记录器的
5XX会引起一个error消息,4XX会引起一个warning消息,这个记录器还附带有额外的上下文:
全部的由请求运行的sql语句都会记录一条debug的消息,每一个记录器还附带有额外的上下文:
处于网站运行的表现缘由,仅当settings.DEBUG=True的时候,这个处理器才生效,不然即便配置了也无效
除了python模块自带的,django自定义了一个处理器
这个处理器每收到一条消息就会发往站点管理员,若是日志信息包含request属性,那么整个request的详细信息也会被包包含在Email中发往站点管理员;若是日志信息包含堆栈跟踪信息,堆栈跟踪信息也会被发送。
include_html属性控制当DEBUG为真的时候是否发送那些回溯信息,由于这些都是很敏感的系统系统,若是被人截获,可能会发生危险,因此要谨慎。配置这个属性示例以下:
'handlers': { 'mail_admins': { 'level': 'ERROR', 'class': 'django.utils.log.AdminEmailHandler', 'include_html': True, } },
除了python自带的,django提供了两个自带的过滤器:
这个过滤器接受一个回调函数(这个函数接受一个参数,被记录的信息),每一个记录经过过滤器的时候都会调用这个回调函数,当回调函数返回False的时候,不处理这个记录。下面是一个示例:
from django.http import UnreadablePostError def skip_unreadable_post(record): if record.exc_info: exc_type, exc_value = record.exc_info[:2] if isinstance(exc_value, UnreadablePostError): return False return True
'filters': { 'skip_unreadable_posts': { '()': 'django.utils.log.CallbackFilter', 'callback': skip_unreadable_post, } }, 'handlers': { 'mail_admins': { 'level': 'ERROR', 'filters': ['skip_unreadable_posts'], 'class': 'django.utils.log.AdminEmailHandler' } },
这个过滤器仅当settings.DEBUG为False的时候会生效,默认是启用的,仅当settings.DEBUG=False的时候,AdminEmailHandler才生效
'filters': { 'require_debug_false': { '()': 'django.utils.log.RequireDebugFalse', } }, 'handlers': { 'mail_admins': { 'level': 'ERROR', 'filters': ['require_debug_false'], 'class': 'django.utils.log.AdminEmailHandler' } },