django logging的StreamHandler的一个小用法

news2025/7/7 1:17:42

首先先了解下,logging的大致结构,它有一个内置处理器,还有一个django提供的内置记录器。基本上,日志模块就是由这俩组成的,他俩的关系,有点水渠理论的意思。就是说,处理器,和记录器,都是有level的,而他们俩的level,决定了一条日志信息,能否正常输出。比如:

 当处理器的level比记录器的level高的时候,日志就是可以正常输出的,反之,日志就会像水渠的水,记录器就会像拦住水渠的大坝,导致日志无法输出。ok,大致就是这个原理了。(纯属个人理解,如有错误,欢迎留言哈)

这是日志的level的级别。对应 1,2,3,4,5 级。5级级别最高。即CRITICAL级别最高。

 翻译一下:

  • DEBUG:程序调试bug时使用
  • INFO:程序正常运行时使用
  • ERROR:程序出错误时使用,如:IO操作失败
  • CRITICAL:特别严重的问题,导致程序不能再继续运行时使用,如:磁盘空间为空,一般很少使 用

 另外,默认情况的是WARNING等级,当在WARNING或WARNING之上等级的才记录日志信息。

正常来说,django的logging模块,一般都是这么用的:

import logging
import sys

# 先搞一个日志对象,这里是可以起名字的,logging.getLogger(),这里传的参数就是日志的名字,不给默认就是root。这就是记录器了。
mylogger = logging.getLogger("mylogger")

# 造一个handler,就是搞一个日志处理器。logging.StreamHandler()这里可以不传参数,不传默认就是sys.stderr。
handler = logging.StreamHandler(stream=sys.stdout)
# 做日志格式
formatter = logging.Formatter('[%(levelname)s] %(message)s')
handler.setFormatter(formatter)
# 设置日志处理器级别
handler.setLevel(logging.DEBUG)

# 将日志处理器和日志记录器组合起来
mylogger.addHandler(handler)
# 设置日志记录器的级别
mylogger.setLevel(logging.DEBUG)

# 然后,就可以打印日志了
mylogger.debug("This is a debug message.")
mylogger.info("Some info message.")
mylogger.warning("A warning.")

这就是一个最简单的日志对象的构造。

如果,想不打印某个级别的日志,可以直接给记录器添加disable参数:

logging.disable(logging.CRITICAL),这里一定注意给定的级别啊!!!这里是相当于不打印给定的日志级别的日志,和比给定日志级别低的日志也不打印了。就拿当下的例子来说,就是所有logging.CRITICAL级别的日志,和比logging.CRITICAL级别低的日志,都不打印了。由于logging.CRITICAL,已经是最高级别的日志了,所以换句话说,就是直接啥日志都不打印了。

所以啊,通常,别直接 import logging   然后 logging.disable(),这样搞事情,这等于是对所有日志对象都给搞事情了。除非你的本意就是去除所有日志的打印,那你可以这么干。但是,基本上如果只是去除某些日志的打印,那么最好,对具体的日志对象,做这样的操作就好了。比如:

mylogger = logging.getLogger("mylogger")

mylogger.disable(logging.DEBUG)   

更多关于日志的内容也可以看下这几篇文章:

Python中Logging 日志模块(最详细完整版) - 知乎

logging日志模块配置文件参数详解_myprogram513的博客-CSDN博客_logging.handlers.sysloghandler

【Python基础】Python模块之Logging(四)——常用handlers的使用_修炼_人生的博客-CSDN博客_logging streamhandler

ok,这次主要是对 logging.StreamHandler 这个参数有点新东西,记录一下。

正常来说,我们在使用  logging.StreamHandler() 这个对象的时候,一般是不传参数的,就算传,大多也就是将默认的sys.stderr,改为 sys.stdout。但是最近遇到了一种新传法。

class MyStream(object):

	def __init__(self, error_msg):
		self.error_msg = error_msg
		self.writes = 0

	def read(self, size=None):
		pass

	def write(self, s):
		self.writes += 1
		

error_msg = 'ERRORED %(error)s'
my_stream = MyStream(error_msg=error_msg)
root = logging.getLogger()
old_level = root.level
my_handler = logging.StreamHandler(my_stream)

root.setLevel(logging.INFO)
root.addHandler(my_handler)
root.info('11111111')
assertEqual(my_stream.writes, 1)

基本上对于 logging.StreamHandler() 对象,这里直接造了一个类,传给 logging.StreamHandler()对象了,从当下用例来看,就是用来统计日志调用次数的。貌似,没谁会关心这个......但是,这种用法,确实是很稀奇的,记录一下了。

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

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

相关文章

MCU-51:独立按键控制LED灯的动作

目录一、独立按键二、独立按键控制LED亮灭二、消除按键抖动2.1 按键的抖动2.2 控制LED灯状态-消除按键抖动三、独立按键控制LED显示二进制四、独立按键控制LED灯移位一、独立按键 轻触按键:相当于是一种电子开关,按下时开关接通,松开时开关断…

微服务技术--认识微服务

技术栈: 认识微服务 服务架构演变 单体架构 将业务的功能集中在一个项目中开发,打成一个包部署优点: 架构简单部署成本低 缺点: 耦合度高 分布式架构 根据业务功能对系统进行拆分,每个业务模块作为独立项目开发&…

黑盒测试用例设计 - 场景法

原理 现在的软件几乎都是用时间触发来控制流程的。测试时,可以以生动的描述出触发时的情景,有利于设计测试用例,同时使测试用例更容易理解和执行。基本流:软件功能按照正确的事件流实现的一条正确流程。通常一个业务仅存在一个基…

[洛谷]P2234 [HNOI2002]营业额统计

