WEB_py_logging日志库

目录

一、日志级别

二、基本编程方式

日志输出配置以及参数

三、logging的模块

四、logger记录器与处理器

logger记录器使用函数

logger处理器使用函数

示例:一个记录器分别向不同的处理器输出

五、过滤器

自定义过滤器(过滤关键字)

六、配置文件设置日志模式

七、实际应用(异常捕获输出日志)


一、日志级别

级别编号解释
NOTSET0使用自定义名称获取记录器时,未初始化日志级别,则默认为 NOTSET
DEBUG10详细信息,常用于调试
INFO20程序正常运行过程中产生的一些信息
WARNING30警告用户,虽然程序还在正常工作但有可能发生错误
ERROR40由于更严重的问题,程序已经不能执行一些功能了
CRITICAL50严重错误,程序不能正常运行

二、基本编程方式

logging标准库不是同步输出的日志,为了控制大量的并发日志输出,采用多线程机制进行输出日志。

  • 基本输出函数

    对应着各种级别的日志输出

    logging.debug("debug") logging.info("info") logging.warning("warning") logging.error("error") logging.critical("critical")

  • 基本输出代码

    #-*- coding: utf-8 -*-
    import logging
    # 设置日志输出级别
    logging.basicConfig(level=logging.DEBUG)logging.debug("debug")
    logging.info("info")
    logging.warning("warning")
    logging.error("error")
    logging.critical("critical")

需要注意的是:编译器默认输出的级别为warning级别,如果没有人为的改变日志输出级别就会屏蔽级别比设置的低的日志。

如图所示,默认设置的级别为warning。

这里解释一下上面用到的日志默认输出的格式

  1. WARNING:日志级别

  2. root:Logger:实例名称

  3. warning:日志的消息内容

日志输出配置以及参数

使用logging.basicConfig()函数可以设置日志的输出格式

如下是各个常用的参数以及使用说明

参数名称参数描述
filename日志输出到文件的文件名
filemode文件模式,[+]、w[+]、a[+]
format日志输出的格式
datefat日志附带日期时间的格式
style格式占位符,默认为“%”和“
level设置日志输出级别
stream定义输出流,用来初始化 StreamHandler 对象,不能filename 参数一起使用,否则会ValueError 异常
handles定义处理器,用来创建 Handler 对象,不能和 fileame、stream 参数一起使用,否则也会抛出 ValueError异常

举个简单的使用例子,将日志按照指定的格式输出到文件当中。

#-*- coding: utf-8 -*-
import logging
# 设置basicConfig必须在执行语句的上面,否则不会按照所指示的格式输出
logging.basicConfig(filename="demo.log",filemode='w',
format='%(asctime)s|%(levelname)s|%(filename)s:%(lineno)s|%(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
level=logging.DEBUG)
logging.debug("debug")
logging.info("info")
logging.warning("warning")
logging.error("error")
logging.critical("critical")

其中,format是设置的输出的参数也就是显示在文件当中的格式,每个参数名称都有独特的格式。

下面就是文件当中输出的格式了

三、logging的模块

Logger日志,暴露函数给应用程序,基于日志记录器和过滤器级别决定哪些日志有效
LogRecord日志记录器,将日志传到相应的处理器处理。
Handler处理器, 将(日志记录器产生的)日志记录发送至合适的目的地。
Filter过滤器, 提供了更好的粒度控制,它可以决定输出哪些日志记录。
Formatter格式化器, 指明了最终输出中日志记录的布局。

四、logger记录器与处理器

日志记录器(Logger)和处理器(Handler)之间的关系可以简单描述为:日志记录器负责生成日志消息,而处理器负责接收和处理这些消息。

具体来说:

  1. 日志记录器是生成日志消息的组件。它负责接收应用程序中的日志记录请求,并根据消息的严重程度(如调试、信息、警告、错误)将其分发到相应的处理器。

  2. 日志处理器是负责处理日志消息的组件。它接收来自日志记录器的日志消息,并根据预定义的规则将这些消息写入到特定的目的地,如控制台、文件、数据库等。处理器可能会对消息进行格式化、过滤或其他处理,然后将其输出到相应的目的地。

在典型的日志系统中,一个日志记录器通常会配置多个处理器,以便将日志消息发送到不同的目的地或按照不同的方式处理。例如,可以将调试级别的消息输出到控制台,将错误级别的消息写入到文件,同时将所有消息发送到远程日志服务器以进行集中管理和分析。

总的来说日志记录器和处理器之间的关系类似是一种生产者-消费者关系:日志记录器产生日志消息,而处理器消费这些消息并将其输出到相应的目的地。

logger记录器使用函数

