Django日志

【图书介绍】《Django 5企业级Web应用开发实战(视频教学版)》_django 5企业级web应用开发实战(视频教学版)-CSDN博客

《Django 5企业级Web应用开发实战(视频教学版)》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com)

Django 5框架Web应用开发_夏天又到了的博客-CSDN博客

本节主要介绍关于Django框架日志方面的内容。Django使用Python的内置日志记录模块执行系统日志记录,主要包括了Logger、Handler、Filter和Formatter这4个模块。

11.2.1  Logger

Logger是进入日志系统的入口点,每个Logger都是一个命名的存储集合,可以将消息写入其中以进行处理。

Logger具有日志级别,日志级别描述了Logger将处理的消息的严重性。Python定义了以下日志级别:

  • DEBUG:用于调试目的的底层系统信息。
  • INFO:通用系统信息。
  • WARNING:描述已发生的警告问题的信息。
  • ERROR:描述已发生的主要问题的信息。
  • CRITICAL:描述已发生的严重问题的信息。

写入Logger的每条消息都是一个日志记录。每个日志记录还具有指示该特定消息的严重性的日志级别。日志记录还可以包含有用的元数据,该元数据描述了正在记录的事件,可以包括详细信息,例如堆栈跟踪或错误代码。

将消息提供给Logger时,会将消息的日志级别与Logger的日志级别进行比较。如果消息的日志级别达到或超过Logger本身的日志级别,则将对消息进行进一步处理;如果没有,该消息将被忽略。

当Logger确定需要处理消息后,就会将消息传递给相应处理程序(Handle)。

11.2.2  Handler

处理程序是确定Logger中每个消息发生什么情况的引擎,描述了特定的日志记录行为。例如,将消息写到屏幕、文件或网络套接字。

如同Logger一样,处理程序也具有日志级别。如果日志记录的日志级别不满足或超过处理程序的级别,则处理程序将忽略该消息。

一个Logger可以具有多个处理程序,并且每个处理程序可以具有不同的日志级别。这样,可以根据消息的重要性提供不同形式的通知。例如,可以安装一个处理程序,将ERROR和CRITICAL消息转发到分页服务,而另一个处理程序将所有消息(包括ERROR和CRITICAL消息)记录到文件中,以供以后分析。

11.2.3  Filter

Filter(过滤器)用于提供额外的控制,以控制哪些日志记录从logger传递到Handle。

默认情况下,将处理所有符合日志级别要求的日志消息。但是,通过安装过滤器可以在日志记录过程中放置其他条件。例如,可以安装一个过滤器,该过滤器仅允许发出来自特定来源的ERROR消息。

过滤器还可以用于在发出之前修改日志记录。例如,可以编写一个过滤器,如果满足一组特定的条件,则将ERROR日志记录降级为WARNING记录。

过滤器可以安装在Logger或Handle上,在一个链中可以使用多个过滤器来执行多个过滤操作。

11.2.4  Formatter

最终的日志记录需要呈现为文本,而格式器(Formatter)描述了该文本的确切格式。格式化程序通常由包含LogRecord属性的Python格式化字符串组成。不过,也可以编写自定义格式化程序,以实现特定的格式化行为。

11.2.5  使用日志记录

使用日志记录的方法很简单,在Django项目的配置文件setting.py中配置好Logger、Handle、Filter和Formatters后,就可以将需要的日志记录的调用放入代码中。下面是几个比较常用的代码实例。

第一个是一个相对简单的配置,用于将Django框架的Logger中的所有日志记录写入本地文件。

【代码11-7】

01  LOGGING = {
02      'version': 1,
03      'disable_existing_loggers': False,
04      'handlers': {
05          'file': {
06              'level': 'DEBUG',
07              'class': 'logging.FileHandler',
08              'filename': 'debug.log',
09          },
10      },
11      'loggers': {
12          'django': {
13              'handlers': ['file'],
14              'level': 'DEBUG',
15              'propagate': True,
16          },
17      },
18  }

第二个是一个相对完整的配置,包括Logger、Handle、Filter和Formatter的全部配置信息。

【代码11-8】

