前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >探索Python中的日志处理【Logging模块的高级用法】

探索Python中的日志处理【Logging模块的高级用法】

原创
作者头像
一键难忘
发布于 2024-06-16 07:56:04
发布于 2024-06-16 07:56:04
1.7K00
代码可运行
举报
文章被收录于专栏:技术汇总专栏技术汇总专栏
运行总次数:0
代码可运行


在Python应用程序中,日志处理是一项至关重要的任务,它有助于跟踪应用程序的状态、诊断问题以及记录关键信息。Python提供了内置的Logging模块,使得日志记录变得简单而强大。在本文中,我们将探索Logging模块的高级用法,包括日志级别、格式化、处理程序等方面的功能。

1. 日志级别

Logging模块支持多个日志级别,从最低的DEBUG到最高的CRITICAL。使用不同的级别可以控制日志信息的输出粒度,以及对应用程序的影响程度。以下是Python Logging模块支持的日志级别:

  • DEBUG:用于详细的调试信息。
  • INFO:用于确认应用程序的正常运行。
  • WARNING:用于指示潜在的问题,但不影响应用程序的正常工作。
  • ERROR:用于指示应用程序中的错误,可能影响部分功能的正常运行。
  • CRITICAL:用于指示严重错误,可能导致应用程序崩溃。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import logging
​
logging.basicConfig(level=logging.DEBUG)
​
logging.debug('这是一个DEBUG级别的日志信息')
logging.info('这是一个INFO级别的日志信息')
logging.warning('这是一个WARNING级别的日志信息')
logging.error('这是一个ERROR级别的日志信息')
logging.critical('这是一个CRITICAL级别的日志信息')

2. 格式化

Logging模块允许开发者对日志信息进行格式化,以便更好地理解和分析日志内容。可以在日志处理器中指定格式化字符串,其中可以包含特定的占位符,如日志级别、时间戳、模块名等。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import logging
​
logging.basicConfig(format='%(asctime)s - %(levelname)s - %(message)s', level=logging.DEBUG)
​
logging.debug('这是一个DEBUG级别的日志信息')

3. 处理程序

Logging模块支持将日志信息发送到不同的处理程序,例如文件、控制台、网络等。通过添加不同的处理程序,可以根据需要将日志信息发送到不同的目的地。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import logging
​
# 创建一个FileHandler处理程序,将日志信息写入文件
file_handler = logging.FileHandler('app.log')
file_handler.setLevel(logging.ERROR)
​
# 创建一个StreamHandler处理程序,将日志信息输出到控制台
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
​
# 创建一个格式化字符串
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
​
# 将格式化字符串应用到处理程序
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)
​
# 添加处理程序到Logger对象
logger = logging.getLogger(__name__)
logger.addHandler(file_handler)
logger.addHandler(console_handler)
​
# 发送日志信息
logger.debug('这是一个DEBUG级别的日志信息')
logger.error('这是一个ERROR级别的日志信息')

4. 过滤器

Logging模块还提供了过滤器的功能,可以根据需求对日志信息进行筛选和过滤。过滤器可以基于日志级别、模块名等条件来过滤日志信息,使得日志记录更加精确和有效。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import logging
​
class DebugFilter(logging.Filter):
    def filter(self, record):
        return record.levelno == logging.DEBUG
​
# 创建一个Logger对象
logger = logging.getLogger(__name__)
​
# 创建一个FileHandler处理程序
file_handler = logging.FileHandler('debug.log')
file_handler.setLevel(logging.DEBUG)
​
# 创建一个格式化字符串
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
​
# 创建一个DebugFilter过滤器
debug_filter = DebugFilter()
​
# 将格式化字符串应用到处理程序
file_handler.setFormatter(formatter)
​
# 将过滤器应用到处理程序
file_handler.addFilter(debug_filter)
​
# 添加处理程序到Logger对象
logger.addHandler(file_handler)
​
# 发送日志信息
logger.debug('这是一个DEBUG级别的日志信息')
logger.info('这是一个INFO级别的日志信息')

5. 配置文件

