唯一完美的代码是从未写过的代码。作为一个开发者,你必然会面临错误,并将负责调试它们。
如果你用Python编码,你可以随时查看它的错误信息来弄清楚发生了什么。但是如果发生了错误,你不知道是什么破坏了你的代码呢?
在后台可能会有一些奇怪的错误,但你却无法识别它。你总是可以把它关掉再打开--甚至更好,你可以检查日志。
什么是日志?
如果发生错误或你的应用程序决定奇怪地工作,你的日志文件就会派上用场。你可以穿越它们,找出应用程序到底在哪里出现问题,以及你如何复制这些问题。
通过复制问题,你可以更深入地挖掘并找到一个合理的解决方案来解决这些错误。如果有了日志文件,一些可能需要几个小时才能发现的问题可能只需要几分钟就能诊断出来。
日志在Django中如何工作
值得庆幸的是,Django支持日志记录,而且大部分的艰苦工作已经由其开发者完成。Django自带Python的内置日志模块,可以利用系统日志。
Python的日志模块有四个主要部分:
每一个部分在Django官方文档中都有细致的解释。我不希望你被它的复杂性所淹没,所以我将简要地解释每一个部分。
1.记录器
记录器基本上是日志系统的入口。这就是你作为一个开发者要实际操作的东西。
当一个消息被记录器收到时,日志级别会与记录器的日志级别进行比较。如果相同或超过日志记录器的日志级别,**该消息将被发送到处理程序进行进一步处理。日志级别包括。
- DEBUG:低级别的系统信息
- INFO:一般的系统信息
- 警告:与小问题有关的信息
- ERROR:重大问题的相关信息
- 危急:严重问题的相关信息
2.处理程序
处理程序基本上决定了记录器中每条消息的处理情况。它的日志级别与Loggers相同。但是,我们基本上可以定义我们想用什么方式来处理每个日志级别。
例如。ERROR日志级别的消息可以实时发送给开发人员,而INFO日志级别的消息可以直接存储在系统文件中。
它本质上是告诉系统如何处理信息,比如把它写在屏幕上,写在文件上,或者写在网络套接字上。
3.过滤器
过滤器可以位于记录器和处理程序之间。它可以用来过滤日志记录。
例如:在CRITICAL 消息中,你可以设置一个过滤器,只允许处理一个特定的来源。
4.格式化器
顾名思义,格式器描述了将被呈现的文本格式。
现在我们已经涵盖了基础知识,让我们通过一个实际的例子来深入挖掘。点击这里获取源代码。
请注意,本教程假定你已经熟悉了Django的基础知识。
项目设置
首先,在你的项目文件夹,创建一个虚拟环境叫 venv在你的项目文件夹django-logging-tutorial ,并用下面的命令激活它:
mkdir django-logging-tutorial
virtualenv venv
source venv/bin/activate
创建一个新的Django项目,名为django_logging_tutorial 。请注意,项目文件夹名称是用破折号,而项目名称是用下划线(- vs _)。我们还将快速运行一系列的命令来设置我们的项目。
如何配置你的日志文件
让我们首先设置我们项目的settings.py 文件。注意--注意我在代码中的注释,这将有助于你更好地理解这个过程。
这段代码在官方文档的第三个例子中也提到了,在我们的大多数项目中,它都可以正常使用。我对它做了些许修改,以使其更加健壮:
LOGGING = {
'version': 1,
# The version number of our log
'disable_existing_loggers': False,
# django uses some of its own loggers for internal operations. In case you want to disable them just replace the False above with true.
# A handler for WARNING. It is basically writing the WARNING messages into a file called WARNING.log
'handlers': {
'file': {
'level': 'WARNING',
'class': 'logging.FileHandler',
'filename': BASE_DIR / 'warning.log',
},
},
# A logger for WARNING which has a handler called 'file'. A logger can have multiple handler
'loggers': {
# notice the blank '', Usually you would put built in loggers like django or root here based on your needs
'': {
'handlers': ['file'], #notice how file variable is called in handler which has been defined above
'level': 'WARNING',
'propagate': True,
},
},
}
如果你看了我上面的评论,你可能已经注意到,记录器部分只是空白。这实质上意味着任何记录器。
对这种方法要小心,因为我们的大部分工作都可以用Django内置的日志器来满足,比如django.request 或django.db.backends 。
另外,为了简单起见,我只用了一个文件来存储日志。根据你的使用情况,你也可以选择在遇到CRITICAL或ERROR信息时发送一封邮件。
要了解更多这方面的信息,我鼓励你阅读文档中的处理程序部分。开始时,这些文档可能会让你感到不知所措,但你越是习惯于阅读它们,你就越可能发现其他有趣或更好的方法。
如果这是你第一次使用文档,请不要担心。任何事情都有第一次。
我已经在评论中解释了大部分的代码,但我们仍然没有涉及到propagate 。它是什么?
当propagate 被设置为"True"时,一个子节点将把他们所有的日志调用传播到父节点。这意味着我们可以在日志树的根(父)定义一个处理程序,而子树(子)中的所有日志调用都会转到父树中定义的处理程序。
同样需要注意的是,层次结构在这里是很重要的。我们也可以在我们的项目中直接将其设置为True,因为在我们的案例中,由于没有子树,所以这并不重要。
如何在Python中触发日志
现在,我们需要创建一些日志信息,这样我们就可以尝试我们的配置在 settings.py.
让我们有一个默认的主页,只显示**'Hello FreeCodeCamp.org Reader :)',每次有人访问这个页面时,我们在我们的debug.log 文件中记下一个DEBUG** 信息,即'主页在2021-08-29 22:23:33.551543小时被访问!'
转到你的应用程序logging_example ,并在views.py 包括以下代码。确保你已经在INSTALLED_APPS 中加入了logging_example ,在setting.py:
from django.http import HttpResponse
import datetime
# import the logging library
import logging
# Get an instance of a logger
logger = logging.getLogger(__name__)
def hello_reader(request):
logger.warning('Homepage was accessed at '+str(datetime.datetime.now())+' hours!')
return HttpResponse("<h1>Hello FreeCodeCamp.org Reader :)</h1>")
在项目的urls.py ,添加以下代码,这样当我们访问主页时,就会调用正确的函数:
from django.contrib import admin
from django.urls import path
from logging_example import views
urlpatterns = [
path('admin/', admin.site.urls),
path('',views.hello_reader, name="hello_reader")
]
是时候进行一些测试了
最后,我们的简单设置已经完成。现在我们需要做的是启动我们的服务器并测试我们的日志。
用这个命令运行开发服务器:
python manage.py runserver
现在,去你的主页127.0.0.1:8000,在那里你会看到我们编好的信息。现在在创建的路径中检查你的warning.log 文件。下面是输出的样本:
Homepage was accessed at 2021-08-29 22:38:29.922510 hours!
Homepage was accessed at 2021-08-29 22:48:35.088296 hours!
这就是了!现在你知道如何在Django中进行日志记录了。如果你有任何问题,就给我留言。我保证会帮助你 :)
如果你觉得我的文章对你有帮助,并想阅读更多的内容,请到我的博客Techflow360.com查看一些Django教程。