Python-Django系列—日志

Python 程序员通常会在其代码中使用 print() 作为一种快速和方便的调试工具。使用日志框架只比这多花一点点工夫,但更加优雅和灵活。除了用于调试之外,日志还可以为您提供有关应用程序状态和健康状况的更多信息,而且这些信息结构更清晰。

一、概况

Django 使用并扩展了 Python 内置的 logging 模块来执行系统日志记录。这个模块在 Python 自己的文档中有详细的讨论;这一部分提供了一个快速概览。

1、日志框架的组成元素

一份 Python logging 配置有下面四个部分组成:

  • Loggers
  • Handlers
  • 过滤器
  • Formatters

1.1 Loggers

logger 是日志系统的入口点。每个 logger 是一个命名的容器,可以将消息写入其中以进行处理。

logger 可以配置 日志级别。日志级别描述了由该 logger 处理的消息的严重性。Python 定义了下面几种日志级别:

  • DEBUG:排查故障时使用的低级别系统信息

  • INFO:一般的系统信息

  • WARNING:描述系统发生了一些小问题的信息

  • ERROR:描述系统发生了大问题的信息

  • CRITICAL:描述系统发生严重问题的信息

每一条写入 logger 的消息都是一条 日志记录。每一条日志记录也包含 日志级别,代表对应消息的严重程度。日志记录还包含有用的元数据,来描述被记录了日志的事件细节,例如堆栈跟踪或者错误码。

当 logger 处理一条消息时,会将自己的日志级别和这条消息的日志级别做对比。如果消息的日志级别匹配或者高于 logger 的日志级别,它就会被进一步处理。否则这条消息就会被忽略掉。

当 logger 确定了一条消息需要处理之后,会把它传给 Handler。

1.2 Handlers

handler 是确定 logger 中每个消息发生什么的引擎。它描述了特定的日志行为,例如将消息写入屏幕、写入文件或写入网络套接字。

和 logger 一样,handler 也有日志级别的概念。如果一条日志记录的级别不匹配或者低于 handler 的日志级别,对应的消息会被 handler 忽略。

一个 logger 可以有多个 handler,每一个 handler 可以有不同的日志级别。这样就可以根据消息的重要性不同,来提供不同格式的输出。例如,你可以添加一个 handler 把 ERROR 和 CRITICAL 消息发到寻呼机,再添加另一个 handler 把所有的消息(包括 ERROR 和 CRITICAL 消息)保存到文件里以便日后分析。

1.3 过滤器

filter 用于在从 logger 传递到 handler 的日志记录中提供额外的控制。

默认情况下,只要级别匹配,任何日志消息都会被处理。不过,也可以通过添加 filter 来给日志处理的过程增加额外条件。例如,可以添加一个 filter 只允许某个特定来源的 ERROR 消息输出。

Filter 还被用来在日志输出之前对日志记录做修改。例如,可以写一个 filter,当满足一定条件时,把日志记录从 ERROR 降到 WARNING 级别。

Filter 在 logger 和 handler 中都可以添加;多个 filter 可以链接起来使用,来做多重过滤操作。

1.4 Formatters

最终,日志记录需要呈现为文本。Formatter 描述了文本的精确格式。Formatter 通常由一个包含 LogRecord 属性 的 Python 格式化字符串组成;但是,您也可以编写自定义的 Formatter 来实现特定的格式化行为。

二、安全性考虑

日志记录系统处理可能包含敏感信息的数据。例如,日志记录可能包含有关 Web 请求或堆栈跟踪的信息,而您自己的日志记录中收集的一些数据也可能具有安全性影响。您需要确保自己明白以下事项:

  • 会收集什么信息

  • 日志记录将随后存储在何处。

  • 它将如何传输。

  • 谁可能访问它

为了帮助控制敏感信息的收集,您可以明确指定某些敏感信息在错误报告中被过滤掉,详细了解如何 过滤错误报告。

1、AdminEmailHandler