Logging模块支持从配置文件中加载配置信息,使得日志处理的配置更加灵活和可配置化。通过配置文件,开发者可以指定日志级别、格式化、处理程序等信息,并根据需要进行调整和修改,而不需要修改源代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# logging.conf
[loggers]
keys=root
​
[handlers]
keys=consoleHandler
​
[formatters]
keys=sampleFormatter
​
[logger_root]
level=DEBUG
handlers=consoleHandler
​
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=sampleFormatter
args=(sys.stdout,)[formatter_sampleFormatter]
format=%(asctime)s - %(levelname)s - %(message)s
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 使用配置文件进行日志配置
import logging
import logging.config
​
logging.config.fileConfig('logging.conf')
​
logger = logging.getLogger(__name__)
​
logger.debug('这是一个DEBUG级别的日志信息')
logger.info('这是一个INFO级别的日志信息')

6. 日志轮转

日志轮转是一种常见的日志管理技术,它可以在日志文件达到一定大小或者在特定时间间隔后,自动将当前日志文件重命名并创建一个新的日志文件,以避免日志文件过大或者过期。Python的Logging模块提供了相应的轮转处理程序,方便开发者实现日志轮转功能。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import logging
from logging.handlers import RotatingFileHandler
​
# 创建一个Logger对象
logger = logging.getLogger(__name__)
​
# 创建一个RotatingFileHandler处理程序
file_handler = RotatingFileHandler('app.log', maxBytes=10000, backupCount=3)
file_handler.setLevel(logging.DEBUG)
​
# 创建一个格式化字符串
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
​
# 将格式化字符串应用到处理程序
file_handler.setFormatter(formatter)
​
# 添加处理程序到Logger对象
logger.addHandler(file_handler)
​
# 发送日志信息
for i in range(10):
    logger.debug(f'这是第{i+1}条DEBUG级别的日志信息')

7. 日志归档

日志归档是另一种常见的日志管理技术,它可以根据时间周期性地将日志文件进行归档,例如按照每天、每周或者每月生成一个新的日志文件。Python的Logging模块也提供了相应的归档处理程序,可以轻松实现日志的自动归档功能。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import logging
from logging.handlers import TimedRotatingFileHandler
​
# 创建一个Logger对象
logger = logging.getLogger(__name__)
​
# 创建一个TimedRotatingFileHandler处理程序
file_handler = TimedRotatingFileHandler('app.log', when='midnight', interval=1, backupCount=3)
file_handler.setLevel(logging.DEBUG)
​
# 创建一个格式化字符串
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
​
# 将格式化字符串应用到处理程序
file_handler.setFormatter(formatter)
​
# 添加处理程序到Logger对象
logger.addHandler(file_handler)
​
# 发送日志信息
for i in range(10):
    logger.debug(f'这是第{i+1}条DEBUG级别的日志信息')

8. 自定义处理程序

除了使用Logging模块提供的内置处理程序外,开发者还可以自定义处理程序来满足特定的需求。通过自定义处理程序,可以将日志信息发送到自定义的目的地,例如数据库消息队列等,以满足特定场景下的日志记录需求。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import logging

class CustomHandler(logging.Handler):
    def emit(self, record):
        # 自定义处理逻辑
        log_entry = self.format(record)
        # 将日志信息发送到自定义目的地
        print(f"CustomHandler: {log_entry}")

# 创建一个Logger对象
logger = logging.getLogger(__name__)

# 创建一个自定义处理程序
custom_handler = CustomHandler()
custom_handler.setLevel(logging.DEBUG)

# 创建一个格式化字符串
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')

# 将格式化字符串应用到处理程序
custom_handler.setFormatter(formatter)

# 添加处理程序到Logger对象
logger.addHandler(custom_handler)

# 发送日志信息
logger.debug('这是一个DEBUG级别的日志信息')

9. 异常处理中的日志记录

在异常处理中记录日志是一种常见的做法,它可以帮助开发者及时捕获和排查应用程序中的异常情况,从而提升应用程序的稳定性和可靠性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import logging

# 创建一个Logger对象
logger = logging.getLogger(__name__)

try:
    # 尝试执行可能会抛出异常的代码
    result = 10 / 0
