日志记录器示例#

日志记录#

Python 日志记录模块 [1] 是一个强大且灵活的工具,用于调试和跟踪。 AdalFlow 使用原生日志记录模块作为 第一道防线

设计#

一些库可能会使用钩子[2]和回调[3] [4],或者高级的基于网络的调试工具[5] [6] [7]。 钩子和回调在概念上是相似的,因为它们都允许用户在程序执行的特定点执行自定义代码。 两者都提供了在不修改核心逻辑的情况下,响应某些事件或条件注入额外行为的机制。 PyTorch主要在nn.ModuleTensor等基类中定义、注册和执行钩子,而不会污染功能和面向用户的API。

此时,我们的目标是:

  1. 通过简单的日志记录模块最大化调试能力,以保持源代码的清洁。

  2. 此外,由于我们无法总是控制生成器的输出,我们将为它们提供定制的日志记录器和追踪器(即插即用的装饰器),我们将在追踪中对此进行解释。这不会破坏第一个目标。

未来,当用户有更复杂的需求时,我们会考虑添加钩子/回调,但我们会以一种保持功能和面向用户的API简洁的方式来实现。

在每个文件中,我们只需使用以下代码设置记录器:

import logging

log = logging.getLogger(__name__)

然后我们使用log并决定在每个函数中使用哪种日志级别。 以下是Generator的日志记录方式。

我们提供了一个简单的函数 get_logger 来帮助用户设置具有良好默认格式和处理程序的日志记录器。 获取日志记录器并查看库日志的最简单方法是调用此函数:

from adalflow.utils.logger import get_logger


root_logger = get_logger()

以下是用户在设置日志记录器后运行生成器时打印的日志消息示例:

2024-07-05 18:49:39 - generator - INFO - [generator.py:249:call] - output: GeneratorOutput(data="Hello! I'm just a computer program, so I don't have feelings, but I'm here and ready to help you. How can I assist you today?", error=None, usage=None, raw_response="Hello! I'm just a computer program, so I don't have feelings, but I'm here and ready to help you. How can I assist you today?", metadata=None)

提供了一个简洁的小函数 printc 用于在控制台打印彩色文本。 它的格式与日志记录器类似。 以下是如何使用它的示例:

from adalflow.utils.logger import printc

printc("All logging examples are done. Feeling green!", color="green")

输出将是:

2024-07-05 22:25:43 - [logging_config.py:98:<module>] - All logging examples are done. Feeling green!

在项目中使用Logger#

在你的项目中有两种不同的方式来设置日志记录:

  1. 将库日志和应用程序日志记录在同一个文件中。这是最简单的设置。

  2. 使用根日志记录器和命名日志记录器分别记录库日志和应用程序日志。

假设你的源代码位于 src/task.py。你可以简单地通过以下方式记录日志:

import logging

log = logging.getLogger(__name__)

class Task:
    def __init__(self):
        log.info("This is a user program child logger")

在主文件中,您可以配置一个单一的根记录器来记录库和应用程序的日志:

import logging
from adalflow.utils.logger import get_logger

root_logger = get_logger(level="DEBUG", save_dir="./logs") # log to ./logs/lib.log

# run code from the library components such as generator
# ....

root_logger.info("This is the log in the main file")

这样,所有的日志都将保存在./logs/lib.log中。

在某些情况下,如果用户希望将库日志和应用程序日志分开,他们可以使用一个命名的日志记录器。

在用户程序中,例如在src/task.py,您可以设置一个命名的日志记录器并将日志记录到./logs/my_app.log

from adalflow.utils.logger import get_logger

app_logger = get_logger(name="my_app", level="DEBUG", save_dir="./logs") # log to ./logs/my_app.log

class Task:
    def __init__(self):
        app_logger.info("This is a user program child logger")

区别在于你已经将处理程序附加到了app_logger。 在主文件中,你不需要设置根记录器来启用应用程序日志。 但是,如果需要,你仍然可以设置根记录器来单独记录库日志,并创建另一个命名记录器以继续在主文件中记录日志。