在安全性的背景下,应该提到内置的 AdminEmailHandler。如果启用了它的 include_html 选项,它发送的电子邮件消息将包含完整的回溯信息,以及堆栈的每个级别的本地变量的名称和值,以及您的 Django 设置的值(换句话说,与在 DEBUG 为 True 时在 Web 页面中显示的详细程度相同)。

通常不建议通过电子邮件发送此类可能包含敏感信息的信息。相反,考虑使用其中许多第三方服务之一,将详细日志发送到这些服务,以获得多个优势:完整回溯信息的丰富信息、清晰的通知和访问信息的管理等等。这样可以更好地处理敏感信息。

三、日志模块的配置

Python 的日志库提供了一些配置方法,可以使用编程接口或者配置文件。Django默认使用 dictConfig format。

要配置日志记录,您使用 LOGGING 来定义一个日志设置字典。这些设置描述了您希望在日志设置中使用的记录器、处理程序、过滤器和格式化程序,以及您希望这些组件具有的日志级别和其他属性。

默认情况下 LOGGING 配置和 Django 默认日志配置 按照下面的方式合并在一起:

如果 LOGGING dictConfig 中的 disable_existing_loggers 键被设置为 True (如果该键缺失,则为 dictConfig 默认值),则默认配置中的所有记录器都将被禁用。禁用的记录器与删除的记录器不同;记录器仍将存在,但会默默地丢弃任何记录到它的内容,甚至不会将条目传播到父记录仪。因此,你应该非常小心地使用 'disable_existing_loggers': True;这可能不是你想要的。相反,你可以将 disable_existing_loggers 设置为 False,然后重新定义一些或所有的默认日志记录器;或者你可以将 LOGGING_CONFIG 设置为 None,然后 自己处理日志配置。

logging 被配置成了 Django setup() 函数的一部分。因此,你可以确定的是,logger 一直都可以在项目代码里使用。

1、示例

 dictConfig format文档是获取日志配置细节的最好资料。不过,为了让你知道能做什么,下面有几个例子。

首先,这里有一个小配置,可以让你把所有的日志信息输出到控制台。

import logging
import mylib
logger = logging.getLogger(__name__)def main():logging.basicConfig(filename='myapp.log', level=logging.INFO)logger.info('Started')mylib.do_something()logger.info('Finished')if __name__ == '__main__':main()

​​​​​​​

​
settings.pyimport osLOGGING = {"version": 1,"disable_existing_loggers": False,"handlers": {"console": {"class": "logging.StreamHandler",},},"root": {"handlers": ["console"],"level": "WARNING",},
}
​

这将配置父 root 记录器,以向控制台处理程序发送 WARNING 级别及以上的消息。通过将级别调整为 INFO 或 DEBUG,可以显示更多的消息。这在开发过程中可能很有用。

接下来我们可以添加更多细粒度的日志记录。下面是一个例子,说明如何让日志系统只从名为 logger 的 django 中打印更多的消息。

​
settings.pyimport osLOGGING = {"version": 1,"disable_existing_loggers": False,"handlers": {"console": {"class": "logging.StreamHandler",},},"root": {"handlers": ["console"],"level": "WARNING",},"loggers": {"django": {"handlers": ["console"],"level": os.getenv("DJANGO_LOG_LEVEL", "INFO"),"propagate": False,},},
}
​

默认情况下,这个配置会从 django 的日志记录器中发送级别为 INFO 或更高的消息到控制台。这个级别和 Django 的默认日志配置是一样的,只是默认配置只在 DEBUG=True 时才显示日志记录。Django 不会记录很多这样的 INFO 级别的消息。不过,有了这个配置,你也可以设置环境变量 DJANGO_LOG_LEVEL=DEBUG 来查看 Django 所有的调试日志,因为它包括了所有的数据库查询,所以非常啰嗦。

你不需要把日志记录到控制台。下面是一个配置,它将所有来自 django 命名的记录器的日志记录写入本地文件。