01  LOGGING = {
02      'version': 1,
03      'disable_existing_loggers': False,
04      'formatters': {
05          'verbose': {
06    'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d 
%(message)s'
07          },
08          'simple': {
09              'format': '%(levelname)s %(message)s'
10          },
11      },
12      'filters': {
13          'special': {
14              '()': 'project.logging.SpecialFilter',
15              'foo': 'bar',
16          },
17          'require_debug_true': {
18              '()': 'django.utils.log.RequireDebugTrue',
19          },
20      },
21      'handlers': {
22          'console': {
23              'level': 'INFO',
24              'filters': ['require_debug_true'],
25              'class': 'logging.StreamHandler',
26              'formatter': 'simple'
27          },
28          'mail_admins': {
29              'level': 'ERROR',
30              'class': 'django.utils.log.AdminEmailHandler',
31              'filters': ['special']
32          }
33      },
34      'loggers': {
35          'django': {
36              'handlers': ['console'],
37              'propagate': True,
38          },
39          'django.request': {
40              'handlers': ['mail_admins'],
41              'level': 'ERROR',
42              'propagate': False,
43          },
44          'myproject.custom': {
45              'handlers': ['console', 'mail_admins'],
46              'level': 'INFO',
47              'filters': ['special']
48          }
49      }
50  }

这个Logger配置完成了以下工作:

(1)将配置标识为dictConfig版本(version=1)。目前,这是唯一的dictConfig格式版本。

(2)定义了两个Formatter。

  • 简单信息:仅输出日志级别名称(例如DEBUG)和日志消息。格式字符串是普通的Python格式字符串,描述了将在每条记录行上输出的详细信息。可在Formatter对象中找到可以输出的详细信息的完整列表。
  • 详细信息:输出日志级别名称、日志消息、生成日志消息的时间、进程、线程和模块。

(3)定义了两个Filters。

  • project.logging.SpecialFilter:使用特殊别名。如果此过滤器需要其他参数,则可以在过滤器配置字典中将它们作为其他关键字提供。
  • django.utils.log.RequireDebugTrue:当DEBUG为True时,会传递记录。

(4)定义了两个Handler。

  • 控制台:一个StreamHandler,它将任何INFO(或更高版本)消息输出到sys.stderr。该处理程序使用简单的输出格式。
  • mail_admins:一个AdminEmailHandler,通过电子邮件将任何ERROR(或更高版本)消息发送到站点ADMINS。该处理程序使用特殊的过滤器。

(5)配置了3个Logger。

  • django:该Logger将所有消息传递到控制台处理程序。
  • django.request:该Logger将所有错误消息传递给mail_admins处理程序。另外,该记录器被标记为不传播消息,这意味着Logger将不会处理写入django.request的日志消息。
  • myproject.custom:该Logger将所有信息传递到INFO或更高级别,还将特殊过滤器传递给两个处理程序——控制台和mail_admins。这意味着所有INFO级别的消息(或更高级别)将被打印到控制台,错误和严重消息也将通过电子邮件输出。

下面通过一个代码实例演示一下Logger的用法。首先,新建一个简单Django项目MyLogSite,然后创建一个简单的视图,通过该视图输出日志信息。具体代码如下:

【代码11-9】(详见源代码MyLogSite项目中的MyLogSite/views.py文件)

01  from django.http import HttpResponse
02  
03  import logging
04  logger = logging.getLogger('django')
05  
06  def index(request):
07      logger.info('info')
08      logger.error('error')
09      logger.warn('warn')
10      logger.debug('debug')
11      return HttpResponse("This is homepage!")

【代码分析】

在第03行代码中,通过import关键字引入了logging对象。

在第04行代码中,通过logging对象调用getLogger('django')方法获取logger对象。

在第06~11行代码定义的视图函数中,通过logger对象分别调用info()方法、error()方法、warn()方法和debug()方法输出日志信息。

最后,在项目配置文件settings.py中配置logger信息,具体代码如下:

【代码11-10】(详见源代码MyLogSite项目中的MyLogSite/settings.py文件)

