前往小程序,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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
轻松搞定Python日志记录:logging模块详解与实战
在开发和维护软件时,日志记录是一个非常重要的环节。它可以帮助开发者调试代码、监控应用运行状态、记录系统行为等。Python的logging模块提供了一个灵活且强大的日志记录功能,能够满足各种日志记录需求。本文将详细介绍logging模块的使用,包括基本概念、配置方法、日志级别、日志处理器和格式化器的使用,以及实际应用案例。
sergiojune
2024/08/02
9510
轻松搞定Python日志记录:logging模块详解与实战
还在用 print?试一试 logging 的强大!
这次呢?我给大家带来了 logging 的用法,这也是为以后我分享案例做准备,因为以后我的代码不会经常使用 print 来做命令行输出提示,那真的太 low 了,但不能否认,我用了 print 好久而且貌似还挺满足的,可是当自己的代码放在实际的工程开发之中,或者大佬面前根本不是入眼了,这还真不能怪那些大佬或者实际工作需求高,而是我们看到 “烂代码” 的时候,表示一秒我都不想在这样的代码上多浪费时间,比如该换行的不换行、变量的命名各种各样、函数名也是,或者赋值符号两边不加空格、不符合软件工程规范:高内聚低耦合啥的,这类还有很多,培训班出来的有很大一部分都这样,这么说不是没有原因的,培训班老师自己偷懒或者本身就不会,写代码的时候不注意规范,但至少提一下吧!
数据森麟
2020/06/12
5470
Python学习-logging
Python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用。这个模块提供不同的日志级别,并可以采用不同的方式记录日志。
py3study
2020/01/09
8270
Python入门之Python中的logging模块
基本用法 下面的代码展示了logging最基本的用法。 import logging import sys # 获取logger实例,如果参数为空则返回root logger logger = logging.getLogger("AppName") # 指定logger输出格式 formatter = logging.Formatter('%(asctime)s %(levelname)-8s: %(message)s') # 文件日志 file_handler = logging.FileH
Jetpropelledsnake21
2018/05/03
7110
Python - 日志处理(logging模块)
LOG http://www.cnblogs.com/yyds/p/6901864.html logging logging 模块提供模块级别的函数记录日志 包括四大组件 1. 日志相关概念 日志 日志的级别(level) 不同的用户关注不同的程序信息 DEBUG INFO NOTICE WARNING ERROR CRITICAL ALERT EMERGENCY IO 操作=>不要太频繁 LOG的作用 调试 了解软件的运行情况 分析定位问题 日志信息 time 地点 level 内容 成熟的第三方
ruochen
2021/05/11
9600
Python - 日志处理(logging模块)
深入理解 Python 中的日志 logging 模块
日志记录是软件开发中的一个重要环节,它可以帮助我们监控程序运行过程中的状态、诊断问题以及分析性能。Python 中通常使用 logging 模块,让我们能够方便地记录日志信息。
Mirza Zhao
2023/11/17
4710
深入理解 Python 中的日志 logging 模块
关于python logging 模块
在日志中使用记录器(Logger)可以帮助我们更好地控制日志输出的格式和位置。可以通过以下命令创建一个名为my_logger的记录器:
dbdocker
2024/02/01
1500
Python中内置的日志模块logging用法详解
Python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用。这个模块提供不同的日志级别,并可以采用不同的方式记录日志,比如文件,HTTP GET/POST,SMTP,Socket等,甚至可以自己实现具体的日志记录方式。logging模块与log4j的机制是一样的,只是具体的实现细节不同。模块提供logger,handler,filter,formatter。
狼啸风云
2020/02/21
16.6K1
Python中内置的日志模块logging用法详解
Python开发之日志记录模块:logg
最近在开发一个应用软件,为方便调试和后期维护,在代码中添加了日志,用的是Python内置的logging模块,看了许多博主的博文,颇有所得。不得不说,有许多博主大牛总结得确实很好。似乎我再写关于logging的博文有些多余,但不写总结又总觉得没掌握。那就写写吧,也方便日后回顾。
py3study
2020/01/16
1.4K0
Python开发之日志记录模块:logg
python 日志模块 logging 详解
Java 中最通用的日志模块莫过于 Log4j 了,在 python 中,也自带了 logging 模块,该模块的用法其实和 Log4j 类似。 Python 使用logging模块记录日志涉及四个主要类,使用官方文档中的概括最为合适: logger提供了应用程序可以直接使用的接口; handler将(logger创建的)日志记录发送到合适的目的输出; filter提供了细度设备来决定输出哪条日志记录; formatter决定日志记录的最终输出格式。 logging模块是在2.3新引进的功能,下面是一些常用
用户1177713
2018/02/24
2.2K0
python 日志模块 logging 详解
Python日志模块logging
logger只输出高于或等于当前级别的日志, logging的root logger默认级别为info.
菲宇
2022/12/21
3570
Python日志模块logging
Python 日志处理详解:从基础到实战
在使用日志模块之前,我们可以配置日志的基本设置,例如设置日志级别、输出格式等。以下是一个简单的配置示例:
一键难忘
2024/03/18
5840
Python logging模块怎么使用,你会了吗?
在开发和维护Python应用程序时,日志记录是一项非常重要的任务。Python提供了内置的logging模块,它可以帮助我们方便地记录应用程序的运行时信息、错误和调试信息。本文将介绍如何使用Python logging模块进行日志记录。
霍格沃兹测试开发Muller老师
2023/09/07
2450
loggin(日志模块)
普通情况下,在控制台显示输出 print() 报告正常程序操作过程中发生的事件 logging.info()(或者更详细的logging.debug()) 发出有关特定事件的警告 warnings.warn()或者logging.warning() 报告错误 弹出异常 在不引发异常的情况下报告错误 logging.error(), logging.exception()或者logging.critical()
py3study
2020/01/17
7470
学会充分利用Python中的日志,提升你的编程level
日志记录对于程序员来说是一个非常重要的功能。对于调试和显示运行时信息,日志记录同样有用。在本文中,我将介绍为什么以及如何在程序中使用python的日志模块。
HuangWeiAI
2021/05/07
7130
Python日志处理logging模块详解
logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备如下优点
王大力测试进阶之路
2020/01/26
9750
Python的logging模块
在app.py 文件中引入logger模块,这个文件是create_app的工厂模块。
狼啸风云
2020/02/13
8030
【Python日志模块全面指南】:记录每一行代码的呼吸,掌握应用程序的脉搏
日志是记录了一系列事件或活动的文件。在计算机领域,它通常用于记录程序或系统的运行状况和维护信息,以便在需要时进行故障排除或回溯。通过分析日志文件,管理员可以了解系统的使用情况、问题发生的原因以及如何解决这些问题。
爱喝兽奶的熊孩子
2024/06/23
4610
【Python日志模块全面指南】:记录每一行代码的呼吸,掌握应用程序的脉搏
logging模块
logging模块 函数式简单配置 import logging logging.debug('debug message') logging.info('info message') logging.warning('warning message') logging.error('error message') logging.critical('critical message') 默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNIN
用户1214487
2018/01/23
7030
Python模块知识5:日志logging
logging模块提供了通用的日志系统,可以采用不同的方式记录日志,比如文件,HTTP、GET/POST,SMTP,Socket等,甚至可以自己实现具体的日志记录方式; 日志分不同提醒级别,级别顺序为:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET,可以自己定义日志级别。 级别越高打印的日志等级越少,反之亦然。 debug: 打印全部的日志(notset等同于debug) info:打印info、warning、error、critical级别的日志 w
企鹅号小编
2018/01/11
8080
Python模块知识5:日志logging
相关推荐
轻松搞定Python日志记录:logging模块详解与实战
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验