settings.pyLOGGING = {"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 应用的用户可写的路径。

最后,这里是一个相当复杂的日志设置的例子。

settings.pyLOGGING = {"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,},"django.request": {"handlers": ["mail_admins"],"level": "ERROR","propagate": False,},"myproject.custom": {"handlers": ["console", "mail_admins"],"level": "INFO","filters": ["special"],},},
}

该日志配置做了以下事情:

  • 识别配置为 'dictConfig 版本 1' 格式。目前,这是唯一的 dictConfig 格式版本。

  • 定义两个格式化程序:

    • simple,输出日志级别名称(如 DEBUG)和日志信息。

      format 字符串是一个普通的 Python 格式化字符串,它描述了每个日志行要输出的细节。可以输出的完整细节列表可以在 Formatter Objects 中找到。

    • verbose,输出日志级别名称、日志信息,以及生成日志信息的时间、进程、线程和模块。

  • 定义两个过滤器:

    • project.logging.SpecialFilter,使用别名 special。如果这个过滤器需要额外的参数,它们可以作为过滤器配置字典中的附加键提供。在这种情况下,当实例化 SpecialFilter 时,参数 foo 将被赋予一个 bar 的值。

    • django.utils.log.RequireDebugTrue,当 DEBUG 为 True 时,传递记录。

  • 定义两个处理程序:

    • console,一个 StreamHandler,它将任何 INFO (或更高)消息打印到 sys.stderr。该处理程序使用 simple 输出格式。

    • mail_admins 是一个 AdminEmailHandler,它会将任何 ERROR (或更高级别)的消息通过电子邮件发送给站点的 ADMINS。
      这个处理程序使用了 special 过滤器。

  • 配置三个记录器。

    • django,将所有信息传递给 console 处理程序。

    • django.request,它将所有 ERROR 消息传递给 mail_admins 处理程序。此外,这个记录器被标记为  传播消息。这意味着写给 django.request 的日志信息不会被 django 日志处理程序处理。

    • myproject.custom,它将所有 INFO 或更高等级的消息传递给两个处理程序——console 和 mail_admins。这意味着所有 INFO 级别(或更高)的消息将被打印到控制台;ERROR 和 CRITICAL 消息也将通过电子邮件输出。

2、自定义日志记录配置

如果你不想使用 Python 的 dictConfig 格式来配置记录器,你可以指定自己的配置方案。

LOGGING_CONFIG 设置定义了用于配置 Django 日志记录器的可调用对象,默认情况下,它指向 Python 的 logging.config.dictConfig() 函数。然而,如果你想使用不同的配置过程,你可以使用其他任何一个接受单一参数的可调用。当配置日志时, LOGGING 的内容将作为该参数的值提供。
 

3、禁用日志记录配置

如果你根本不想配置日志记录(或者你想用自己的方法手动配置日志记录),你可以将 LOGGING_CONFIG 设置为 None。这将禁用 Django 的默认日志记录 的配置过程。

将 LOGGING_CONFIG 设置为 None 只是意味着自动配置过程被禁用,而不是日志本身。如果你禁用了配置过程,Django 仍然会进行日志调用,回到默认的日志行为。

下面是一个禁用 Django 的日志配置,然后手动配置日志的例子。

settings.pyLOGGING_CONFIG = Noneimport logging.configlogging.config.dictConfig(...)

请注意,默认的配置过程只有在设置完全加载后才会调用 LOGGING_CONFIG。相反,在设置文件中手动配置日志记录将立即加载你的日志记录配置。因此,你的日志配置必须出现在它所依赖的任何设置之后。

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

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

相关文章

ArcGIS Pro对图斑进行等比例、等面积、等宽度的分割

ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放_arcgis视频教程我要自学网-CSDN博客 4大遥感软件!遥感影像解译!ArcGISENVIErdaseCognition_遥感解译软件-CSDN博客 今天介绍一下ArcGIS Pro对图斑进行等比例、等面积、等宽度的分割&#xff0…

”故茗”茶文化网站

摘 要 计算机网络发展到现在已经好几十年了,在理论上面已经有了很丰富的基础,并且在现实生活中也到处都在使用,可以说,经过几十年的发展,互联网技术已经把地域信息的隔阂给消除了,让整个世界都可以即时通话…

【和春笋一起学C++】(十五)字符串作为函数参数

1. char指针作为函数参数 在C语言中,表示字符串的方式有3种: char数组用引号括起的字符串常量char指针 这3种形式都可以将其作为实参传递给函数中的参数(char*),因此函数的形参需要使用char*类型。将字符串作为参数…

VueRouter路由组件的用法介绍

1.1、<router-link>标签 <router-link>标签的作用是实现路由之间的跳转功能&#xff0c;默认情况下&#xff0c;<router-link>标签是采用超链接<a>标签显示的&#xff0c;通过to属性指定需要跳转的路由地址。当然&#xff0c;如果你不想使用默认的<…

【C/C++】胜者树与败者树:多路归并排序的利器

文章目录 胜者树与败者树&#xff1a;多路归并排序的利器1 胜者树简介1.1 定义1.2 胜者树结构与原理1.2.1 构造流程1.2.2 归并过程 2 败者树简介2.1 背景场景2.2 基本定义2.3 败者树结构和原理2.3.1 树的构造&#xff08;初始建树&#xff09;2.3.2 查询和更新 3 胜者树 vs 败者…

零基础设计模式——第二部分:创建型模式 - 原型模式

第二部分&#xff1a;创建型模式 - 5. 原型模式 (Prototype Pattern) 我们已经探讨了单例、工厂方法、抽象工厂和生成器模式。现在&#xff0c;我们来看创建型模式的最后一个主要成员——原型模式。这种模式关注的是通过复制现有对象来创建新对象&#xff0c;而不是通过传统的…

C++(初阶)(十九)——红黑树

红黑树 红黑树概念规则实现结点插入变色变色参考代码&#xff1a; 查找查找参考代码 遍历 红黑树检查完整代码 概念 红⿊树是⼀棵⼆叉搜索树。它的每个结点增加⼀个存储位来表示结点的颜⾊&#xff0c;可以是红色或者黑色&#xff08;并不会出现第三种颜色&#xff09;。 通过…

Mistral AI 开源最新 Small 模型——Devstral-Small-2505

Devstral 是一款专为软件工程任务设计的代理型大语言模型&#xff08;LLM&#xff09;&#xff0c;由 Mistral AI 和 All Hands AI 合作开发 &#x1f64c;。Devstral 擅长使用工具探索代码库、编辑多个文件以及驱动软件工程代理。该模型在 SWE-bench 上表现出色&#xff0c;使…

CDGA|一线二线企业数据治理项目目前发展状况

一线城市与二线城市企业在数据治理项目的发展状况上存在一定差异&#xff0c;主要体现在目标、资源投入、策略实施以及文化培育等方面。 一线城市企业数据治理项目发展状况 ‌数据治理目标全面系统‌&#xff1a; ‌数据质量与安全‌&#xff1a;一线城市的大型企业通常拥有海量…

Lyra学习笔记1地图角色加载流程

目录 1 地图加载流程1.1 默认Experience的加载1.2 加载角色1.3 加载场景中的几个传送点 2 几个内建类的笔记2.1 UDataAsset2.2 UAssetManager 纯个人笔记&#xff0c;有错误欢迎指正&#xff0c;学习阶段基本看到不会的就写一写&#xff0c;最后有时间会梳理整体结构 先看完了官…

SurfaceFlinger及Android应用RenderThread角度观察Jank丢帧卡顿

SurfaceFlinger及Android应用RenderThread角度观察Jank丢帧卡顿 CPU、GPU、Display 三个部分&#xff1a;CPU 负责计算帧数据&#xff0c;把计算好的数据交给 GPU&#xff0c;GPU 会对图形数据进行渲染&#xff0c;渲染好后放到 buffer &#xff08;图像缓冲区&#xff09;存起…

《牛客》数组中出现次数超过一半的数字

牛客的刷题之路不停歇 ⌓‿⌓ 不积跬步无以至千里&#xff0c;不积小流无以成江海 The harder you work,the luckier you will be 题目及示例 题目链接 描述 给一个长度为 n 的数组&#xff0c;数组中有一个数字出现的次数超过数组长度的一半&#xff0c;请找出这个数字。 例…

七彩喜康养护理——科技赋能下的全周期健康守护

在当今社会&#xff0c;随着人们健康意识的不断提高&#xff0c;护理行业逐渐走向专业化、精细化&#xff0c;而七彩喜智养护理作为一种新兴的护理方式&#xff0c;逐渐受到了广泛的关注和应用。 它不仅仅是针对单一病症的治疗护理&#xff0c;而是一种全面的、全方位的健康管…

【爬虫】12306自动化购票

上文&#xff1a; 【爬虫】12306查票-CSDN博客 下面是简单的自动化进行抢票&#xff0c;只写到预定票&#xff0c;没有写完登陆&#xff0c; 跳出登陆后与上述代码同理修改即可。 感觉xpath最简单&#xff0c;复制粘贴&#xff1a; 还有很多写法&#xff1a; 官网地址&#…

Java设计模式之组合模式:从入门到精通(保姆级教程)

文章目录 1. 组合模式概述1.1 专业定义1.2 通俗解释1.3 模式结构2. 组合模式详细解析2.1 模式优缺点2.2 适用场景3. 组合模式实现详解3.1 基础实现3.2 代码解析4. 组合模式进阶应用4.1 透明式 vs 安全式组合模式4.2 组合模式与递归4.3 组合模式与迭代器5. 组合模式在实际开发中…

游戏如何应对反编译工具dnspy

Unity Mono 是 Unity 引擎默认的脚本运行时环境&#xff0c;由跨平台的开源 .NET 框架实现&#xff0c;它允许开发者使用 C# 等编程语言编写游戏逻辑&#xff0c;凭借简单易用的开发环境和高效的脚本编译速度&#xff0c;得到了众多游戏的青睐。 在 Mono 模式下&#xff0c;游…

腾讯云证书过期提醒的应对措施,Caddy 自动管理的 Let‘s Encrypt 证书.

用腾讯的免费证书&#xff0c;90天需要换一次。 Caddy 自动管理的 Lets Encrypt 证书. 在网站上按F12然后找到security选项&#xff0c;然后选择View certifcate 就可以看到证书的有效期。 完全无需操作 你的网站实际使用的是 Caddy 自动管理的 Lets Encrypt 证书&#xff0c;…

[Java实战]Spring Boot整合Elasticsearch(二十六)

[Java实战]Spring Boot整合Elasticsearch&#xff08;二十六&#xff09; 摘要&#xff1a;本文通过完整的实战演示&#xff0c;详细讲解如何在Spring Boot项目中整合Elasticsearch&#xff0c;实现数据的存储、检索和复杂查询功能。包含版本适配方案、Spring Data Elasticsea…

【关联git本地仓库,上传项目到github】

目录 1.下载git2.绑定用户3.git本地与远程仓库交互4.github项目创建5.上传本地项目到github6.完结撒花❀❀❀&#xff01;&#xff01;&#xff01; 1.下载git git下载地址&#xff1a;https://git-scm.com/downloads 下载安装后创建快捷地址&#xff1a;&#xff08;此处比较…

[Vue]路由基础使用和路径传参

实际项目中不可能就一个页面&#xff0c;会有很多个页面。在Vue里面&#xff0c;页面与页面之间的跳转和传参会使用我们的路由: vue-router 基础使用 要使用我们需要先给我们的项目添加依赖:vue-router。使用命令下载: npm install vue-router 使用路由会涉及到下面几个对象:…