【Python】如何使用Logging模块第3期

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 【Python】如何使用Logging模块第3期

Logging HOWTO

本期将会介绍logging模块的进阶内容,也是将logging模块应用于实际生产环境的成熟用法。

Advanced Logging

  • logging库采用模块化的方法,并提供了不同类型的组件:loggers,handlers,filters,and formatters.
  • logger为我们提供了程序可以直接调用的接口
  • handler将日志记录发送到合适的目的地
  • filters提供更为细致的粒度的日志输出
  • formatters顾名思义指定了我们想要的日志输出格式

Logger

Logger对象肩负三重任务,首先,logger暴露出很多方法供应用的代码在运行时调用。其次,logger对象会根据日志等级确定哪些日志消息需要进行处理。第三logger对象可以将日志消息发送给handler去做进一步处理。

logger对象最广泛的两种使用场景就是,配置和分发

以下是最常见的几种方法

  • Logger.setLevel()指定了logger需要处理的最低日志等级的消息,其中DEBUG是最低的内置日志等级,CRITICAL是最高级别。举个例子,如果将日志等级设置为INFO,logger将只会处理INFO,WARNING,ERROR,CRITICAL,DEBUG将会被忽略。

  • Logger.addHandler()和Logger.removeHandler()从logger对象上添加和移除handler,handler将会在下文详细介绍

  • Logger.addFilter()和Logger.removeFilter() 从logger对象上添加和移除filter对象,filter也会再下文详细介绍

在logger对象配置完成后,使用以下方法创建日志消息

Logger.debug(),Logger.info(),Logger.warning(),Logger.error(),Logger.critical()他们都用于创建日志记录,并且使用和自身一样的名字日志级别,消息实际上是一个字符串,可以包含标准的字符串替换语法%s,%d,%f等。对于**kwargs,日志记录方法只关注exc_info关键字,并且使用它来决定是否记录异常信息

Logger.exception()会创建一个类似与Logger.error()的日志消息,不同之处在于Logger.exception同时转存了一个堆栈跟踪,只能通过exception handler调用此方法

Logger.log()将日志等级作为显示的参数,对于记录消息来说,这比上述使用Logger.debug()的办法更加详细一些,但这是在自定义日志等级上记录日志的方法。

getLogger()如果提供了指定的名称,则会返回对logger实例的引用,如果没有提供,则返回root。

Logger有一个有效级别的概念,如果在logger上没有显示的设置级别,则会使用其父级别作为有效级别,如果还没有,则追溯到查到日志级别为止,logger的有效级别需要用于确定是否将时间传递给logger的handler

子logger将消息发送到与父辈logger想关联的handler中,因此没有必要为所有的logger去定义和配置handler,为顶级的logger创建子logger这就足够了。但是可以通过更改propagate属性来关闭传播

Handler

handler对象的责任是,将适当的消息(根据消息的日志等级)发送到handler指定的地点去,logger对象可以通过addHandler()方法添加零个或多个hander对象给他们自己。举一个简单的应用场景,我们的应用程序可能想将所有的log消息发送到log文件当中,将error以上等级的发送到标准输出去,如果出现了大的问题需要立刻将critical等级的log通过邮件发送到程序员手里,其中每一个handler需要将特定日志等级的log发送到指定的位置。

标准库中提供了许多有趣的handler,教程中只使用了StreamHandler和FileHandler。

对于开发人员来说,需要关注的handler方法不多,对于使用内置handler的开发者(即不是用自定义),只需要关注下面的几个方法

  • setLevel()方法,与logger对象中的方法一样,那为什么会有两个相同名称的方法呢,logger设置的日志等级决定了发送给哪一个handler,handler中的日志等级决定了handler要发送哪些消息。
  • setFormatter()顾名思义为其设置Foramtter对象
  • addFilter()和removeFilter()添加和移除Filter对象

应用程序的代码不应该直接使用handler来实例化,他只是作为不同功能handler的一个基类,他定义了所有handler应该具有的接口,或者子类可以重写某些功能。

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
10月前
|
开发者 Python
如何在Python中管理模块和包的依赖关系?
在实际开发中,通常会结合多种方法来管理模块和包的依赖关系,以确保项目的顺利进行和可维护性。同时,要及时更新和解决依赖冲突等问题,以保证代码的稳定性和可靠性
307 62
|
5月前
|
Python
Python教程:os 与 sys 模块详细用法
os 模块用于与操作系统交互,主要涉及夹操作、路径操作和其他操作。例如,`os.rename()` 重命名文件,`os.mkdir()` 创建文件夹,`os.path.abspath()` 获取文件绝对路径等。sys 模块则用于与 Python 解释器交互,常用功能如 `sys.path` 查看模块搜索路径,`sys.platform` 检测操作系统等。这些模块提供了丰富的工具,便于开发中处理系统和文件相关任务。
223 14
|
9月前
|
Python
Python Internet 模块
Python Internet 模块。
203 74
|
6月前
|
人工智能 自然语言处理 Shell
[oeasy]python070_如何导入模块_导入模块的作用_hello_dunder_双下划线
本文介绍了如何在Python中导入模块及其作用,重点讲解了`__hello__`模块的导入与使用。通过`import`命令可以将外部模块引入当前环境,增强代码功能。例如,导入`__hello__`模块后可输出“Hello world!”。此外,还演示了如何使用`help()`和`dir()`函数查询模块信息,并展示了导入多个模块的方法。最后,通过一个实例,介绍了如何利用`jieba`、`WordCloud`和`matplotlib`模块生成词云图。总结来说,模块是封装好的功能部件,能够简化编程任务并提高效率。未来将探讨如何创建自定义模块。
79 8
|
6月前
|
缓存 Shell 开发工具
[oeasy]python071_我可以自己做一个模块吗_自定义模块_引入模块_import_diy
本文介绍了 Python 中模块的导入与自定义模块的创建。首先,我们回忆了模块的概念,即封装好功能的部件,并通过导入 `__hello__` 模块实现了输出 "hello world!" 的功能。接着,尝试创建并编辑自己的模块 `my_file.py`,引入 `time` 模块以获取当前时间,并在其中添加自定义输出。
99 5
|
10月前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
256 63
|
10月前
|
Python
Python的模块和包
总之,模块和包是 Python 编程中非常重要的概念,掌握它们可以帮助我们更好地组织和管理代码,提高开发效率和代码质量
216 61
|
10月前
|
数据可视化 Python
如何在Python中解决模块和包的依赖冲突?
解决模块和包的依赖冲突需要综合运用多种方法,并且需要团队成员的共同努力和协作。通过合理的管理和解决冲突,可以提高项目的稳定性和可扩展性
|
7月前
|
Python API 监控
将Python CLI工具发布为pip模块的完整指南
注册PyPI账户 访问PyPI官网注册账户 推荐使用双因素认证增强安全性 生成API令牌 访问PyPI账户管理 生成具有"Upload packages"权限的令牌,妥善保存 确保模块名唯一性 在PyPI搜索页面验证模块名未被使用 建议使用小写字母和连字符的组合(如my-cli-tool)
140 9
|
10月前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。

热门文章

最新文章

推荐镜像

更多