Python logging使用

news2025/1/16 20:50:42

目录

logging模块

logging核心组件

logger

handler

                StreamHandler:把日志内容在控制台中输出

                FileHandler:把日志内容写入到文件中

filter

formatter

注意日志级别的继承问题

logger.exception

上述样例的整体代码  

 日志的配置文件及其模板


logging模块

        logging是Python的内置日志模块,用于生成程序日志。l

        logging有五个日志级别,从低到高进行排序:DEBUG、INFO、WARMING、ERROR、CRITICAL。日志内容的记录只会记录当前设定等级及其以上的等级,例如级别为WARMING,日志的内容就只会记录WARMING、ERROR、CRITICAL,这三个级别的内容

        logger默认的级别是warming

logging核心组件

        logger(记录器):可以实例化多个记录器用于记录不同的日志要求

        handler(处理器):可以定义多个处理器处理不同的日志保存或发送要求

        filter(过滤器):可以对记录器的选择进行筛选

        formatter(格式器):可以对日志的内容进行格式化要求

logger

        logging.getLogger()

                定义多个logger,通过不同的名字的来创建不同的looger

        loggin.setLevel()

                定义记录器的日志级别

first_logger = logging.getLogger(name='FirstLogger')
second_logger = logging.getLogger(name='SecondLogger')
second_logger.setLevel(logging.DEBUG)
print(f'first_logger:{first_logger}')
print(f'second_logger:{second_logger}')

handler

        两个经常使用的handler

                StreamHandler:把日志内容在控制台中输出

                参数为None,也可选:

                sys.stderr、 sys.stdout

                stdout,stderr的中文名字分别是标准输入,标准输出和标准错误

stream_handler = logging.StreamHandler(stream=None)


formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
first_logger.addHandler(stream_handler)
stream_handler.setFormatter(formatter)
first_logger.warning('warning text',)

                FileHandler:把日志内容写入到文件中

                3个主要参数,filename、mode、encoding、分别是文件名、写入模式、编码格式,大致跟一般的写入文件一致

file_handler = logging.FileHandler(filename='file_log',mode='a',encoding='utf-8')

formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
first_logger.addHandler(file_handler)
file_handler.setFormatter(formatter)
first_logger.warning('warning text',)

filter

        logging.Filter()

        可以过滤使用不同的记录器,可以设置记录器的名字是否与过滤条件一致

        例如

        second_logger记录器的名字为【SecondLogger】, third_logger记录器的名字为【aabb.ccthird_logger】,而过滤器的格式为【aabb.cc'】        

        两个过滤器都是使用StreamHandler但是最终只有third_logger的日志内容被打印,因为只有third_logger的名字满足过滤器的条件

third_logger = logging.getLogger('aabb.ccthird_logger')
third_logger.warning('123')

flt = logging.Filter('aabb.cc')
third_logger.addFilter(flt)
second_logger.addHandler(stream_handler)
second_logger.addFilter(flt)
second_logger.error('error text')

formatter

        logging.Formatter()

        可以设置不同日志内容格式,根据自身所需进行格式的规定

        主要参数介绍

        %(asctime)s:打印日志的时间

        %(levelname)s:打印日志级别的名称

        %(message)s:打印日志信息

        %(filename)s:打印当前执行程序名

        %(processName)s:打印线程名称

        datefmt:指定时间的输出格式

formatter = logging.Formatter('======%(asctime)s - %(levelname)s - %(filename)s - %(message)s======',datefmt='%Y-%m-%d %H:%M')

注意日志级别的继承问题

没有指定日志级别,默认是WARMING

logger和handler都可以指定日志级别,最终已handler的为主,但是这里有一个点需要特别注意,

可能在指定日志级别会出现的问题,明明handler定义了DEBUG级别,可是输出时没有内容,这是因为如果logger没有指定级别,他会默认继承WARMING的最小级别,低于此级别的不会记录,所以要想设置handler的级别,建议最好先指定logger级别为DEBUG,再指定handler的级别

first_logger = logging.getLogger(name='FirstLogger')
# 没有设置logger的日志级别
# stream_handler.setLevel(logging.INFO)

stream_handler = logging.StreamHandler(stream=sys.stdout)
stream_handler.setLevel(logging.DEBUG)
first_logger.debug('debug output')

# 结果没有任何输出


         设置完logger的日志级别后,才能输出对应的信息

 

