【ChatGPT系列】Python自定义打印各种颜色的日志

[本文出自天外归云的博客园]

如何在控制台和文件中同时输出日志?

要将日志同时输出到文件和控制台,可以创建并配置一个额外的 StreamHandler,然后将其添加到 Logger 中。下面是一个示例代码,演示如何将日志同时输出到文件和控制台:

import logging

# 创建 Logger 对象
logger = logging.getLogger("example_logger")
logger.setLevel(logging.DEBUG)

# 创建 FileHandler 并设置 Formatter
file_formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s", "%Y-%m-%d %H:%M:%S")
file_handler = logging.FileHandler("example.log")
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(file_formatter)

# 创建 StreamHandler 并设置 Formatter
console_formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s", "%Y-%m-%d %H:%M:%S")
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
console_handler.setFormatter(console_formatter)

# 将 FileHandler 和 StreamHandler 添加到 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.")

在上述示例中,我们创建了一个名为 `console_handler` 的 StreamHandler,并设置了适当的 Formatter。然后,我们将 `console_handler` 添加到 Logger 中,以便将日志记录发送到控制台。

这样设置后,日志消息将同时输出到文件(使用 FileHandler)和控制台(使用 StreamHandler)。

你可以根据自己的需求自定义日志处理程序的级别和格式。例如,可以使用 `console_handler.setLevel(logging.DEBUG)` 设置控制台的日志级别为 DEBUG,以确保所有级别的日志消息都输出到控制台。

如何让这五种level的日志显示不同的颜色?

要为不同级别的日志消息添加不同的颜色,可以使用 `logging` 模块的 `addHandler()` 方法添加一个自定义的处理程序,该处理程序将根据日志级别为消息选择不同的颜色。下面是一个示例代码,演示如何为不同级别的日志消息设置不同的颜色:

import logging
import sys


# 自定义处理程序,根据日志级别选择不同的颜色
class ColoredHandler(logging.StreamHandler):
  def emit(self, record):
    # 定义不同级别的颜色代码
    colors = {
        logging.DEBUG: '\033[94m', # 蓝色
        logging.INFO: '\033[92m', # 绿色
        logging.WARNING: '\033[93m', # 黄色
        logging.ERROR: '\033[91m', # 红色
        logging.CRITICAL: '\033[95m' # 紫色
    }

# 重置终端颜色代码
reset_color = '\033[0m'

# 获取日志级别对应的颜色代码
color = colors.get(record.levelno, '')

# 格式化消息并输出到控制台
self.stream.write(color + self.format(record) + reset_color + '\n')


# 创建 Logger 对象
logger = logging.getLogger("example_logger")
logger.setLevel(logging.DEBUG)

# 创建自定义处理程序并设置格式
handler = ColoredHandler(sys.stdout)
formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s", "%Y-%m-%d %H:%M:%S")
handler.setFormatter(formatter)

# 将处理程序添加到 Logger
logger.addHandler(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.")

在上述示例中,我们创建了一个自定义的 `ColoredHandler` 类,继承自 `StreamHandler`。在 `ColoredHandler` 中,我们重写了 `emit()` 方法,根据日志级别选择相应的颜色代码,并将格式化后的消息输出到控制台。

我们定义了一个 `colors` 字典,将不同级别的日志与相应的颜色代码关联起来。然后,我们在 `emit()` 方法中根据日志记录的级别获取相应的颜色代码,并将其应用于输出的消息。

在示例中,我们使用蓝色、绿色、黄色、红色和紫色分别表示 DEBUG、INFO、WARNING、ERROR 和 CRITICAL 级别的日志消息。

运行示例代码后,不同级别的日志消息将以不同的颜色显示在控制台上。请确保你的终端支持 ANSI 转义序列,以正确显示颜色。

posted @ 2023-09-05 16:50  天外归云  阅读(80)  评论(0编辑  收藏  举报