Protokollierung#

AutoGen verwendet das integrierte logging Modul von Python.

Es gibt zwei Arten von Logging

  • Trace Logging: Dies wird zur Fehlersuche verwendet und sind menschenlesbare Meldungen, die anzeigen, was gerade geschieht. Dies ist für einen Entwickler gedacht, um zu verstehen, was im Code vor sich geht. Der Inhalt und das Format dieser Logs sollten nicht von anderen Systemen abhängen.

  • Structured Logging: Dieser Logger gibt strukturierte Ereignisse aus, die von anderen Systemen verarbeitet werden können. Der Inhalt und das Format dieser Logs können von anderen Systemen abhängen.

  • ROOT_LOGGER_NAME kann verwendet werden, um alle Logs zu aktivieren oder zu deaktivieren.

Logging-Ausgabe aktivieren#

Um Trace-Logging zu aktivieren, können Sie den folgenden Code verwenden

import logging

from autogen_core import TRACE_LOGGER_NAME

logging.basicConfig(level=logging.WARNING)
logger = logging.getLogger(TRACE_LOGGER_NAME)
logger.addHandler(logging.StreamHandler())
logger.setLevel(logging.DEBUG)

Um strukturiertes Logging zu aktivieren, können Sie den folgenden Code verwenden

import logging

from autogen_core import EVENT_LOGGER_NAME

logging.basicConfig(level=logging.WARNING)
logger = logging.getLogger(EVENT_LOGGER_NAME)
logger.addHandler(logging.StreamHandler())
logger.setLevel(logging.INFO)

Strukturiertes Logging#

Strukturiertes Logging ermöglicht es Ihnen, Logik zu schreiben, die sich mit den tatsächlichen Ereignissen einschließlich aller Felder befasst, anstatt nur mit einer formatierten Zeichenkette.

Zum Beispiel, wenn Sie dieses benutzerdefinierte Ereignis definiert und ausgegeben hätten. Dann könnten Sie den folgenden Handler schreiben, um es zu empfangen.

import logging
from dataclasses import dataclass

@dataclass
class MyEvent:
    timestamp: str
    message: str

class MyHandler(logging.Handler):
    def __init__(self) -> None:
        super().__init__()

    def emit(self, record: logging.LogRecord) -> None:
        try:
            # Use the StructuredMessage if the message is an instance of it
            if isinstance(record.msg, MyEvent):
                print(f"Timestamp: {record.msg.timestamp}, Message: {record.msg.message}")
        except Exception:
            self.handleError(record)

Und so könnten Sie es verwenden

logger = logging.getLogger(EVENT_LOGGER_NAME)
logger.setLevel(logging.INFO)
my_handler = MyHandler()
logger.handlers = [my_handler]

Logs ausgeben#

Diese beiden Namen sind die Root-Logger für diese Typen. Code, der Logs ausgibt, sollte einen Kind-Logger dieser Logger verwenden. Zum Beispiel, wenn Sie ein Modul my_module schreiben und Trace-Logs ausgeben möchten, sollten Sie den Logger namens verwenden

import logging

from autogen_core import TRACE_LOGGER_NAME
logger = logging.getLogger(f"{TRACE_LOGGER_NAME}.my_module")

Strukturierte Logs ausgeben#

Wenn Ihr Ereignis eine Dataclass ist, könnte es im Code wie folgt ausgegeben werden

import logging
from dataclasses import dataclass
from autogen_core import EVENT_LOGGER_NAME

@dataclass
class MyEvent:
    timestamp: str
    message: str

logger = logging.getLogger(EVENT_LOGGER_NAME + ".my_module")
logger.info(MyEvent("timestamp", "message"))