logger.exception

        如果只是使用logger.info等方式,不会记录过多的异常信息,但是使用logger.exception能够将详细的异常信息写入日志中去,其能将错误的类型,出错的位置进行记录,有助于项目调试

try:
    a = 3 / 0
except Exception as e:
    first_logger.exception(e)

 

上述样例的整体代码  

import logging
import sys

first_logger = logging.getLogger(name='FirstLogger')
second_logger = logging.getLogger(name='SecondLogger')
second_logger.setLevel(logging.DEBUG)
# print(f'first_logger:{first_logger}')
# print(f'second_logger:{second_logger}')

stream_handler = logging.StreamHandler(stream=sys.stdout)
file_handler = logging.FileHandler(filename='file_log',mode='a',encoding='utf-8')

formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
first_logger.addHandler(stream_handler)
stream_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
first_logger.warning('warning text',)

third_logger = logging.getLogger('aabb.ccthird_logger')
third_logger.warning('123')

flt = logging.Filter('aabb.cc')
third_logger.addFilter(flt)
second_logger.addHandler(stream_handler)
second_logger.addFilter(flt)
second_logger.error('error text')

try:
    a = 3 / 0
except Exception as e:
    first_logger.exception(e)

 日志的配置文件及其模板

        可以参考我另外一篇博客,那里有详细介绍

        Python logging 日志配置文件模板_gongzairen的博客-CSDN博客

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

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

相关文章

用Python爬取了三大相亲软件评论区,结果…

小三:怎么了小二?一副愁眉苦脸的样子。 小二:唉!这不是快过年了吗,家里又催相亲了 ... 小三:现在不是流行网恋吗,你可以试试相亲软件呀。 小二:这玩意靠谱吗? 小三&#…

使用Gradle7.6.1 + SpringBoot3.0.2 + java17创建微服务项目(学习)

这是一个大胆的决定 这里是导航 技术栈开发工具一、创建gradle父子项目(deity)1.0 简单流程示意1.1、IDEA中主要图示1.1.1 项目结构图1.1.2 IDEA中 Gradle配置 1.2、deity父项目build.gradle文件1.3、deity父项目settings.gradle文件1.4、子项目build.g…

计算机底层知识

