Python 日志操作

在软件开发中,日志是一项重要的功能。它可以帮助开发人员记录应用程序的运行情况、错误和异常信息,以便于调试和监控。Python 提供了强大的日志操作模块 logging,它可以让我们方便地在应用程序中添加日志功能。

logging 基本用法

要使用 logging 模块,首先需要导入:

import logging

然后,我们可以通过配置 logging 来确定日志输出的方式和级别。常见的日志级别包括 DEBUGINFOWARNINGERRORCRITICAL,级别逐渐提高,DEBUG 是最低级别,CRITICAL 是最高级别。默认情况下,日志级别为 WARNING,即只会输出 WARNING 级别及以上的日志。

下面是一个简单的例子,展示了如何使用 logging 输出日志:

import logging

logging.basicConfig(level=logging.DEBUG, 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')

运行上面的代码,输出结果如下:

2022-01-01 00:00:00,000 - DEBUG - This is a debug message
2022-01-01 00:00:00,000 - INFO - This is an info message
2022-01-01 00:00:00,000 - WARNING - This is a warning message
2022-01-01 00:00:00,000 - ERROR - This is an error message
2022-01-01 00:00:00,000 - CRITICAL - This is a critical message

日志输出到文件

除了输出到控制台,logging 还支持将日志输出到文件。我们可以通过指定 filename 参数来实现,如下所示:

import logging

logging.basicConfig(filename='app.log', level=logging.DEBUG, 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')

运行上面的代码后,会生成一个名为 app.log 的日志文件,并将日志内容写入其中。

高级配置

除了上述基本用法,logging 模块还提供了丰富的配置选项来满足不同的需求。我们可以自定义日志输出格式、日志轮转(即按照一定的规则切分日志文件)、设置日志处理器等。

下面是一个更加复杂的示例,展示了如何使用 logging 模块的高级配置:

import logging
from logging.handlers import RotatingFileHandler

# 创建一个 logger 实例
logger = logging.getLogger('my_logger')

# 设置日志级别为 DEBUG
logger.setLevel(logging.DEBUG)

# 创建一个文件处理器,将日志写入 my_app.log 文件中,同时按照 10MB 的大小进行轮转
file_handler = RotatingFileHandler('my_app.log', maxBytes=10*1024*1024, backupCount=5)

# 创建一个控制台处理器,将日志输出到控制台
console_handler = logging.StreamHandler()

# 设置日志格式
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)

# 将处理器添加到 logger 实例中
logger.addHandler(file_handler)
logger.addHandler(console_handler)

# 输出日志
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')

运行上面的代码,会将日志同时输出到控制台和 my_app.log 文件中。

类图

下面是 logging 模块的类图:

classDiagram
    class logging.Logger
    class logging.Handler
    class logging.Formatter
    class logging.Filter
    class logging.StreamHandler
    class logging.FileHandler
    class logging.RotatingFileHandler
    class logging.SocketHandler
    class logging.SysLogHandler
    class logging.NullHandler
    
    logging.Logger "1" -- "0..*" logging.Handler
    logging.Handler