欢迎访问宙启技术站
智能推送

如何在Python中使用logging模块进行日志记录?

发布时间:2023-06-15 13:13:04

Python的logging模块提供了一种有效的方式来记录Python应用程序的日志消息。它包括了灵活的配置选项以及可定制的日志消息格式。本文将介绍如何在Python程序中使用logging模块进行日志记录。

1. 导入logging模块

要在Python程序中使用logging模块,需要先导入logging模块。在Python程序中可以使用以下语句导入logging模块:

import logging

2. 配置logging模块

在使用logging模块之前,需要进行配置以确定日志消息的输出方式,包括日志消息的级别和输出位置等。可以使用以下代码块进行基本的日志配置:

import logging

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

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')

上述代码块实现的日志记录包括如下步骤:

- 第一行导入logging模块。

- 第二行使用basicConfig()方法为日志记录提供基本配置,其中包括输出的级别,日志消息的格式,输出到的文件名,日志文件打开方式等参数。

- 接下来的五行是记录不同级别的日志消息,包括debug、info、warning、error和critical级别的消息。

3. 日志级别

logging模块支持五个不同级别的日志消息:debug、info、warning、error和critical。这些级别按照严重程度递增排列,即debug的级别最低,而critical的级别最高。在设置日志级别时,可通过basicConfig()方法中的level参数设置,如:basicConfig(level=logging.DEBUG)设置日志输出级别为debug,而logging.basicConfig(level=logging.WARNING)则将日志输出级别设置为warning,即只输出warning和以上级别的日志信息。

4. 日志消息的格式

设置日志消息的格式是logging模块一个非常重要的功能。可以使用basicConfig()方法的format参数设置消息的格式,如:basicConfig(format='%(asctime)s %(levelname)s %(message)s')表示输出日志信息中包含日期、级别和具体信息。常用的格式化占位符有如下几种:

- %(asctime)s:输出日志信息的时间。

- %(levelname)s:输出日志级别的名称。

- %(message)s:输出日志信息的具体内容。

除上述三个常用占位符外,还有很多其他占位符,可以根据具体需要进行使用。

5. 输出到控制台

在基本的配置中,可以通过设置filename参数来指定输出位置,从而将日志输出到指定文件中。如果要将日志输出到控制台,则需要使用StreamHandler类,代码如下:

import logging

console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
console_handler.setFormatter(formatter)

logger = logging.getLogger()
logger.addHandler(console_handler)

logger.info('This is an info message')

上述代码块实现了如下功能:

- 第一行import logging 导入logging模块。

- 第二行创建一个StreamHandler对象,可以将日志信息输出到终端。

- 第三行设置StreamHandler日志级别为DEBUG。

- 第四行设置日志消息的格式。

- 第五行为console_handler对象设置格式化器。

- 第七行创建logger对象。

- 第八行将console_handler添加到logger对象中。

- 第十行使用logger对象记录日志信息。

这将在控制台上输出如下信息:

2022-03-28 18:06:16,133 INFO This is an info message

6. 使用日志回滚

如果日志记录太多,导致存储空间爆满,需要清除旧日志信息,这时需要使用日志回滚机制。日志回滚可以在达到日志大小或保留时间时清除旧日志信息。如下所示:

import logging
import logging.handlers

handler = logging.handlers.RotatingFileHandler('example.log', maxBytes=1024, backupCount=5)
handler.setLevel(logging.DEBUG)

logger = logging.getLogger()
logger.addHandler(handler)

for i in range(10):
    logger.info(str(i))

上述代码块记录了10次日志信息,每当达到1KB时,则清除旧日志。这使得日志文件大小保持在1KB以下。使用maxBytes和backupCount参数来指定属性的大小和最大文件数量,以回滚日志。

7. 记录异常信息

在Python中,可以使用logging模块记录异常信息。要记录异常信息,需要使用exception()方法。例如:

import logging

try:
    a = 1 / 0
except Exception as e:
    logging.exception("Exception occurred")

上述代码块中,try块中运行代码将产生异常。然后,使用logging.exception()记录异常信息。该方法将默认记录异常类型和堆栈跟踪信息。异常信息将记录为日志文件中的高级消息。

8. 自定义日志类

如果需要添加其他内容到日志信息中,可以通过定义自定义日志类进行扩展。在logging模块的基础上,创建一个名为MyLogger的自定义类,用于添加用户自定义信息到日志信息中,如下所示:

import logging

class MyLogger(logging.Logger):
    def log(self, lvl, msg, *args, **kwargs):
        if isinstance(msg, str):
            prefix = "CustomLog: "
            msg = prefix + msg
        super().log(lvl, msg, *args, **kwargs)

logger = MyLogger('my_logger')
logger.setLevel(logging.INFO)

handler = logging.StreamHandler()
handler.setLevel(logging.INFO)

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)

logger.addHandler(handler)

logger.info('This is an info message')

上述代码中,使用log()方法定义一个名为"CustomLog: "的前缀,并将其添加到日志消息之前。然后创建一个日志对象,并将其命名为"my_logger"。这将在控制台上输出如下消息:

2022-03-28 17:55:06,063 - my_logger - INFO - CustomLog: This is an info message

总结:

在Python中使用logging模块,可以很容易地记录应用程序的日志消息,并且日志记录可以根据需要进行配置。通过基本的配置,可以设定消息级别、格式、输出位置、日志回滚等功能,同时也可以自定义日志类来记录应用程序特定的日志信息。此外,该模块还提供了一些特殊的功能,例如记录异常信息。因此,在开发Python应用程序时,使用logging模块来管理和记录日志消息是一个非常好的选择。