[洛谷]P2234 [HNOI2002]营业额统计一、问题描述题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示二、问题分析1、算法标签2、思路分析三、代码实现一、问题描述 [洛谷]P2234 [HNOI2002]营业额统计 题目描述 Tiger 最近被公司升任为营业部经理,他上任后…

微服务系列 - Zookeeper下篇:源码解析

前言 关于zookeeper的入门到精通请阅读:微服务系列 - Zookeeper上篇 注:本内容仅用于个人学习笔记,如有侵扰,联系删除 参考文档:https://blog.csdn.net/mjb740074431/article/details/120173792 一、算法基础 Zook…

@Configuration注解

1.作用 Configuration注解的作用:声明一个类为配置类,用于取代bean.xml配置文件注册bean对象。 2.基础运用 Configuration注解最常见的搭配使用有两个:Bean和Scope Bean:等价于Spring中的bean标签用于注册bean对象的&#xff…

SpringBoot 过滤器、拦截器、监听器对比及使用场景

一、关系图理解 二、区别 1.过滤器 过滤器是在web应用启动的时候初始化一次, 在web应用停止的时候销毁 可以对请求的URL进行过滤, 对敏感词过滤 挡在拦截器的外层 实现的是 javax.servlet.Filter 接口,是 Servlet 规范的一部分 在请求进入容器后,但…

Java 线程的六种状态及其简易转换

1.Java中线程的状态分为六种 NEW:初始状态,线程被创建,但是还没有调用start()方法。 RUNNABLE:运行状态,Java线程将操作系统中的就绪和运行两种状态笼统地称作“运行中”。 BLOCKED:阻塞状态,表示线程阻塞于…

IJCAI-2022 多级发射方法的脉冲神经网络

原文链接:CSDN-脉冲神经网络(SNN)论文阅读(四)-----IJCAI-2022 多级发射方法的脉冲神经网络 Multi-Level Firing with Spiking DS-ResNet: Enabling Better and Deeper Directly-Trained Spiking Neural Networks目录说…

SAP UI5 Smart Table 和 Smart Filter Bar 的联合使用方法介绍试读版

本教程第 147 个步骤,我们介绍了 SAP UI5 Smart Table 控件的用法: SAP UI5 应用开发教程之一百四十七 - SAP UI5 SmartTable 控件的使用介绍 如下图所示: 本步骤我们在 Smart Table 本身的基础上再进一步,学习如何将 Smart Tab…

占道摆摊经营监控报警系统 yolov5

占道摆摊经营监控报警系统通过Python基于yolov5深度学习网络模型,对城市道路区域实时检测,当yolov5模型检测到有流动摊点摆摊违规经营时,立即抓拍告警。Yolo模型采用预定义预测区域的方法来完成目标检测,具体而言是将原始图像划分…

[java]-JDBC

JDBC 是 Java 连接数据库的一种方式,它是一种 Java API,可以用于连接数据库,并且可以访问数据库中的数据。 JDBC 原理 JDBC 是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库!每…

USB TO SPI(上海同旺电子)调试器调试MCP4822

所需设备: 1、USB TO SPI(上海同旺电子); 2、MCP4822:双通道12 位电压输出DAC; 特性 • MCP4802:双通道8 位电压输出DAC • MCP4812:双通道10 位电压输出DAC • MCP4822:双通道12 位电压输出DAC • 轨对…

React18:创建React项目(自动)

文章目录使用步骤项目目录结构Node_modulesPublicSrcPackage.Json总结使用步骤 打开命令行进入到项目所在目录使用如下命令:npx create-react-app 项目名 注意:项目名不能带大写字符 项目目录结构 项目目录结构如下: react-app├─ no…

网络实验之RIPV2协议(二)

一、RIPV2协议和实验简介 RIP-2是一种无类别路由协议(Classless Routing Protocol),支持路由标记,在路由策略中可根据路由标记对路由进行灵活的控制。报文中携带掩码信息,支持路由聚合和CIDR(Classless Int…

MMIM(2021 EMNLP)分级互信息最大化

论文题目(Title):Improving Multimodal Fusion with Hierarchical Mutual Information Maximization for Multimodal Sentiment Analysis 研究问题(Question):提出了一个名为 (MMIM),它在层次上…

Centos7下安装Nginx及配置SSL

文章目录1.官网下载Nginx2.安装依赖包3.安装Nginx4.启动Nginx5.防火墙放开端口6.Nginx的SSL模块安装7.SSL证书准备8.Nginx配置SSL1.官网下载Nginx ​ 去官网下载需要的nginx压缩包,地址:http://nginx.org/en/download.html,此处下载最新稳定…

DFS——剪枝

文章目录概述优化搜索顺序排除等效冗余可行性剪枝最优性剪枝例题小猫爬山木棒总结概述 优化搜索顺序 不同的搜索顺序会产生不同的搜索树形态,与可行性剪枝结合,去除非法状态,按照一定顺序可使规模大幅度减小。 例: 给定一个无重复…

JavaSE第6篇:面向对象上

一、面向对象 1、面向对象:人关注对象、人关注具体事物信息 2、对象: 只要是客观存在的事物皆为对象 面向对象程序设计的重点是类的设计 设计类就是设计类的成员 思考:人把大象装进冰箱 ? 面向过程POP思想:强调的是过程(动…

Web前端开发入门学习分享

Web前端开发入门学习分享 1&#xff1a;如何开始学习Web前端 首先你需要学习html的各个标签&#xff0c;掌握其用法和规范&#xff0c;明白其作用。 开始学习css的使用&#xff0c;你先学习在html页面中为标签增加css样式&#xff0c;其次是将css写在网页的<head></…