Python 日志打印

2023-05-16

核心概念

Python标准库自带日志模块logging,logging中涉及到4个核心组件,这些组件构建了logging体系。

  • Logger: 应用程序直接使用的接口对象,通过logger操作完成表达日志输出要求.
  • Handler: 交付由Logger创建的日志记录(logRecord)到其对应的目的地,比如控制台,文件,网络。
  • Filter:对日志记录(logRecord)进行更细粒度过滤,控制是否应该输出对应的日志记录
  • Formatter: 控制日志输出的格式

日志有重要性区分,对应不同的应用场景,logging模块中默认定义了5种重要性并且可扩展。

DEBUG < INFO < WARNING  < ERROR < CRITICAL

默认的5种重要性和其它语言里的情况差不多,从左到右重要性依次升高。

每个Logger对象都由一个名字,惯例是每个模块都声明一个logger

logger = logging.getLogger(__name__)

Logger间通过名字构成层级关系,"x"名字的logger是"x.y"名字logger的父级logger,在层级的最顶层是一个叫做“root”的logger。对应五种默认的重要性,Logger有对应的方法,如:debug()info()

Logger与Handler都可以设置日志重要性级别,低于这个级别的日志记录将不会被输出。如果一个Logger没有重要性设置,则会以父级别Logger的重要性判断一个日志是否有效,如果父Logger也未设置,则会向爷爷辈找,直到“root”,默认重要级别为“WARNING”。

logger.setLevel(logging.DEBUG)
handler.setLevel(logging.DEBUG)

一个Logger可以指定多个Handler,和多个Filter,一个Handler也可以指定多个Filter,一个日志记录只用符合Logger本身的重要性级别和Filter要求,并且也符合Handler的重要性级别设定和其绑定的Filter要求,才会最终通过Handler绑定的Formatter格式化后被输出。
Logger在默认传播配置下会把自己的日志记录传播到父级别Logger处理,该行为可以配置关闭。
官方文档上有一张图,很好的说明了一个日志被输出的过程。
在这里插入图片描述

配置

logging模块早期有两种配置方式:

  • 基于python代码的配置,直接调用addHandler(), setLevel()等方法直接配置需要的log行为
  • 基于文本配置文件,fileConfig()函数用户读取配置文件,在文本配置文件中定义及组合Logger, Handler等组件

后期加入了

  • 基于字典配置
    从而可以有更多灵活的方式保存配置信息,比如JSON,YAML等,在这些格式数据中定义及组合Logger, Handler等组件,只要最后能生成字典即可,dictConfig()函数用户读取字典配置信息

性能调优

logging模块会在格式字符串必须计算的时候才会计算最终的日志消息,但是有时候消息参数本身的计算代价是高昂的,如果消息本身由于不符合日志重要性的设置不会被记录,那么将会导致无效的计算。
通过isEnabledFor()方法可以避免消息参数无比要的计算

if logger.isEnabledFor(logging.DEBUG):
    logger.debug('Message with %s, %s', expensive_func1(),
                                        expensive_func2())

如果logger的层级较深,日志重要性且只在高层次的logger中被设置,isEnabledFor()本身可能也存在性能问题,此时可以缓存方法的结果使用。

日志框架本身的异常

日志框架本身涉及为尽可能屏蔽自身发生的异常,避免导致应用不必要的停止。

除了SystemExitKeyboardInterupt外, handleError()方法将会传入handler的emit()方法处理日志消息记录时产生的异常被调用,默认的实现是检查logging.raiseExceptions,如果为True,调用栈会被输出到sys.stderr

模块级方法

logging模块级别直接提供了对应5种重要性的的同名函数,这些函数最后会被代理到“root”logger的同名方法上,简单的日志输出需求下使用这些方法会很方便,默认设置的logger重要性为“WARNING”, 输出位置为“sys.stderr”。

import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything

basicConfig()函数在任何日志打印函数调用前使用,可以快捷的对logging模块的行为,包括输出目标,输出的日志重要性等进行配置。

logging.basicConfig(filename='example.log', 
    encoding='utf-8', 
    format='%(asctime)s:%(levelname)s:%(message)s'
    level=logging.DEBUG)

