diff options
Diffstat (limited to 'autogpt/logs/logger.py')
-rw-r--r-- | autogpt/logs/logger.py | 203 |
1 files changed, 0 insertions, 203 deletions
diff --git a/autogpt/logs/logger.py b/autogpt/logs/logger.py deleted file mode 100644 index e4cedc366..000000000 --- a/autogpt/logs/logger.py +++ /dev/null @@ -1,203 +0,0 @@ -"""Logging module for Auto-GPT.""" -from __future__ import annotations - -import logging -import os -from typing import TYPE_CHECKING, Any, Optional - -from colorama import Fore - -if TYPE_CHECKING: - from autogpt.config import Config - -from autogpt.singleton import Singleton - -from .formatters import AutoGptFormatter, JsonFormatter -from .handlers import ConsoleHandler, JsonFileHandler, TypingConsoleHandler - - -class Logger(metaclass=Singleton): - """ - Logger that handle titles in different colors. - Outputs logs in console, activity.log, and errors.log - For console handler: simulates typing - """ - - def __init__(self): - # create log directory if it doesn't exist - this_files_dir_path = os.path.dirname(__file__) - log_dir = os.path.join(this_files_dir_path, "../logs") - if not os.path.exists(log_dir): - os.makedirs(log_dir) - - log_file = "activity.log" - error_file = "error.log" - - console_formatter = AutoGptFormatter("%(title_color)s %(message)s") - - # Create a handler for console which simulate typing - self.typing_console_handler = TypingConsoleHandler() - self.typing_console_handler.setLevel(logging.INFO) - self.typing_console_handler.setFormatter(console_formatter) - - # Create a handler for console without typing simulation - self.console_handler = ConsoleHandler() - self.console_handler.setLevel(logging.DEBUG) - self.console_handler.setFormatter(console_formatter) - - # Info handler in activity.log - self.file_handler = logging.FileHandler( - os.path.join(log_dir, log_file), "a", "utf-8" - ) - self.file_handler.setLevel(logging.DEBUG) - info_formatter = AutoGptFormatter( - "%(asctime)s %(levelname)s %(title)s %(message_no_color)s" - ) - self.file_handler.setFormatter(info_formatter) - - # Error handler error.log - error_handler = logging.FileHandler( - os.path.join(log_dir, error_file), "a", "utf-8" - ) - error_handler.setLevel(logging.ERROR) - error_formatter = AutoGptFormatter( - "%(asctime)s %(levelname)s %(module)s:%(funcName)s:%(lineno)d %(title)s" - " %(message_no_color)s" - ) - error_handler.setFormatter(error_formatter) - - self.typing_logger = logging.getLogger("TYPER") - self.typing_logger.addHandler(self.typing_console_handler) - self.typing_logger.addHandler(self.file_handler) - self.typing_logger.addHandler(error_handler) - self.typing_logger.setLevel(logging.DEBUG) - - self.logger = logging.getLogger("LOGGER") - self.logger.addHandler(self.console_handler) - self.logger.addHandler(self.file_handler) - self.logger.addHandler(error_handler) - self.logger.setLevel(logging.DEBUG) - - self.json_logger = logging.getLogger("JSON_LOGGER") - self.json_logger.addHandler(self.file_handler) - self.json_logger.addHandler(error_handler) - self.json_logger.setLevel(logging.DEBUG) - - self._config: Optional[Config] = None - self.chat_plugins = [] - - @property - def config(self) -> Config | None: - return self._config - - @config.setter - def config(self, config: Config): - self._config = config - if config.plain_output: - self.typing_logger.removeHandler(self.typing_console_handler) - self.typing_logger.addHandler(self.console_handler) - - def typewriter_log( - self, - title: str = "", - title_color: str = "", - content: str = "", - speak_text: bool = False, - level: int = logging.INFO, - ) -> None: - from autogpt.speech import say_text - - if speak_text and self.config and self.config.speak_mode: - say_text(f"{title}. {content}", self.config) - - for plugin in self.chat_plugins: - plugin.report(f"{title}. {content}") - - if content: - if isinstance(content, list): - content = " ".join(content) - else: - content = "" - - self.typing_logger.log( - level, content, extra={"title": title, "color": title_color} - ) - - def debug( - self, - message: str, - title: str = "", - title_color: str = "", - ) -> None: - self._log(title, title_color, message, logging.DEBUG) - - def info( - self, - message: str, - title: str = "", - title_color: str = "", - ) -> None: - self._log(title, title_color, message, logging.INFO) - - def warn( - self, - message: str, - title: str = "", - title_color: str = "", - ) -> None: - self._log(title, title_color, message, logging.WARN) - - def error(self, title: str, message: str = "") -> None: - self._log(title, Fore.RED, message, logging.ERROR) - - def _log( - self, - title: str = "", - title_color: str = "", - message: str = "", - level: int = logging.INFO, - ) -> None: - if message: - if isinstance(message, list): - message = " ".join(message) - self.logger.log( - level, message, extra={"title": str(title), "color": str(title_color)} - ) - - def set_level(self, level: logging._Level) -> None: - self.logger.setLevel(level) - self.typing_logger.setLevel(level) - - def double_check(self, additionalText: Optional[str] = None) -> None: - if not additionalText: - additionalText = ( - "Please ensure you've setup and configured everything" - " correctly. Read https://github.com/Torantulino/Auto-GPT#readme to " - "double check. You can also create a github issue or join the discord" - " and ask there!" - ) - - self.typewriter_log("DOUBLE CHECK CONFIGURATION", Fore.YELLOW, additionalText) - - def log_json(self, data: Any, file_name: str) -> None: - # Define log directory - this_files_dir_path = os.path.dirname(__file__) - log_dir = os.path.join(this_files_dir_path, "../logs") - - # Create a handler for JSON files - json_file_path = os.path.join(log_dir, file_name) - json_data_handler = JsonFileHandler(json_file_path) - json_data_handler.setFormatter(JsonFormatter()) - - # Log the JSON data using the custom file handler - self.json_logger.addHandler(json_data_handler) - self.json_logger.debug(data) - self.json_logger.removeHandler(json_data_handler) - - def get_log_directory(self) -> str: - this_files_dir_path = os.path.dirname(__file__) - log_dir = os.path.join(this_files_dir_path, "../../logs") - return os.path.abspath(log_dir) - - -logger = Logger() |