# 获取一个记录器,‘applog’是传入的参数,就是记录器的名称 
# 返回值是一个记录器对象
logging.getLogger('applog')#设置记录器的全局日志级别
logger.setLevel(logging.DEBUG)# 移除处理器
logger.removeHandler(handler)

logger处理器使用函数

# 创建一个输出到控制台的处理器
logging.StreamHandler()# 创建一个输出到文件的处理器, 并且设置文件名称
logging.FileHandler('my_app.log')
# ·······这两个是经常使用的处理器#处理器设置其日志级别
setLevel(logging.DEBUG)# 将记录器添加到处理器当中(传入记录器)
logger.addHandler()

示例:一个记录器分别向不同的处理器输出

import logging# 创建一个日志记录器
logger = logging.getLogger('my_app')
logger.setLevel(logging.DEBUG)  # 设置日志记录器的全局日志级别为DEBUG# 创建一个控制台处理器,并设置其日志级别为INFO
console_handler = logging.StreamHandler()  # 创建一个输出到控制台的处理器
console_handler.setLevel(logging.INFO)  # 设置处理器的日志级别为INFO# 创建一个文件处理器,并设置其日志级别为DEBUG
file_handler = logging.FileHandler('my_app.log')  # 创建一个输出到文件的处理器
file_handler.setLevel(logging.DEBUG)  # 设置处理器的日志级别为DEBUG# 创建一个格式化器,用于定义日志消息的格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)  # 将格式化器绑定到控制台处理器
file_handler.setFormatter(formatter)     # 将格式化器绑定到文件处理器# 将处理器添加到日志记录器中
logger.addHandler(console_handler)  # 将控制台处理器添加到日志记录器
logger.addHandler(file_handler)     # 将文件处理器添加到日志记录器# 模拟应用程序的运行,记录不同级别的日志消息
logger.debug('This is a debug message')    # 调试级别的消息,将不会被控制台处理器输出
logger.info('This is an info message')      # 信息级别的消息,将被控制台处理器输出
logger.warning('This is a warning message') # 警告级别的消息,将被控制台处理器和文件处理器输出
logger.error('This is an error message')    # 错误级别的消息,将被控制台处理器和文件处理器输出

在这个例子中:

  • 首先创建了一个名为 my_app 的日志记录器,并设置其全局日志级别为 DEBUG
  • 然后,我们创建了一个输出到控制台的处理器和一个输出到文件的处理器,并分别设置它们的日志级别为 INFODEBUG
  • 还创建了一个格式化器,用于定义日志消息的格式,并将其绑定到两个处理器上。
  • 最后,将这两个处理器添加到日志记录器中,并模拟了应用程序的运行过程,生成了不同级别的日志消息。

在运行这段代码后,会在控制台上看到信息级别及以上的日志消息,而在当前目录下会生成一个名为 my_app.log 的日志文件,其中包含了所有级别的日志消息。

还可以用不同的记录器分别处理不同的事件,这里就不进行实现了

五、过滤器

过滤器(Filters)用于控制哪些日志记录会被输出到日志目标(如文件、控制台等)。通过使用过滤器,你可以基于日志记录的级别、内容或者其他条件来选择性地过滤日志消息。

过滤器可以作为 Logger、Handler 或者 Formatter 的一部分,它们通过 Filter 类来现。你可以创建自定义的过滤器类来满足特定的过滤需求,也可以使用内置的过滤器类来快速现常见的过滤逻辑。

最常见的就是以过滤器的名字进行过滤记录器和处理器。

基础使用的函数(过滤记录器名称)

#-*- coding: utf-8 -*-
import logging
logger = logging.getLogger("one.applog")
# 定义一个过滤器,参数为命名空间,就是一个字符串“.”为层级关系
flt = logging.Filter("one")
# 关联过滤器到记录器上
logger.addFilter(flt)

自定义过滤器(过滤关键字)

#-*- coding: utf-8 -*-
import logging
class KeywordFilter(logging.Filter):def __init__(self, keyword):self.keyword = keyworddef filter(self, record):# 如果日志消息中包含指定的关键字,则过滤该日志消息if self.keyword in record.getMessage():return Falsereturn True# 创建一个 Logger 对象
logger = logging.getLogger('example')
logger.setLevel(logging.DEBUG)# 创建一个输出到控制台的 Handler
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)# 创建一个自定义过滤器,过滤包含 "error" 关键字的日志消息
keyword_filter = KeywordFilter("error")# 将过滤器添加到 Handler 中
console_handler.addFilter(keyword_filter)# 将 Handler 添加到 Logger 中
logger.addHandler(console_handler)# 输出日志消息
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')

六、配置文件设置日志模式