except Exception as e:
    # 在异常处理中记录日志
    logger.exception('发生了一个异常')

10. 日志记录最佳实践

在使用Logging模块记录日志时,除了掌握各种高级功能外,还有一些最佳实践值得我们注意。这些最佳实践可以帮助我们更好地利用Logging模块,提高日志记录的效率和可维护性。

  • 适当选择日志级别: 使用适当的日志级别可以控制日志信息的输出量,避免在生产环境中输出过多的调试信息。
  • 格式化一致性: 保持日志格式的一致性可以方便日志信息的查阅和分析,建议在整个应用程序中采用相同的日志格式。
  • 异常处理中的日志记录: 在异常处理中记录日志可以帮助我们及时捕获和排查异常情况,建议在应用程序的关键异常处理逻辑中添加相应的日志记录。
  • 日志轮转和归档: 对于日志文件的管理,建议使用日志轮转和归档功能,以避免日志文件过大或者过期。
  • 自定义处理程序: 根据实际需求,可以考虑自定义处理程序,将日志信息发送到自定义的目的地,以满足特定场景下的日志记录需求。

11. 日志记录的性能考量

除了功能和最佳实践外,我们还需要考虑日志记录对应用程序性能的影响。尽管Logging模块提供了强大的功能,但不合理的日志记录方式可能会导致性能下降,特别是在高负载的生产环境中。

  • 慎用DEBUG级别: 在生产环境中,避免过度使用DEBUG级别的日志记录,因为它们会产生大量的输出,并可能影响应用程序的性能。建议在生产环境中仅记录必要的信息。
  • 异步日志记录: 对于高并发的应用程序,考虑使用异步日志记录器来提高性能。异步记录器可以将日志信息缓冲并异步地写入到目标处理程序,从而减少对主线程的阻塞。
  • 日志记录器的层级结构: 合理构建日志记录器的层级结构可以帮助我们更好地管理和控制日志记录的性能。尽量避免在每个模块中都创建一个独立的日志记录器,而是应该根据业务逻辑和模块功能来组织日志记录器的层级结构。

12. 性能优化技巧

为了进一步提高日志记录的性能,我们可以采取一些优化技巧来减少日志记录对应用程序性能的影响。

  • 批量处理: 将多条日志信息合并成一条进行批量处理,可以减少IO操作和资源消耗,提高日志记录的效率。
  • 使用更快的处理程序: 对于性能敏感的场景,可以考虑使用更快速的处理程序,如MemoryHandler或QueueHandler,以减少日志记录对应用程序性能的影响。
  • 禁用不必要的处理程序: 定期审查和禁用不必要的处理程序,可以减少日志记录的开销,提高应用程序的性能。

总结

Python中的Logging模块提供了丰富的功能和灵活的配置选项,使得日志记录变得简单而强大。通过本文的介绍,我们深入探讨了Logging模块的高级用法,包括日志级别、格式化、处理程序、过滤器、配置文件等方面的功能。我们还分享了一些日志记录的最佳实践,如适当选择日志级别、保持日志格式的一致性、在异常处理中记录日志等。此外,我们还探讨了日志记录对应用程序性能的影响以及性能优化技巧,帮助开发者更好地管理和维护应用程序的日志信息,提高应用程序的质量和性能。

总的来说,合理地使用Logging模块提供的功能和最佳实践,以及考虑日志记录对应用程序性能的影响并采取相应的性能优化措施,将有助于提高应用程序的可靠性、可维护性和性能,为应用程序的稳定运行和问题排查提供更好的支持。

