Django2.1⽇志中⽂⽂档
Django2.1 ⽇志中⽂⽂档
: Django2.1 Python
当你凝望深渊的时候,深渊也在凝望你。
作者:
NOTE: 此⽂档为参照官⽅技术⽂档翻译得出,其中如有错误望可以指正。
⽂章⽬录
##快速⼊门
Django使⽤Python的内置⽇志()模块构建⾃⼰的⽇志系统。在Python的⽂档中由该模块的详细说明。由此,如果您从未使⽤过Python的⽇志框架(或者即使您已经使⽤过),您可以阅读快速⼊门的内容。
###球队阵容:
Python⽇志配置由四个部分组成:
– 记录器
– 处理器
– 过滤器
– 格式化器
####Loggers 记录器
⽇志记录器是进⼊⽇志系统的⼊⼝点。每个⽇志记录器都是⼀个有名的‘桶’,将消息写⼊其中进⾏处理。
记录器具有⽇志级别属性(log level)。这个⽇志级别描述⽇志记录器所处理消息的严重程度。Python定义的以下⽇志级别:DEBUG:⽤于调试⽬的的低等级系统信息
INFO:⼀般的系统信息。
WARNING:描述发⽣的⼀个⼩问题的信息
ERROR:描述发⽣的⼀个⼤问题的信息
CRITICAL:描述已发⽣的关键问题的信息。
写⼊⽇志记录器的每个消息都是⽇志记录。每个⽇志记录都有⼀个⽇志级别,指⽰特定消息的严重程度。⽇志记录还可以包含描述正在记录的事件的有⽤元数据。这可能包括详细信息,例如堆栈跟踪或错误代码。
当消息被提供给记录器时,将消息的⽇志级别与记录器的⽇志级别进⾏⽐较。如果消息的⽇志级别满⾜或超过记录器本⾝的⽇志级别,则消息将进⾏进⼀步处理。如果没有,消息将被忽略。
⼀旦⽇志记录器确定需要处理消息,就会将其传递给处理程序。
####Handlers 处理器
处理程序是决定⽇志记录器中每个消息处理⾏为的引擎。它描述特定的⽇志记录⾏为,例如向屏幕、⽂件或⽹络套接字写⼊消息。
与⽇志记录器⼀样,处理程序也具有⽇志级别。如果⽇志记录的⽇志级别不满⾜或超过处理程序的级别,处理程序将忽略消息。
⽇志记录器可以有多个处理程序,每个处理程序可以有不同的⽇志级别。通过这种⽅式,可以根据消
息的重要性提供不同形式的通知。例如,您可以安装⼀个将错误和关键消息转发到分页服务的处理程序,⽽第⼆个处理程序将所有消息(包括错误和关键消息)记录到⼀个⽂件中,以便稍后进⾏分析。
####Filters 过滤器
过滤器⽤于提供对⽇志记录从⽇志记录器传递到处理程序过程中的额外控制。
默认情况下,满⾜⽇志级别要求的任何⽇志消息都将被处理。但是,通过安装过滤器,您可以在⽇志记录过程中添加额外的条件。例如,您可以安装⼀个过滤器,该过滤器只允许发出来⾃特定源的错误消息。
过滤器还可以⽤于在发出⽇志记录之前修改⽇志记录。例如,您可以编写⼀个过滤器,如果满⾜特定的⼀组条件,则将错误⽇志记录降级为警告记录。
过滤器可以安装在记录器或处理器上;可以在⼀个链中使⽤多个过滤器来执⾏多个过滤操作。
####Formatters 格式化器
最终,需要将⽇志记录呈现为⽂本。格式化器描述了⽂本的精确格式。格式化程序通常由包含⽇志记录属性()的Python格式化字符串组成;但是,您也可以编写⾃定义格式化程序来实现特定的格式化⾏为。
##使⽤⽇志
⼀旦配置了⽇志记录器、处理程序、过滤器和格式化程序,就需要将⽇志调⽤放到代码中。使⽤⽇志框架⾮常简单。这⾥有⼀个例⼦:
# import the logging library
import logging
# Get an instance of a logger
logger = Logger(__name__)
def my_view(request, arg1, arg):
...
if bad_mojo:
# Log an error message
<('Something went wrong!')
就是这样!每次符合bad_mojo条件时,都会写⼊错误⽇志记录。
##命名记录器
调⽤logger()可以获取(有必要的话会新建)⼀个记录器(logger)的实例。记录器由名称标识。这个名称标识被配置的记录器(logger)。
按照惯例,⽇志记录器的名称通常是**name**,即包含⽇志记录器的python模块的名称。这允许您根据每个模块过滤和处理⽇志调⽤。但是,如果您有其他⽅式来组织⽇志消息,您可以提供任何以点分隔的名称来标识您的⽇志记录器:
# 获取⼀个特定名称记录器的实例
logger = Logger('project.interesting.stuff'
⽇志记录器名称的点路径定义了⼀个层次结构。pproject.interesting记录器被认为是project.interesting.stuff记录器的⽗类; project记录器被认为是project.interesting记录器的⽗类。
为什么等级制度很重要?因为⽇志记录器可以被设置为将⽇志调⽤传递给它们的⽗类。通过这种⽅式,您可以在⽇志记录器树的根上定义⼀组处理程序,并捕获⽇志记录器树中的所有⽇志调⽤。在project
命名空间中定义的⽇志处理程序将捕获在project.interesting和projects.interest.stuff⽇志记录器上发出的所有⽇志消息。
这种传播可以在每个记录器的基础上进⾏控制。如果您不想让⼀个特定的记录器传播给它的⽗类,您可以关闭这种⾏为。
##调⽤记录器
⽇志记录器实例包含输⼊默认⽇志级别条⽬的⽅法:
logger.debug()
()
logger.warning()
<()
还有其两条可⽤的⽇志调⽤:
logger.log():⼿动发出带有特定⽇志级别的⽇志消息。
##配置记录器
当然,仅仅在代码中添加⽇志调⽤是不够的。您还需要配置⽇志记录器、处理器、过滤器和格式化器,以确保⽇志输出以⼀种有⽤的⽅式输出。
Python的⽇志库提供了⼀些配置⽇志从编程接⼝到配置⽂件技巧。默认情况下,Django使⽤格式。
为了配置⽇志记录,您可以使⽤来定义⽇志记录设置的字典。这些设置描述了⽇志设置中需要的⽇志记录器、处理器、过滤器和格式化器,以及希望这些组件具有的⽇志级别和其他属性。
默认情况下,设置与Django的默认⽇志配置合并采⽤如下⽅案。
如果dictConfig中的disable_existing_loggers键设置为True(这是默认设置),那么默认配置中的所有记录器都将被禁⽤。禁⽤的⽇志记录器与删除的⽇志记录器不同;⽇志记录器将仍然存在,但会⾃动丢弃所有登录到⽇志记录器的内容,甚⾄不会将条⽬传播到⽗⽇志记录器。因此,您应该⾮常⼩⼼地使⽤disable_existing_loggers:True;这可能不是你想要的。相反,您可以将disable_existing_loggers设置为False 并重新定义⼀些或所有默认的loggers;或者您可以将设置为None并。python官方文档中文版
⽇志记录被配置为Django **setup()**函数的⼀部分。因此,您可以确定⽇志记录器可以随时在项⽬代码中使⽤。
例如
dictConfig格式的完整⽂档是关于⽇志配置字典的最佳说明。但是,为了让您有个⼤概的了解,这⾥有⼏个例⼦。
⾸先,这⾥有⼀个简单的配置,它将django⽇志记录器的所有⽇志写⼊本地⽂件:
LOGGING ={
'version':1,
'disable_existing_loggers':False,
'handlers':{
'file':{
'level':'DEBUG',
'class':'logging.FileHandler',
'filename':'/path/to/django/debug.log',
},
},
'loggers':{
'django':{
'handlers':['file'],
'level':'DEBUG',
'propagate':True,
},
},
}
如果使⽤这个⽰例,请确保将“filename”路径更改为可由运⾏Django应⽤程序的⽤户写⼊的位置。
其次,这⾥有⼀个如何让⽇志系统将Django的⽇志打印到控制台的⽰例。它可能在本地开发中有⽤。
默认情况下,该配置只向控制台发送INFO级别或更⾼的消息(与Django的默认⽇志配置相同,只是默认值仅在DEBUG=True时显⽰⽇志记录)。Django没有记录很多这样的消息。但是,使⽤这个配置,您可以设置环境变量DJANGO_LOG_LEVEL=DEBUG,以查看Django的包含所有数据库查询的详细调试⽇志:
import os
LOGGING ={
'version':1,
'disable_existing_loggers':False,
'handlers':{
'console':{
'class':'logging.StreamHandler',
},
},
'loggers':{
'django':{
'handlers':['console'],
'level': os.getenv('DJANGO_LOG_LEVEL','INFO'),
},
},
}
最后,这⾥有⼀个相当复杂的⽇志设置⽰例:
LOGGING ={
'version':1,
'disable_existing_loggers':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,
},
'quest':{
'handlers':['mail_admins'],
'level':'ERROR',
'propagate':False,
},
'myproject.custom':{
'handlers':['console','mail_admins'],
'level':'INFO',
'filters':['special']
}
}
}
这个⽇志配置做以下事情:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。