[loggers]
keys=root,applog[handlers]
keys=fileHandler,consoleHandler[formatters]
keys=simpleFormatter[logger_root]
level=DEBUG
handlers=consoleHandler[logger_applog]
level=DEBUG
handlers=fileHandler,consoleHandler
qualname=applog
propagate=0[handler_consoleHandler]
class=StreamHandler
args=(sys.stdout,)
level=DEBUG
formatter=simpleFormatter[handler_fileHandler]
class=handlers.TimedRotatingFileHandler
args=('applog.log', 'midnight', 0, 7)
level=DEBUG
formatter=simpleFormatter[formatter_simpleFormatter]
format=%(asctime)s|%(levelname)s|%(filename)s:%(lineno)s|%(message)s
datefmt=%Y-%m-%d %H:%M:%S
logger.critical("critical")

logger.conf 文件

  • [loggers]: 定义了日志记录器的名称,其中root是根日志记录器,applog是一个自定义的日志记录器。
  • [handlers]: 定义了处理器的名称,这里有两个处理器,分别是fileHandlerconsoleHandler
  • [formatters]: 定义了格式化器的名称,这里只有一个简单的格式化器simpleFormatter
  • [logger_root]: 根日志记录器的配置,设置了日志级别为DEBUG,并且使用了consoleHandler处理器。
  • [logger_applog]: 自定义日志记录器的配置,设置了日志级别为DEBUG,并且使用了fileHandlerconsoleHandler处理器。qualname参数指定了日志记录器的名称,propagate参数设置为0表示不传播日志消息到父记录器。
  • [handler_consoleHandler]: 控制台处理器的配置,使用了StreamHandler类来将日志消息输出到控制台,设置了日志级别为DEBUG,并且使用了simpleFormatter格式化器。
  • [handler_fileHandler]: 文件处理器的配置,使用了TimedRotatingFileHandler类来将日志消息写入到文件中,设置了日志级别为DEBUG,并且使用了simpleFormatter格式化器。args参数指定了日志文件的名称、备份日志文件的时间间隔和保留备份日志文件的数量。
  • [formatter_simpleFormatter]: 简单格式化器的配置,指定了日志消息的格式和日期时间格式。

python调用文件

#-*- coding: utf-8 -*-
import logging
import logging.configlogging.config.fileConfig('logging.conf')rootLogger = logging.getLogger()
rootLogger.debug("rootLogger.debug")logger = logging.getLogger('applog')
logger.debug("logger.debug")

输出:

conf文件当中设置的是默认记录器只输出到控制台处理器上

自定义名称记录器输出到文件和控制台处理器上

七、实际应用(异常捕获输出日志)

#-*- coding: utf-8 -*-
import logging
import logging.config
# 仍然使用上述的配置
logging.config.fileConfig('logging.conf')rootLogger = logging.getLogger()
rootLogger.debug("rootLogger.debug")logger = logging.getLogger('applog')
logger.debug("logger.debug")a = "abc"
try:
# 类型转换异常int(a)
except Exception as e:logger.exception(e)

 

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

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

相关文章

5大自动化测试的Python框架,快来学习!

自从2018年被评选为编程语言以来,Python在各大排行榜上一直都是名列前茅。 目前,它在Tiobe指数中排名第三个,仅次于Java和C。随着该编程语言的广泛使用,基于Python的自动化测试框架也应运而生,且不断发展与丰富。 因…

完全小白如何用Windows电脑运行人生中的第一个Bert文本分类代码(更简单版)

诸神缄默不语-个人CSDN博文目录 我准备过几天录一个讲解视频。先等一下,现在只有图文版。 本文代码最早写于2024年3月27日,不保证未来以下代码及操作过程仍然可以使用。 本文主要关注中文仇恨检测短文本分类,数据集来源于datasets官网&…

绿联搭建rustdesk服务器

绿联搭建rustdesk服务器,不再使用向日葵 注意:本服务器需要有动态公网IP以及自己的域名,ipv6未测试。 1. 拉取镜像 rustdesk/rustdesk-server-s6:latest 注意是这个-s6的镜像。 2. 部署镜像 2.1 内存配置 本服务器比较省内存&#xff0…

关于agi中的Function Calling深入解析

接口(Interface) 两种常见接口: 1、人机交互接口,User Interface,简称UI 2、应用程序编程接口,Application Programming Interface,简称API 接口能【通】的关键,是两边都要遵守约定。 人要按照UI的设计来操作。UI的设计要符合…

Android Studio实现内容丰富的安卓养老平台

获取源码请点击文章末尾QQ名片联系,源码不免费,尊重创作,尊重劳动 158安卓养老 1.开发环境 后端用springboot框架,安卓的用android studio开发android stuido3.6 jak1.8 idea mysql tomcat 2.功能介绍 安卓端: 1.注册登…

【数据结构(八)上】二叉树经典习题

