优雅地记录Python程序日志2:模块组件化日志记录器

时间:2022-09-13 13:52:10

本文摘自:https://zhuanlan.zhihu.com/p/32043593

本篇将会涉及:

  • logging的各个模块化组件
  • 构建一个组件化的日志器

logging的模块组件化

在上一篇文章中,我们介绍了Python的内置模块logging的使用,通过短短的几行代码我们就实现了一个日志记录器。。

import logging

logging.basicConfig(level=logging.INFO,filename='test.log',format="%(levelname)s:%(asctime)s:%(message)s")
logging.error("出现了错误")
logging.info("打印信息")
logging.warning("警告信息")

在上面的例子中我们直接使用了logging模块提供的简单日志记录器。除此之外,logging模块还提供了模块化的方法,通过日志记录器、日志处理器、过滤器和格式处理器等组件来灵活的配置日志器:

  • 日志记录器Loggers提供程序调用日志记录的接口;
  • 日志处理器Handlers用于将日志记录器创建的日志记录发送到相应的目标上;
  • 过滤器Filters提供了对日志记录进行更详细的输出;
  • 格式器Formatters用于指定输出的日志记录的最终格式;

在前面的例子中我们知道,一条日志记录是通过调用一个日志记录器(Logger类的实例)的方法来执行的。每一个日志记录器都有一个name来标识这个日志记录器,比如上一篇文章中我们创建的日志记录起的name就是默认的root。

日志记录器

通过logging的getLogger()方法,我们可以创建一个日志记录器,并指定其名称:

log = logging.getLogger("test_logger")

这样我们就实例化了一个名为test_logger的日志记录器。这个日志记录器除了包含一些基本的功能,比如调用各级别的日志方法外,还能够添加日志处理器、过滤器等。

日志处理器

日志处理器Handlers负责将相应的日志记录消息分发到指定的目标上。在logging模块中,有很多种日志处理器用于不同的用途,下面介绍几个常用的:

  • StreamHandler:用于将日志消息发送到控制台;
  • FileHandler:用于将日志消息写入文件中;
  • SMTPHandler:用于将日志消息发送到指定的电子邮箱;
  • HTTPHandler:使用GET或POST方法将日志消息发送给某个HTTP服务器;

其中我们最常使用的,还是FileHandler处理器,将日志消息写入文件中。
使用logging.FileHandler()可以创建一个FileHandler处理器处理器:

logHandler = logging.FileHandler(filename='log.log')

我们在此创建了一个FileHandler处理器,并指定日志的文件名为log.log。

在创建日志处理器之后,可以通过日志记录器的addHandler()方法,将处理器添加到记录器中。

log.addHandler(logHandler)

日志格式器

在上一篇文章中,我们通过logging.basicConfig()的format参数来指定输出日志消息的格式。而在模块组件化中,我们使用logging.Formatter()方法来创建一个日志格式器。

formats = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s: %(message)s',
datefmt='%Y/%m/%d %I:%M:%S %p')

在创建之后,可以通过日志处理器的setFormatter()方法,将日志格式器添加到日志处理器中:

logHandler.setFormatter(formats)

这样,我们就基本组装好了一个模块化的日志器。接着就能够在程序中调用日志记录器的方法来记录日志:

import logging

def mylog():
print(inspect.stack()[0])
# 创建一个日志记录器
log = logging.getLogger("test_logger")
log.setLevel(logging.DEBUG) # 创建一个日志处理器
logHandler = logging.FileHandler(filename='log.log')
logHandler.setLevel(logging.DEBUG) # 创建一个日志格式器
formats = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s: %(message)s',
datefmt='%Y/%m/%d %I:%M:%S %p') # 将日志格式器添加到日志处理器中
logHandler.setFormatter(formats) # 将日志处理器添加到日志记录器中
log.addHandler(logHandler)
return log # 输出日志
log = mylog()
log.info("这是一个普通信息")
log.debug("这是一个调试信息")
log.warning("这是一个警告信息")
log.error("这是一个错误信息")
log.critical("这是一个危险信息")

运行程序的结果如下:

优雅地记录Python程序日志2:模块组件化日志记录器