日志消息可以是格式字符串,也就是带有变量占位符的形式,在日志事件消息参数后传入对应变量即可,格式字符串的格式支持配置,默认为%-style风格的格式字符串。

logging.warning('%s before you %s', 'Look', 'leap!')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 日志打印 的相关文章

  • 如何计算 pandas datetime 对象的均值和方差?

    如何计算 YYYY MM DD 形式的 python 日期时间对象的汇总统计数据 均值和标准差 我想对具有不同 ID 的不同日期时间对象组执行此操作 数据如下 import datetime as dt df pd DataFrame Da
  • Python - 比较同一字典中的值

    我有一本字典 d Trump MAGA FollowTheMoney Clinton dems Clinton Stein FollowTheMoney Atlanta 我想删除字符串列表中的重复字符串 该字符串是键的值 对于这个例子 期望
  • 计算另一个字符串中多个字符串的出现次数

    在 Python 2 7 中 给定以下字符串 Spot是一只棕色的狗 斑点有棕色的头发 斑点的头发是棕色的 查找字符串中 Spot brown 和 hair 总数的最佳方法是什么 在示例中 它将返回 8 我正在寻找类似的东西string c
  • matplotlib 图中点的标签

    所以这是一个关于已发布的解决方案的问题 我试图在我拥有的 matplotlib 散点图中的点上放置一些数据标签 我试图在这里模仿解决方案 是否有与 MATLAB 的 datacursormode 等效的 matplotlib https s
  • VSCode Settings.json 丢失

    我正在遵循教程 并尝试将 vscode 指向我为 Scrapy 设置的虚拟工作区 但是当我在 VSCode 中打开设置时 工作区设置 选项卡不在 用户设置 选项卡旁边 我还尝试通过以下方式手动转到文件 APPDATA Code User s
  • 在 Django Admin 中调整字段大小

    在管理上添加或编辑条目时 Django 倾向于填充水平空间 但在某些情况下 当编辑 8 个字符宽的日期字段或 6 或 8 个字符的 CharField 时 这确实是一种空间浪费 字符宽 然后编辑框最多可容纳 15 或 20 个字符 我如何告
  • PyQt 使用 ctrl+Enter 触发按钮

    我正在尝试在我的应用程序中触发 确定 按钮 我当前尝试的代码是这样的 self okPushButton setShortcut ctrl Enter 然而 它不起作用 这是有道理的 我尝试查找一些按键序列here http ftp ics
  • Pycharm 在 os.path 连接上出现“未解析的引用”

    将pycharm升级到2018 1 并将python升级到3 6 5后 pycharm报告 未解析的引用 join 最新版本的 pycharm 不会显示以下行的任何警告 from os path import join expanduser
  • 如何将特定范围内的标量添加到 numpy 数组?

    有没有一种更简单 更节省内存的方法可以单独在 numpy 中执行以下操作 import numpy as np ar np array a l r ar c a a 0 l ar tolist a r 它可能看起来很原始 但它涉及获取给定数
  • 为什么一旦我离开内置的运行服务器,Django 就无法找到我的管理媒体文件?

    当我使用内置的简单服务器时 一切正常 管理界面很漂亮 python manage py runserver 但是 当我尝试使用 wsgi 服务器为我的应用程序提供服务时django core handlers wsgi WSGIHandle
  • 无法导入 langchain.agents.load_tools

    我正在尝试使用 LangChain Agents 但无法导入 load tools 版本 langchain 0 0 27 我尝试过这些 from langchain agents import initialize agent from
  • pandas - 包含时间序列数据的堆积条形图

    我正在尝试使用时间序列数据在 pandas 中创建堆积条形图 DATE TYPE VOL 0 2010 01 01 Heavy 932 612903 1 2010 01 01 Light 370 612903 2 2010 01 01 Me
  • 将 Matlab 的 datenum 格式转换为 Python

    我刚刚开始从 Matlab 迁移到 Python 2 7 在读取 mat 文件时遇到一些问题 时间信息以 Matlab 的日期数字格式存储 对于那些不熟悉它的人 日期序列号将日历日期表示为自固定基准日期以来已经过去的天数 在 MATLAB
  • Protobuf 如何编码 oneof 消息结构

    对于这个 python 程序 在编码时运行 protobuf 编码会给出以下输出 0a 10 08 7f8a 0104 08 02 10 0392 0104 08 02 10 03 18 01 我不明白的是为什么8a后面有一个01 为什么9
  • 如何使用 AWS Lambda Python 读取 AWS S3 存储的 Word 文档(.doc 和 .docx)文件内容?

    我的场景是 我尝试使用 python 实现从 Aws Lambda 读取 AWS 存储的 S3 word 文档 doc 和 docx 文件内容 下面的代码是我使用的 我的问题是我可以获取文件名 但无法读取内容 def lambda hand
  • python 中的“槽包装器”是什么?

    object dict 和其他地方的隐藏方法设置为这样的
  • 重新分配唯一值 - pandas DataFrame

    我在尝试着assign unique值在pandas df给特定的个人 For the df below Area and Place 会一起弥补unique不同的价值观jobs 这些值将分配给个人 总体目标是使用尽可能少的个人 诀窍在于这
  • 制作一份 Python 文档的 PDF 文件

    Python 官方网站提供 PDF 文档下载 但它们是按章节分隔的 我下载了源代码并构建了 PDF 文档 这些文档也是单独的 PDF 我怎么能够从源代码中的 Makefile 构建一个 PDF 文件 我认为这样阅读起来会更方便 如果连接单独
  • 如何将 Django 中的权限添加到模型并使用 shell 进行测试

    我在模型中添加了 Meta 类并同步了数据库 然后在 shell 中创建了一个对象 它返回 false 所以我真的无法理解错误在哪里或者缺少什么是否在其他文件中可能存在某种配置 class Employer User Employer in
  • python 对浮点数进行不正确的舍入

    gt gt gt a 0 3135 gt gt gt print 3f a 0 314 gt gt gt a 0 3125 gt gt gt print 3f a 0 312 gt gt gt 我期待 0 313 而不是 0 312 有没有