❣博主主页: 33的博客❣ ▶文章专栏分类: Java从入门到精通◀ 🚚我的代码仓库: 33的代码仓库🚚 🫵🫵🫵关注我带你学更多数据结构的知识 目录 1.前言2.经典习题2.1相同的树2.2另一棵子树2.3翻转二叉树2.4平衡二叉树2.5对…

直播美颜工具与视频美颜SDK:技术深入探索

直播美颜工具和视频美颜SDK的出现,为直播平台和应用开发者提供了丰富的选择。本文将深入探讨这些技术的原理、应用和发展趋势。 一、美颜算法 直播美颜工具的核心在于其先进的美颜算法。这些算法通过对图像进行分析和处理,实时地修饰主播的面部特征&am…

vsstudio 如何远程调试

你可能需要调试一个在本地生成的 Windows 桌面项目,然后在远程计算机上运行可执行文件。本主题阐释如何更改本地项目设置以在远程计算机上运行应用程序。C++ 项目会自动部署到远程计算机。您将需要手动部署 .NET Framework 可执行文件。 设置 Visual C++ 项目 此处显示的过程…

项目开发流程

项目开发流程 👩‍🦳项目立项 估计项目的花费,确定大致的所需开发人员数,确定项目是否可行; 👩‍🦰需求分析 整体过程: 项目背景和目标,即项目的目的是什么 用户需求&…

SQLAIchemy 异步DBManager封装-01入门理解

前言 SQLAlchemy 是一个强大的 Python SQL 工具包和对象关系映射(ORM)系统,是业内比较流行的ORM,设计非常优雅。随着其2.0版本的发布,SQLAlchemy 引入了原生的异步支持,这极大地增强了其在处理高并发和异步…

Windows 的常用命令(不分大小写)

Net user (查看当前系统所有的账户) net user yourname password /add 添加新用户 net localgroup administrators yourname /add 添加管理员权限 net user yourname /delete 删除用户 net user 命令 [colorred]说明:以下命令仅限持管理员…

opencv人脸打马赛克

import cv2def FaceFind(imgPath: str) -> list:image cv2.imread(imgPath)gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)face_cascade cv2.CascadeClassifier(haarcascade_frontalface_default.xml)# 返回人脸坐标列表faces face_cascade.detectMultiScale(gray, scal…

数据结构11:二叉树的链式结构

文章目录 快速创建链式二叉树二叉树的遍历前序、中序、后序层序 二叉树的基本操作二叉树的节点个数二叉树叶节点的个数二叉树第k层结点个数二叉树查找值为x的结点 二叉树基础oj练习单值二叉树检查两颗树是否相同对称二叉树二叉树的前序遍历另一颗树的子树 二叉树的创建和销毁二…

谷雨时节,雨水渐多湿气旺盛,吃什么养生?听听张婉如医生怎么说

谷雨春光晓,山川黛色青。 叶间鸣戴胜,泽水长浮萍。 4月19日21时59分迎来谷雨,雨生百谷,这是谷雨节气的意思,它是春季的最后一个节气,这个时节早晚温差大,空气湿气重,如何养生呢&am…

java在线问卷调查系统的设计与实现(springboot+mysql源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的在线问卷调查系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 基于java的在线问卷调查…

电脑便签怎么固定位置 能固定在桌面的电脑便签

在繁忙的工作中,电脑便签是我离不开的小助手。每当灵感闪现,或是需要记录待办事项时,我总会打开便签,快速地记录下来。它就像我电脑屏幕上的一块“记事板”,随时提醒我未完成的工作和即将到来的任务。 但有一段时间&a…

i管家空间不足提醒怎么关闭

i管家的空间不足提醒是为了提醒用户手机存储空间不足,可能会影响手机的正常运行。目前,这个提醒功能是无法直接关闭的。如果您希望减少这类提醒的出现,可以尝试以下几种方法: 清理手机存储:检查手机中是否有不需要的文…

restful请求风格的增删改查-----查询and添加

一、restful风格的介绍 restful也称之为REST ( Representational State Transfer ),可以将它理解为一种软件架构风格或设计风格,而不是一个标准。简单来说,restful风格就是把请求参数变成请求路径的一种风格。例如,传统的URL请求…

Darknet,看过很多篇,这个最清晰了

Darknet深度学习框架:YOLO背后的强大支持 Darknet,一个由Joseph Redmon开发的轻量级神经网络框架,以其在计算机视觉任务,特别是目标检测中的卓越表现而闻名。本文将详细介绍Darknet的基本概念、结构以及它在深度学习领域的应用。…

UE4_动画基础_根运动Root Motion

学习笔记,仅供参考! 在游戏动画中,角色的碰撞胶囊体(或其他形状)通常由控制器驱动通过场景。然后来自该胶囊体的数据用于驱动动画。例如,如果胶囊体在向前移动,系统就会知道在角色上播放一个跑步…