01  BASE_LOG_DIR = os.path.join(BASE_DIR, "logs")
02
03  LOGGING = {
04      'version': 1,
05      'disable_existing_loggers': False,
06      'handlers': {
07          'file': {
08              'level': 'DEBUG',
09              'class': 'logging.FileHandler',
10              'filename': os.path.join(BASE_LOG_DIR, 'opt.log'),
11          },
12      },
13      'loggers': {
14          'django': {
15              'handlers': ['file'],
16              'level': 'DEBUG',
17              'propagate': True,
18          },
19      },
20  }

【代码分析】

在第01行代码中,配置了日志文件的输出目录BASE_LOG_DIR。注意,日志输出目录(logs)一般配置在项目根目录下。

第03~20行代码定义了Logger配置信息,与【代码11-7】基本一致。需要注意第10行代码中,通过前面定义的BASE_LOG_DIR参数指定了具体的日志信息文件opt.log。

面,演示一下Django项目中Logger日志的使用效果。首先,查看一下项目根目录下的logs目录情况,如图11.1所示。

然后,通过Firefox浏览器打开MyLogSite项目运行一下,如图11.2所示。页面中出现了提示信息,表示项目运行成功。

再查看一下项目根目录下的logs目录情况,如图11.3所示。

如图11.2中的箭头和标识所示,Logger日志信息文件opt.log已经生成了。下面我们打开该日志文件查看一下,如图11.4中的箭头和标识所示,虽然Logger日志信息文件opt.log中输出了很多信息,但还是可以找到【代码11-9】中通过logger对象输出的调试信息。

图11.4  MyLogSite项目的日志信息(opt.log)文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/421108.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp 微信小程序自定义tabbar层级低于canvas解决方案

示例代码&#xff1a; <template><cover-view class"tab"><cover-view class"navView" tap"switc(/pages/index/index)"><cover-image :src"tabname index?/static/tabbar/overide-sel.png:/static/tabbar/overide…

Vscode python无法转到函数定义

今天上午换了电脑&#xff0c;使用Vscode发现找不到对应的函数定义了。 使用了网上的全部教程。一点用没有。重启电脑&#xff0c;重启Vscode也没有作用。最后通过重装vscode&#xff0c;解决问题。&#xff08;也不知道Vscode什么毛病&#xff09; 重点语句&#xff1a; 去官网…

大语言模型(LLM)与多模态大模型(MLLM)结合行人重识别(Reid)领域最新文献方法调研

Data Augmentation for Text-based Person Retrieval Using Large Language Models 这篇论文主要研究文本基础的人员检索&#xff08;Text-based Person Retrieval, TPR&#xff09;任务中的数据扩充问题&#xff0c;并提出了一种基于大语言模型&#xff08;Large Language Mo…

framebuffer帧缓存

1. framebuffer Framebuffer&#xff08;帧缓冲区&#xff09;是用于存储图像数据的一块内存区域。我们可以将我们想要显示的图像数据写到framebuffer中&#xff0c;驱动程序每隔一段时间会自动的去读取Framebuffer中的图像数据&#xff0c;并根据读取到的图像数据在屏幕上显示…

最全整理:R/Rstudio/R包的更新

R 是开源的数据分析和统计计算语言&#xff0c;功能强大且应用广泛&#xff0c;R 的版本更新频率较高。最近处理数据时突然有一个 R 包无法安装&#xff0c;细探究发现这个 R 包需要新版本 R 的才可以安装。本文主要分享&#xff1a;更新 R、更新 Rstudio 和一键升级 R 包。 更…

web项目如何部署到服务器上呢?——麻烦的方法

只需关注web项目如何部署到服务器上&#xff0c;因为服务器运行时就可以访问web项目了。 一、麻烦的方法 1、首先启动服务器 &#xff08;1&#xff09;找到bin文件夹 &#xff08;2&#xff09;双击运行startup.bat文件 &#xff08;3&#xff09;运行之后的界面如下&#…

上海亚商投顾:沪指探底回升 华为产业链午后爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日探底回升&#xff0c;深成指、创业板指盘中跌逾1%&#xff0c;午后集体拉升翻红。华为产业链午后走强…

Mysql系列-索引简介

