Quantcast
Channel: 小蓝博客
Viewing all articles
Browse latest Browse all 3155

【python】Python中的日志模块logging使用技巧与应用实战

$
0
0

Python 中的日志模块 logging 使用技巧与应用实战

Python 提供了内置的日志模块 logging,它是一个功能强大的日志管理工具,适用于各种规模的项目。通过使用 logging 模块,开发者可以记录调试信息、错误信息、程序运行状态等内容,并将日志输出到控制台、文件或远程服务器。本文将深入探讨 logging 模块的使用技巧及应用实战。

一、logging 模块的基础使用

1.1 基本用法

logging 模块的基本用法相对简单,开发者可以通过 logging.basicConfig 方法进行配置,然后使用不同的日志级别来记录信息。

import logging

# 配置日志输出格式和级别
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# 记录不同级别的日志
logging.debug("This is a debug message")
logging.info("This is an info message")
logging.warning("This is a warning message")
logging.error("This is an error message")
logging.critical("This is a critical message")

解释

  • basicConfig:用于一次性配置日志的基本设置。包括日志的输出级别、格式、输出位置等。
  • 日志级别:DEBUGINFOWARNINGERRORCRITICAL,它们表示日志的不同严重性。默认情况下,只有日志级别大于等于配置的级别才会输出。

1.2 自定义日志格式

开发者可以通过 format 参数来自定义日志的输出格式。常见的日志格式字段包括:

  • %(asctime)s:输出当前时间。
  • %(levelname)s:输出日志级别。
  • %(message)s:输出日志信息。
  • %(filename)s:输出日志所在的文件名。
  • %(lineno)d:输出日志所在的行号。

示例:

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

这将输出包含时间、日志器名称、日志级别和消息内容的日志记录。

二、高级使用技巧

2.1 日志器、处理器和格式器

logging 模块基于模块化设计,主要由三个核心组件组成:Logger(日志器)、Handler(处理器)和 Formatter(格式器)。这些组件可以组合使用,以实现更为复杂的日志管理需求。

  • Logger:日志器用于创建日志记录的入口点。通过 getLogger 方法可以创建或获取一个日志器实例。
  • Handler:处理器用于定义日志的输出位置,如控制台、文件或远程服务器。
  • Formatter:格式器用于定义日志记录的格式。

示例:

import logging

# 创建日志器
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)

# 创建控制台处理器并设置日志级别
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)

# 创建文件处理器并设置日志级别
file_handler = logging.FileHandler('app.log')
file_handler.setLevel(logging.ERROR)

# 创建格式器并添加到处理器
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)

# 将处理器添加到日志器
logger.addHandler(console_handler)
logger.addHandler(file_handler)

# 记录日志
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.error('This is an error message')

解释

  • getLogger('my_logger'):创建一个名为 my_logger 的日志器。
  • StreamHandler:将日志输出到控制台。
  • FileHandler:将日志输出到文件 app.log
  • setFormatter:为处理器设置日志格式。

通过这种方式,开发者可以同时将日志输出到多个位置,并为不同的处理器设置不同的日志级别和格式。

2.2 日志的按大小轮转与按时间轮转

对于长期运行的服务应用,日志文件可能会不断增长,导致磁盘空间消耗过多。此时可以使用日志的轮转功能来控制日志文件的大小或数量。logging.handlers 模块提供了两种常见的日志轮转方式:按文件大小轮转(RotatingFileHandler)和按时间轮转(TimedRotatingFileHandler)。

  • 按大小轮转
from logging.handlers import RotatingFileHandler

rotating_handler = RotatingFileHandler('app.log', maxBytes=2000, backupCount=5)
rotating_handler.setLevel(logging.INFO)
rotating_handler.setFormatter(formatter)
logger.addHandler(rotating_handler)

解释

  • maxBytes=2000:当日志文件大小超过 2000 字节时触发轮转。
  • backupCount=5:最多保留 5 个旧日志文件。
  • 按时间轮转
from logging.handlers import TimedRotatingFileHandler

