跳转至

logging 模块

Python logging 模块详解

logging 模块是 Python 内置的日志记录模块,提供了灵活且功能强大的日志记录系统,用于跟踪和记录程序的运行状态、调试信息、错误等内容。相比于简单的 print() 调试,logging 模块提供了更好的控制和管理日志的方式。

1. 基本用法

logging 模块允许你通过日志记录器(Logger)来生成日志信息。每条日志消息都有一个严重性级别,默认从最低到最高依次为 DEBUGINFOWARNINGERRORCRITICAL

import logging

# 设置基本配置
logging.basicConfig(level=logging.DEBUG)

# 记录不同级别的日志
logging.debug("这是调试信息")
logging.info("这是一般信息")
logging.warning("这是警告信息")
logging.error("这是错误信息")
logging.critical("这是严重错误信息")

2. 配置日志

logging.basicConfig() 是快速设置日志记录器的最简单方法,可以通过它设置日志级别、格式、输出位置等。

  • 设置日志级别: 控制最低记录的日志级别。

python logging.basicConfig(level=logging.INFO)

  • 设置日志格式: 格式化日志消息的输出方式。

python logging.basicConfig( format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.DEBUG )

  • 将日志输出到文件: 默认情况下,日志输出到控制台,你也可以指定输出到文件。

python logging.basicConfig( filename='app.log', filemode='w', format='%(asctime)s - %(levelname)s - %(message)s', level=logging.DEBUG )

3. Logger 对象

Logger 是日志系统的主体,用于记录日志消息。默认情况下,Python 提供了一个名为 root 的全局 Logger,但通常我们会创建自定义的 Logger。

  • 创建 Logger 对象:

python logger = logging.getLogger('my_logger') logger.setLevel(logging.DEBUG)

  • Logger 继承性: 子 Logger 继承父 Logger 的配置。

python logger = logging.getLogger('my_logger.child')

4. Handler 处理器

Handler 决定日志信息的输出位置。常用的 Handler 有以下几种:

  • StreamHandler: 将日志输出到控制台。

python console_handler = logging.StreamHandler() logger.addHandler(console_handler)

  • FileHandler: 将日志输出到文件。

python file_handler = logging.FileHandler('app.log') logger.addHandler(file_handler)

  • RotatingFileHandler: 将日志输出到文件,并在文件达到一定大小时进行轮换。

python rotating_handler = logging.handlers.RotatingFileHandler( 'app.log', maxBytes=2000, backupCount=5 ) logger.addHandler(rotating_handler)

  • TimedRotatingFileHandler: 将日志输出到文件,并在设定的时间间隔后进行轮换。

python timed_handler = logging.handlers.TimedRotatingFileHandler( 'app.log', when='midnight', interval=1, backupCount=7 ) logger.addHandler(timed_handler)

5. Formatter 格式化器

Formatter 用于控制日志信息的最终输出格式。可以通过以下格式字符串来定制输出:

  • %(asctime)s:日志记录的时间
  • %(name)s:Logger 的名称
  • %(levelname)s:日志级别
  • %(message)s:日志消息
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)

6. Filter 过滤器

Filter 用于更细粒度地控制哪些日志记录能够通过 Handler 进行输出。

  • 简单示例:

```python class CustomFilter(logging.Filter): def filter(self, record): return 'special' in record.msg

logger.addFilter(CustomFilter()) ```

7. 配置日志:配置文件与字典配置

  • 配置文件:

你可以通过 configparser 格式的配置文件来设置日志。

```ini [loggers] keys=root,simpleExample

[handlers] keys=consoleHandler

[formatters] keys=sampleFormatter

[logger_root] level=DEBUG handlers=consoleHandler

[logger_simpleExample] level=DEBUG handlers=consoleHandler qualname=simpleExample

[handler_consoleHandler] class=StreamHandler level=DEBUG formatter=sampleFormatter args=(sys.stdout,)

[formatter_sampleFormatter] format=%(asctime)s - %(name)s - %(levelname)s - %(message)s datefmt= ```

使用配置文件:

```python import logging import logging.config

logging.config.fileConfig('logging.conf') logger = logging.getLogger('simpleExample') ```

  • 字典配置:

```python import logging.config

dictConfig = { 'version': 1, 'formatters': { 'default': { 'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s', }, }, 'handlers': { 'console': { 'class': 'logging.StreamHandler', 'formatter': 'default', }, }, 'root': { 'level': 'DEBUG', 'handlers': ['console'] }, }

logging.config.dictConfig(dictConfig) logger = logging.getLogger() ```

8. 日志捕获外部库的日志

你可以控制外部库的日志记录行为,例如将第三方库的日志记录级别设置为 WARNING 或更高:

logging.getLogger('some_library').setLevel(logging.WARNING)

9. 日志异常信息

logging 可以自动捕获和记录异常堆栈信息。

try:
    1 / 0
except ZeroDivisionError:
    logging.error("除以零的错误", exc_info=True)

10. 高级用法

  • 多进程安全:

Python 的 logging 模块支持多进程环境中的日志记录,可以通过 logging.handlers.QueueHandlerlogging.handlers.QueueListener 来实现日志记录的进程安全。

  • 多线程安全:

logging 模块本身是线程安全的,适合在多线程应用中使用。

  • 性能优化:

如果日志记录量大,可以使用 NullHandler 关闭不必要的日志输出,或使用高效的日志记录方法。

总结

logging 模块是 Python 强大而灵活的日志记录系统。通过 LoggerHandlerFormatterFilter 等组件,你可以非常细致地控制日志的生成、格式化、输出和过滤。这使得它成为开发和调试复杂应用程序时不可或缺的工具。