python教程:python中的日志及其案例

在 Python 中,日志打印是通过内置的 logging 模块实现的。logging 模块提供了灵活的日志记录功能,允许你记录程序的运行信息,并根据不同的严重级别(如调试信息、警告、错误等)进行分类。相比于简单的 print(),使用 logging 模块更适合在生产环境中记录调试信息、错误信息和程序的执行流程。

logging 模块的优势

  1. 不同级别的日志:可以记录不同严重级别的信息(调试、信息、警告、错误等)。
  2. 日志输出的灵活性:可以将日志输出到控制台、文件,甚至远程服务器。
  3. 日志格式化:可以自定义日志输出的格式,包括时间戳、日志级别、日志消息等。
  4. 日志过滤和路由:可以基于条件过滤日志,并将日志路由到不同的目的地。

日志的级别

logging 模块定义了 5 个标准的日志级别,每个级别表示日志的严重性,依次是:

  1. DEBUG:调试信息,详细的信息,通常只在诊断问题时使用。
  2. INFO:普通信息,确认程序按预期工作。
  3. WARNING:警告信息,表示某些不影响程序运行但需要注意的事件。
  4. ERROR:错误信息,表示由于更严重的问题,程序已不能执行某些功能。
  5. CRITICAL:严重错误,程序无法继续运行。

日志打印的基本示例

示例:使用 logging 输出日志到控制台
import logging

# 配置日志的基本设置
logging.basicConfig(level=logging.DEBUG,  # 设置日志级别为 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")

输出:

2024-10-16 12:34:56,123 - DEBUG - This is a debug message
2024-10-16 12:34:56,124 - INFO - This is an info message
2024-10-16 12:34:56,125 - WARNING - This is a warning message
2024-10-16 12:34:56,126 - ERROR - This is an error message
2024-10-16 12:34:56,127 - CRITICAL - This is a critical message
解释:
  • logging.basicConfig() 用于配置日志系统,包括日志级别和输出格式。
  • level=logging.DEBUG 设置最低日志级别为 DEBUG,这样所有级别的日志都会被记录。
  • format='%(asctime)s - %(levelname)s - %(message)s' 设置日志的输出格式,包含时间戳、日志级别和日志消息。

日志输出到文件

可以将日志输出到文件,而不是控制台。通过配置 logging.basicConfig(),我们可以指定文件名以及日志的写入模式。

示例:将日志写入文件
import logging

# 配置日志输出到文件
logging.basicConfig(filename='app.log',  # 指定日志文件
                    level=logging.INFO,  # 设置日志级别为 INFO
                    format='%(asctime)s - %(levelname)s - %(message)s')

# 记录日志
logging.info("Application started")
logging.warning("An example warning")
logging.error("An error occurred")

结果
日志会被写入到 app.log 文件,内容类似如下:

2024-10-16 12:45:56,123 - INFO - Application started
2024-10-16 12:45:57,124 - WARNING - An example warning
2024-10-16 12:45:58,125 - ERROR - An error occurred
解释:
  • filename='app.log' 指定日志文件的路径。日志信息将被写入该文件中。
  • logging.INFO 只记录 INFO 及以上级别的日志信息,DEBUG 级别的信息将不会被记录。

自定义日志格式

可以通过 format 参数来自定义日志的输出格式。常用的格式化参数有:

  • %(asctime)s:日志事件的时间。
  • %(levelname)s:日志的级别。
  • %(message)s:日志的消息内容。
  • %(filename)s:日志记录的模块的文件名。
  • %(lineno)d:日志记录的行号。
示例:自定义日志格式
import logging

# 配置日志的自定义格式
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s - %(name)s - %(levelname)s - [Line %(lineno)d]: %(message)s')

logging.debug("This is a debug message with custom format")

输出:

2024-10-16 12:55:56,123 - root - DEBUG - [Line 5]: This is a debug message with custom format
解释:
  • %(name)s:显示记录日志的 logger 名字,这里默认是 root
  • %(lineno)d:显示日志语句所在的行号。

使用多个日志处理器(Handler)

在复杂应用中,可能需要同时将日志输出到不同的地方(如文件、控制台、远程服务器)。可以通过日志处理器Handler)实现。例如,既将日志输出到控制台,又将其保存到文件。

示例:同时将日志输出到控制台和文件
import logging

# 创建日志器
logger = logging.getLogger("MyLogger")
logger.setLevel(logging.DEBUG)

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

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

# 创建格式化器
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.warning("This is a warning message") # 输出到控制台和文件
logger.error("This is an error message")   # 输出到控制台和文件

解释:

  • logger = logging.getLogger("MyLogger"):创建了一个名为 MyLogger 的日志器。
  • StreamHandler():将日志输出到控制台。
  • FileHandler("app.log"):将日志输出到文件 app.log
  • formatter:自定义日志的输出格式。
  • logger.addHandler():为日志器添加处理器。

捕获异常信息并记录日志

在捕获异常时,使用 logging 记录异常信息,而不是简单地 print() 输出,有助于更好地调试和诊断问题。

示例:记录异常信息
import logging

logging.basicConfig(filename='error.log', level=logging.ERROR)

try:
    result = 10 / 0
except ZeroDivisionError as e:
    logging.error("Exception occurred", exc_info=True)

结果
错误信息会记录到 error.log 文件中,包含详细的异常堆栈信息:

扫描二维码关注公众号,回复: 17454741 查看本文章
2024-10-16 13:05:56,123 - ERROR - Exception occurred
Traceback (most recent call last):
  File "example.py", line 5, in <module>
    result = 10 / 0
ZeroDivisionError: division by zero
解释:
  • exc_info=True:在捕获异常时,设置此参数为 True,可以将异常的堆栈信息记录到日志中。

日志过滤器(Filter)

过滤器允许你根据条件筛选日志消息,只有满足特定条件的日志才会被处理。

示例:日志过滤器
import logging

class MyFilter(logging.Filter):
    def filter(self, record):
        # 仅允许记录包含 "important" 的消息
        return "important" in record.msg

logger = logging.getLogger("MyLogger")
logger.setLevel(logging.DEBUG)

# 创建控制台处理器
console_handler = logging.StreamHandler()

# 添加自定义过滤器
console_handler.addFilter(MyFilter())

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

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

# 测试日志输出


logger.debug("This is an important debug message")
logger.info("This is a regular info message")

输出:

2024-10-16 13:15:56,123 - DEBUG - This is an important debug message

解释:

  • MyFilter 类通过 filter() 方法筛选消息,只有包含 "important" 的消息才会被记录。

总结

  • 日志级别:通过 logging 模块可以记录不同级别的日志,包括 DEBUGINFOWARNINGERRORCRITICAL
  • 输出到不同的目标:日志可以输出到控制台、文件或其他目标,使用 Handler 来控制输出位置。
  • 自定义格式:可以通过 Formatter 自定义日志的输出格式,包含时间、日志级别、消息等信息。
  • 捕获异常:可以使用 exc_info=True 在日志中捕获详细的异常信息。
  • 日志过滤:可以通过 Filter 筛选符合条件的日志信息。

使用 logging 模块能够帮助开发者记录调试信息、监控应用状态、排查错误,在开发和生产环境中都非常有用。

猜你喜欢

转载自blog.csdn.net/sunyuhua_keyboard/article/details/142981630