timed_handler = TimedRotatingFileHandler('app.log', when='midnight', interval=1, backupCount=7)
timed_handler.setLevel(logging.INFO)
timed_handler.setFormatter(formatter)
logger.addHandler(timed_handler)

解释

  • when='midnight':每天午夜时刻触发轮转。
  • interval=1:表示每 1 个单位的时间间隔触发轮转。
  • backupCount=7:保留最近 7 天的日志文件。

2.3 异常信息记录

在捕获异常时,可以通过 logging 模块记录详细的异常信息(包括堆栈跟踪信息),而不是简单的错误消息。这可以帮助开发者更快地定位问题。

try:
    1 / 0
except ZeroDivisionError:
    logger.exception("An error occurred")

解释

  • logger.exception:自动捕获异常信息并记录堆栈跟踪,日志级别为 ERROR

三、应用实战:结合配置文件使用 logging

在复杂项目中,手动配置日志器的方式可能显得冗长且不易管理。此时可以通过配置文件来配置 logging,这使得日志配置更加灵活和模块化。

3.1 使用字典配置

Python logging 模块支持通过字典来配置日志系统。以下是一个简单的字典配置示例:

import logging
import logging.config

log_config = {
    'version': 1,
    'formatters': {
        'simple': {
            'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
        },
    },
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'level': 'INFO',
            'formatter': 'simple',
        },
        'file': {
            'class': 'logging.FileHandler',
            'level': 'ERROR',
            'formatter': 'simple',
            'filename': 'app.log',
        },
    },
    'loggers': {
        'my_logger': {
            'handlers': ['console', 'file'],
            'level': 'DEBUG',
            'propagate': False,
        },
    },
}

logging.config.dictConfig(log_config)
logger = logging.getLogger('my_logger')

logger.info("This is an info message")
logger.error("This is an error message")

解释

  • logging.config.dictConfig:通过字典配置日志系统。
  • handlers:定义了控制台输出和文件输出的处理器。
  • loggers:定义了一个名为 my_logger 的日志器,绑定到控制台和文件处理器。

3.2 使用配置文件

另一种常见方式是将日志配置放到一个独立的配置文件中(如 logging.conf),并使用 fileConfig 进行加载。

logging.conf 示例:

[loggers]
keys=root,my_logger

[handlers]
keys=consoleHandler,fileHandler

[formatters]
keys=simpleFormatter

[logger_root]
level=DEBUG
handlers=consoleHandler

[logger_my_logger]
level=DEBUG
handlers=consoleHandler,fileHandler
qualname=my_logger
propagate=0

[handler_consoleHandler]
class=StreamHandler
level=INFO
formatter=simpleFormatter
args=(sys.stdout,)

[handler_fileHandler]
class=FileHandler
level=ERROR
formatter=simpleFormatter
args=('app.log', 'a')

[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s

使用 fileConfig 加载配置:

import logging
import logging.config

logging.config.fileConfig('logging.conf')
logger = logging.getLogger('my_logger')

logger.info("This is an info message")
logger.error("This is an error message")

解释

  • fileConfig:从配置文件加载日志配置。
  • 配置文件中定义了日志器、

处理器和格式器等,便于集中管理日志配置。

四、思维导图

Python logging 模块使用技巧与应用实战
    1. 基本使用
        1.1 基本用法
        1.2 自定义日志格式
    2. 高级技巧
        2.1 日志器、处理器、格式器
        2.2 按大小轮转与按时间轮转
        2.3 异常信息记录
    3. 应用实战
        3.1 字典配置
        3.2 配置文件

五、总结

Python 的 logging 模块是一个功能强大且灵活的日志记录工具,能够满足各种复杂场景的日志需求。通过学习 LoggerHandlerFormatter 的使用技巧,以及结合轮转机制和配置文件的灵活配置,开发者可以在项目中实现高效、可维护的日志系统,从而提升调试效率和系统监控能力。


Viewing all articles
Browse latest Browse all 3155

Trending Articles