索引是排好序的数据结构 1 索引数据结构 hash索引、二叉树、平衡二叉树、B-Tree、BTree 数据结构在线示例&#xff1a;点击跳转 2 索引类型 2.1 聚簇索引 又叫“聚集索引” &#xff0c;索引和数据存储在一起 2.2 非聚簇索引 又叫“非聚集索引” &#xff0c;索引和数据分开…

Linux系统玩ppsspp

安装ppsspp 在ppsspp的官网&#xff0c;有提供Linux版本的下载链接&#xff0c;仔细一看是flathub的链接&#xff0c;也就是说ppsspp官方推荐采用flatpak安装。 确实有一些发行版提供了自己的ppsspp包&#xff0c;比如说openSUSE和Fedora&#xff0c;不过我自己试用以后发现系…

我的创作纪念日——第0x100天

官方提示今天是开始创作的第256天&#xff0c;最初没反应过来第256天算是个什么纪念日&#xff0c;好像并没什么特殊的啊。仔细一想&#xff0c;难道是第0x100天的意思吗&#xff1f;哈哈&#xff0c;专属于程序猿的浪漫。 既然这样&#xff0c;还是写一篇文章&#xff0c;交个…

前端使用 Konva 实现可视化设计器(22)- 绘制图形(矩形、直线、折线)

本章分享一下如何使用 Konva 绘制基础图形&#xff1a;矩形、直线、折线&#xff0c;希望大家继续关注和支持哈&#xff01; 请大家动动小手&#xff0c;给我一个免费的 Star 吧~ 大家如果发现了 Bug&#xff0c;欢迎来提 Issue 哟~ github源码 gitee源码 示例地址 矩形 先上效…

实现C程序绑定TCP端口

实现C程序绑定TCP端口 步骤概述伪代码C代码实现解释在网络编程中,TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。绑定TCP端口是服务器端应用程序在网络通信中的一个关键步骤,它允许服务器监听来自客户端的连接请求。 本文将介绍如何使用C语言…

Caffenie配合Redis做两级缓存

一、什么是两级缓存 在项目中。一级缓存用Caffeine&#xff0c;二级缓存用Redis&#xff0c;查询数据时首先查本地的Caffeine缓存&#xff0c;没有命中再通过网络去访问Redis缓存&#xff0c;还是没有命中再查数据库。具体流程如下 二、简单的二级缓存实现-v1 目录结构 2…

基于SpringBoot+Vue+MySQL的房屋租赁管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往往是人们思想上不可跨域的鸿沟&#xff0c;信息的…

uniapp 携带网址跳转webview页面报错解决

然后红框中的代码正常执行的 解决方案&#xff1a; 向webview页面携带参数时做以下处理&#xff1a; 接参后做以下处理&#xff1a; 效果展示&#xff1a;

谷歌怎么导入egd书签

https://support.google.com/chrome/answer/96816?hlzh-Hans

0906作业+思维导图梳理

一、作业&#xff1a; 1、创捷一个类似于qq登录的界面 1&#xff09;源代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//QPushbutton:登录、退出this-…

代码随想录训练营 Day56打卡 图论part06 108. 冗余连接 109. 冗余连接II

代码随想录训练营 Day56打卡 图论part06 一、卡码108. 冗余连接 题目描述 有一个图&#xff0c;它是一棵树&#xff0c;他是拥有 n 个节点&#xff08;节点编号1到n&#xff09;和 n - 1 条边的连通无环无向图&#xff08;其实就是一个线形图&#xff09;&#xff0c;如图&…

二、Android Studio集成ffmpeg so

目录 1、前言 2、新建AS工程 2.1 选择Native C 2.2 按图编辑和编辑 2.3 选择C标准 2.4 最初工程目录展示 3、拷贝so库到AS 4、编辑CMakeLists.txt 5、修改build.gradle 6、编辑Native-lib.cpp 7、修改MainActivity.java 8、效果展示 1、前言 本文章之前也是参考了…

HTML5中IndexedDB前端本地数据库

一、indexedDB为何替代了Web SQL Database&#xff1f; 跟小朋友的教育从来没有什么“赢在起跑线”这种说法一样&#xff0c;在前端领域&#xff0c;也不是哪来先出来哪个就在日后引领风骚的。 HTML5 indexedDB和Web SQL Database都是本地数据库数据存储&#xff0c;Web SQL Da…