随机推荐

  • 迪普防火墙FW1000普通双击热备配置

    一 组网图 二 端口聚合配置 三 配置三层接口地址 四 配置普通双机热备 五 配置安全域 六 配置地址对象 七 配置服务对象 八 配置静态路由 九 配置VRRP 十 配置NAT地址池 十一 配置源NAT 十二 配置目的NAT 十三 配置包过
  • 迪普防火墙F1000静默双击热备配置

    一 组网图 二 创建端口聚合 三 配置心跳接口IP地址 四 配置静默双击热备 五 配置三层接口IP地址 六 配置安全域 七 配置地址对象 八 配置服务对象 九 配置静态路由 十 配置NAT地址池 十一 配置源NAT 十二 配置目的NAT 十
  • Zabbix用户及用户组权限概述

    本文简单介绍用户及用户组权限 xff0c 参考官方文档 xff1a https www zabbix com documentation 5 2 manual config users and usergroups 一 概述 Zabbix
  • 使用nginx反向代理MRCP SERVER

    MRCP V2 的消息组成 MRCP xff08 V2 xff09 的交互过程可以分为三部分 1 SIP交互 xff1a Session Initiation Protocol xff0c 缩写SIP 正如协议的名称所言 xff0c 用于初
  • 一文搞懂如何使用STM32驱动直流电机(普通PWM输出和L298N、高级定时器输出带死区双通道互补PWM和IR2110S及自举电路、H桥电路和电机正反转)

    本文将用最通俗易懂的语言讲解怎么使用STM32驱动直流电机 xff0c 以及在使用过程中容易遇到的问题和解决办法 本文将介绍两种驱动方式 xff1a 普通PWM驱动L298N驱动直流电机 xff1b 互补PWM驱动IR2110S驱动直流电机
  • Linux —— 线程池

    目录 一 什么是线程池 二 线程池的优点 三 线程池的应用 四 实现一个简单的线程池 五 单例模式 1 饿汉实现方式 2 懒汉实现方式 3 单例模式实现线程池 xff08 懒汉方式 xff09 六 其他常见的各种锁 一 什么是线程池 线程池
  • 跟我一起写Shell脚本之二十二--常用命令(xargs)

    1 介绍 xargs 是一个强有力的命令 xff0c 它能够捕获一个命令的输出 xff0c 然后传递给另外一个命令 命令格式 xff1a xargs options command 选项 xff1a a file 从文件中读入作为 stdi
  • 解决Win10笔记本电脑Wifi频繁断线的问题

    Win10无线总是掉线怎么回事 经常有网友抱怨 xff0c 电脑升级Win10之后 xff0c 无线网络经常容易掉线或者不稳定的情况 有时候即便是勾选了自动连接Wifi xff0c 断线后也不会自动连接 Win10笔记本Wifi总是断线解决
  • 国内各个界面库比较,告诉你怎么选择界面库?

    目前网络上的界面库多彩多样 这里以个人的观点 xff0c 来评价一下界面库 如果有不当的地方望批评指出 1 Skin 43 43 www uipower com 该界面库是基于WIN32的界面库 xff0c 以上海勇进公司的形式来运作 xf
  • Docker端口映射

    为什么要端口映射 xff1f 在启动容器时 xff0c 如果不配置宿主机器与虚拟机的端口映射 xff0c 外部程序是无法访问虚拟机的 xff0c 因为没有端口 端口映射的指令是什么 xff1f docker指令 xff1a docker r
  • pyqt QStatusBar显示提示信息

    span class token keyword from span PyQt5 span class token keyword import span QtCore span class token keyword from span
  • 打jar包出现错误: The packaging for this project did not assign a file to the build artifact

    转载 xff1a 打jar包出现错误 xff1a The packaging for this project did not assign a file to the build artifact 曼彻斯特的天空是红色的的博客 CSDN博
  • 常见错误——使用CP命令复制目录出现 omitting directory 错误

    错误名称 omitting directory 使用命令 cp 描述 在Linux下使用cp命令拷贝对象时 xff0c 若出现了 omitting directory 错误 xff0c 确认CP命令复制的对象是否为非空目 录 在复制非空目录
  • 个人简历

    大家好 xff1a 本人系重庆大学2003级硕士研究生 xff0c 将于2006年7月毕业 相关技能 xff1a 1 计算机 xff1a 熟悉计算机软 硬件体系结构 xff0c 了解计算机接口技术 xff1b 熟悉C 43 43 汇编等语言
  • Adversarial Robustness - Theory and Practice

    文章目录 第一章 Introduction to adversarial robustness第二章 linear models第三章 Adversarial examples solving the inner maximization1
  • 筋斗云移动应用框架

    筋斗云框架是用于移动产品开发的一揽子解决方案 筋斗云的设计思想是做优雅的全平台应用 xff0c 可以制作各类移动端 xff08 如安卓 苹果平台 xff09 或桌面端 xff08 如Windows等桌面系统 xff09 的Web应用和原生应
  • 筋斗云接口编程 / 虚拟表和视图

    虚拟表和视图 表ApiLog中有一个字段叫app xff0c 表示前端应用名 xff1a 64 ApiLog id tm addr app userId userId 如果app 61 user xff0c 则关联到User表 xff1b
  • 用zt-zip Java库进行zip文件处理

    Java 标准库本身自带java util zip包 xff0c 利用该包可以解决zip文件的处理问题 但是该包提供的功能相对底层 xff0c 想要实现zip文件的处理 xff0c 需要写一 些代码 xff0c 该包并没有封装API到调用一
  • Linux临时目录/tmp与/var/tmp

    Linux有两个公知的临时目录 xff1a tmp与 var tmp xff0c 这两个目录被用户用于存储临时性的文件 xff0c 亦经常被程读写用户存储临时性数据 两个目录没有本质上的区别 xff0c 最根本的区别仅仅是系统对其中文件清理
  • Python 日志打印

    核心概念 Python标准库自带日志模块logging xff0c logging中涉及到4个核心组件 xff0c 这些组件构建了logging体系 Logger xff1a 应用程序直接使用的接口对象 xff0c 通过logger操作完成