我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
HTML进阶
标签:dl 嵌套 dt 和 dd,dl 是定义列表,dt 是定义列表的标题,dd 是定义列表的描述 / 详情。
777nx
2023/10/18
2480
HTML进阶
【web前端】web前端设计入门到实战第一弹——html基础精华
同级路径: 直接写图片名 或者./+图片名 下级路径: 写文件夹名字 + 图片名 上级路径: 先到上一文件夹 到上一级目录 …/ 当看到目标文件时再进入再找图片名 属性名:title 属性值:提示文本 当鼠标悬停是才显示的文本
洁洁
2023/10/19
3180
Web阶段:第一章:HTML语言
需求1:使用无序,列表方式,把东北F4,刘能、赵四、宋小宝、小沈阳 ,展示出来 举例:
Java廖志伟
2022/11/28
1K0
HTML第二天
单选框:**<type=”radio” name=”sex” value=”nan” checked>**
小城故事
2023/02/27
3.2K0
HTML第二天
web前端基础
代码示例:跳转到https://www.acai.cloud地址时用浏览器空白标签页打开
慕容峻才
2020/10/22
1.2K0
Html&Css 基础总结(基础好了才是最能打的)二
这是作者的第二天总结篇章, 有需要的小伙伴可以 在这里 找到第一篇文章 视频在这里~ @B站黑马程序员视频
胖虎哥
2024/04/26
1590
网页组成
单标签 <! Doctype html> 双标签 <html> </html> <head></head> <title></title>
Daotin
2022/11/28
6.1K0
网页组成
网页内容---HTML后续
1.表格 <!-- table:声明一个表格 tr:声明表格的行 th、td:声明表格的单元格 th:表头 td:普通的单元格 caption:表格的标题 table: border:表格的边框大小 cellspacing:单元格和边框的间距 cellpadding:单元格边框与内容的距离
用户10216580
2022/12/06
4.4K0
【黑马程序员pinik名师讲html】HTML很容易忘记?有它我不慌的
下面要讲的vscode自动生成,基本不用我们自己写,但是需要了解每一个代码的意思和作用
MicroFrank
2023/01/16
1.5K0
HTML基础第二课(冲浪笔记2)
(2)cellpadding //单元格边沿到单元内容的距离(上下左右都会变)
申小兮
2022/10/09
5020
HTML基础第二课(冲浪笔记2)
Web前端开发HTML笔记
HTML称为超文本标记语言,CSS全称层叠样式,CSS可以让简单的HTML页面变得漂亮起来,通常会将HTML与CSS结合起来使用.
王 瑞
2022/12/28
2.5K0
HTML 标签介绍
ii. 事件属性: οnclick="alert('你好!');" 可以直接设置事件响应后的代码。
一个风轻云淡
2022/11/15
1.9K0
HTML 标签介绍
【前端基础篇】HTML零基础速通
在 IDEA 中创建文件 xxx.html , 直接输入 ! , 按 tab 键, 此时能自动生成代码的主体框架.
半截诗
2024/10/09
2010
【前端基础篇】HTML零基础速通
WEB入门二 表格和表单
表格对于网页制作而言极其重要,其最明显的优点是能够以行列整齐的形式来显示文本、数字、图片信息。而且,表格还可以用于固定文本或图像的显示位置。经常上网的用户会发现表格被大量网站广泛应用,例如新闻列表、商品显示等。
张哥编程
2024/12/17
6490
Web前端基础(01)
代码已打包,连接如下https://download.csdn.net/download/qq_44273429/12700036 未完待续…
海拥
2021/08/23
1.2K0
html基础总结
multiple : 布尔属性,设置后允许多选,否则只能选择一个 disabled : 禁用该下拉列表 selected : 首次显示时,为选中状态 value : 定义发往服务器的选项值
小小咸鱼YwY
2019/09/11
1.7K0
从零开始学 Web 之 HTML(三)表单
table>tr3>td5 + tab键  <!-- 建立3行5列的表格 -->
Daotin
2018/08/31
3.1K0
从零开始学 Web 之 HTML(三)表单
Day2:html和css
表格用table,tr代表表格中的一行,必须在table标签中,td用于表示表格中的单元格,<tr></tr>表格中的一行.
达达前端
2019/07/03
1.5K0
前端开发学习──初识Html
type:disc默认 实心小圆圈;square 小方块;circle 空心小圆圈
用户3106371
2018/09/12
1.9K0
前端开发学习──初识Html
七 .Html的表格
1.表格 owspan 纵向的合并单元格 colspan 横向的合并单元格 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Docume
小海怪的互联网
2020/10/26
2.4K0
相关推荐
HTML进阶
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验