汇编语言(机器语言)的执行过程 汇编语言的本质:机器语言的助记符 其实他就是机器语言 计算机通电->CPU读取内存中程序(电信号输入) ->时钟发生器不断震荡通电 ->推动CPU内部一步一步执行(执行多…

elementUI,自定义表头,多层级表头,表头合并,行内容一致的合并行

先上效果: 1.自定义表头: 通过设置 slot"header" 来自定义表头。 slot-scope"scope" 这一行千万不要因为没有再template中使用到scope,vscode报红而删除,这会导致input框不能输入任何内容! &l…

软考网工计算题总结(一):总共27类题型,进来复习啦!

题型一: 1.地址编号从80000H到BFFFFH且按字节编址的内存容量为(5)KB,若用16KX4bit的存储芯片够成该内存,共需(6)片。 (5)A.128 B.256 C.512 D.1024 (6)A.8 B.16 C.32 D.64 【答案】B C 【解析】本题…

写一个自己的MyGPT app

chatGPT大火之后,国内外一众玩家撸起袖子热火朝天干了起来。 借助开源的GPT可以轻松的拥有自己的专属GPT,装装逼还是很好用的,也算赶一下chatGPT的风口。 这里使用ANYGPT,打造自已的GPT,AnyGPT API 开发者文档 语雀…

【STM32】基础知识 第十六课 窗口看门狗 WWDG 深入浅出

【STM32】基础知识 第十六课 窗口看门狗 WWDG 深入浅出 概述窗口看门狗 (WWDG)WWDG_SR 状态寄存器WWDG 配置与使用使用 WWDG 进行故障检测案例 概述 在嵌入式开发中, 可靠性和稳定性是至关重要的. 这就是为什么许多单片机, 比如 STM32, 提供了窗口看门狗 (Window Watchdog, WW…

redis 源码记录

正好最近时间富裕,看一看redis源码,简单的记录一下。也有可能说的是不全面的,自行斟酌,只能通过debug来简单的梳理本次测试流程,而不是全量的覆盖的所有测试用例,时不时更新,争取一天学一点点。…

基于Web的水果蔬菜销售系统的设计与实现(论文+源码)_kaic

摘 要 随着互联网经济与技术进程的不断推进,网上购物方式受到公众的普遍关注和欢迎。传统的樱桃线下销售模式缺陷不断暴露,难以满足公众不断加快的生活节奏和生活方式的需求。本文根据目前大众的实际需要,根据网上商城的特点、现状以及主要功…

Java 与排序算法(3):插入排序

一、插入排序 插入排序(Insertion Sort)是一种简单直观的排序算法,它的基本思想是将待排序序列分为已排序区间和未排序区间,然后每次从未排序区间取出一个元素,将其插入到已排序区间的合适位置中,使得插入…

【SpringBoot】八:Web服务---WebMvcConfigurer

文章目录 1.WebMvcConfigurer简介2. 页面跳转控制器3. 数据格式化4. 拦截器4.1 一个拦截器4.2 多个拦截器 1.WebMvcConfigurer简介 WebMvcConfigurer是SpringMVC xml配置文件的JavaConfig实现方式。 2. 页面跳转控制器 创建 SpringMVC 配置类: 3. 数据格式化 Formatter&…

计算机组成原理-存储系统-主存储器(芯片)和CPU连接

目录 一、SRAM和DRAM芯片 DRAM:栅极电容存储信息 SRAM:双稳态触发器存储信息 区别​编辑 二、ROM芯片 三、主存于CPU的连接 位扩展法 字扩展法 字位同时扩展法 译码器 四、双端口RAM和多模块存储器 4.1双端口RAM 4.2多模块存储器 4.2.1单体多字…

pthread多线程: 创建最简单的线程

文章目录 1. 目的1.1 不使用 Pthread 的情况1.2 使用 Pthread 的情况1.3 使用 Pthread 的好处 2. Pthread 创建线程的 API2.1 环境2.2 pthread_create()2.3pthread_join() 3. 创建最简单的线程3.1 要点3.2 代码 4. 创建多个子线程4.1 要点4.2 代码 5. 总结 1. 目的 Pthread 提…

计算机组成原理-存储系统-基本概论及组成

目录 一、存储器的层次化结构 二、存储器分类 存储介质 存取方式 信息可改性 三、性能指标 四、主存储器基本组成 基本的的半导体元件及原理 存储芯片的基本原理 一、存储器的层次化结构 二、存储器分类 存储介质 半导体存储器(主存,cache)、磁表面存储器(…

基于SpringBoot的SSMP的整合案例

基于SpringBoot的SSMP的整合案例 简单介绍模块创建创建实体类导入Mybatis-plus和druid的配置文件使用junit测试查询方法MP分页查询按照条件进行查询业务层Service开发业务层Service快速开发表现层开发表现层 实现分页查询表现层消息一致性的处理查询所有书本信息添加书本删除操…

TensorFlow巨浪中的巨人:大数据领域的引领者 TensorFlow实战【上进小菜猪大数据系列】

上进小菜猪,沈工大软件工程专业,爱好敲代码,持续输出干货。欢迎订阅本专栏! 大数据时代的到来带来了海量数据的处理和分析需求。在这个背景下,TensorFlow作为一种强大的深度学习框架,展现了其在大数据领域…

fastreport使用教程(fastreport报表编辑器)

除了库本身,FastReport.Net还包括单独的程序 – Designer和Viewer。 如您所知,第一个用于创建和编辑报表模板。它具有报表预览模式,您可以从中查看报表,将其导出为所需的数据格式并将其发送到打印。 Viewer用于以fpx预览格式查看报…

清华p-tuning | GPT也能做NLU?清华推出p-tuning方法解决GPT系列模型fine-tuning效果比BERT差问题

一、概述 title:GPT Understands, Too 论文地址:https://arxiv.org/abs/2103.10385 代码:https://github.com/THUDM/P-tuning 1.1 Motivation GPTs模型利用传统的fine-tuning技术在NLU任务上效果比较差,比同等量级的BERT效果…

2023/5/22总结

继承 继承是面向对象三大特征之一。可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法。 如图: 在上面的图片中,dog和cat都继承了Animal类,所以dog和cat都可以称为Animal的子类或者派生类&…

chatgpt赋能Python-python_dng

Python DNG:开启更高效的数据处理之路 什么是Python DNG? Python DNG(Data NumPy Generator)是一种基于Python的高效数据生成器,可以加速数据处理和分析的过程。它基于Numpy数组操作和并行计算思想,可以快…