优雅地记录Python程序日志2:模块组件化日志记录器的更多相关文章

  1. 优雅地记录Python程序日志1:logging模块简介

    本文摘自:https://zhuanlan.zhihu.com/p/31893724 本篇涉及: logging模块的调用: 保存log日志为文件: 调整输入日志等级: 修改日志消息格式: 前言 在使 ...

  2. 使用配置文件方式记录Python程序日志

    开发者可以通过三种方式配置日志记录: 调用配置方法的Python代码显式创建记录器.处理程序和格式化程序. 创建日志配置文件并使用fileConfig() 函数读取. 创建配置信息字典并将其传递给di ...

  3. 如何优雅地退出python程序

    如何优雅地退出python程序 一个单模的python程序,启动之后要能够优雅地关闭.即当用户按Ctrl+C或者kill pid的时候,程序都能从容关闭.实现起来非常简单. is_running = ...

  4. 利用python自动生成verilog模块例化模板

    一.前言 初入职场,一直忙着熟悉工作,就没什么时间更新博客.今天受“利奇马”的影响,只好宅在家中,写写技术文章.芯片设计规模日益庞大,编写脚本成了芯片开发人员必要的软技能.模块端口动不动就几十上百个, ...

  5. 如何用ABP框架快速完成项目(11) - ABP只要加人即可马上加快项目进展- 全栈篇(2) - 不推荐模块组件化, 推荐微服务

    一个人写代码不需要担心会和别人的代码冲突, 不需要做代码合并, 不需要担心自己的代码被覆盖. 但是多个人一起写代码就需要担心这些问题.   解决这些问题的方法很多, 比如用AzureDevOps(TF ...

  6. [转载] 每个 Python 程序员都要知道的日志实践

    原文: http://python.jobbole.com/81666/ 在现实生活中,记录日志非常重要.银行转账时会有转账记录:飞机飞行过程中,会有黑盒子(飞行数据记录器)记录飞行过程中的一切.如果 ...

  7. 每个 Python 程序员都要知道的日志实践

    在现实生活中,记录日志非常重要.银行转账时会有转账记录:飞机飞行过程中,会有黑盒子(飞行数据记录器)记录飞行过程中的一切.如果有出现什么问题,人们可以通过日志数据来搞清楚到底发生了什么. 对于系统开发 ...

  8. hadoop streaming 中跑python程序,自定义模块的导入

    今天在做代码重构,以前将所有python文件放到一个文件夹下,上传到hadoop上跑,没有问题:不过随着任务的复杂性增加,感觉这样甚是不合理,于是做了个重构,建了好几个包存放不同功能的python文件 ...

  9. [转]python执行bash指令,如果指令返回错误,如何优雅的结束python程序

    如果是有返回值的可执行文件可以直接获取return code, 如果error code 直接退出. import os ret = os.system("COMMAND LINE&quot ...

随机推荐

  1. rem和em,px的使用

    rem是CSS3中新增加的一个单位值,他和em单位一样,都是一个相对单位.不同的是em是相对于元素的父元素的font-size进行计算:rem是相对于根元素html的font-size进行计算.这样一 ...

  2. MFC程序的启动过程——先全局对象theApp(第一入口),后WinMain(真正入口),会引爆pApp->InitInstance从而创建窗口(程序员入口)

    原文出自:http://blog.csdn.net/yuvmen/article/details/5877271 了解MFC程序的启动过程,对于初学者来讲,了学习MFC很有帮助:对于不常用VC的人来说 ...

  3. 前后端分离--mock

    fekit mock 数据 > fekit server -m mock.config 配置mock.config 支持正则 module.exports = { /queryProductDe ...

  4. Fedora上配置一个安全FTP

    现在流行的FTP服务器,比较著名的有WU-FTP(Washington University FTP)和VSFTP(Very Secure FTP 非常安全的FTP)以及Proftp,pureftp等 ...

  5. js+dom开发第十六天

    一.css常用标签及页面布局 1.常用标签 position(定位) z-index(定位多层顺序) background(背景) text-align(针对字符自动左右居中) margin(外边距) ...

  6. msm8974 camera driver添加新摄像头kernel hal修改

    添加一款新摄像头流程 1添加sensor kernel driver, 主要实现上电.rst.pwd.mclk等power setting,sensor prob & sensor  i2c ...

  7. Reflections 介绍

    Reflections 介绍 研究Spring扫包原理的时候,在网上查阅相关资料的时候,发现使用Reflections库可以实现扫包. Reflections 通过扫描 classpath,索引元数据 ...

  8. 插入排序算法的JAVA实现

    1,对元素进行排列时,元素之间需要进行比较,因此需要实现Comparable<T>接口.即,<T extends Comparable<T>>. 更进一步,如果允许 ...

  9. css中 ~的作用

    这是 CSS3 element1~element2 选择器 定义和用法 element1~element2 选择器 element1 之后出现的所有 element2. 两种元素必须拥有相同的父元素, ...

  10. 24&period;form表单提交的六种方式

    form表单提交方式 1.无刷新页面提交表单 表单可实现无刷新页面提交,无需页面跳转,如下,通过一个隐藏的iframe实现,form表单的target设置为iframe的name名称,form提交目标 ...