diff --git a/main.py b/main.py index 57d5524..6fa0070 100644 --- a/main.py +++ b/main.py @@ -6,6 +6,7 @@ import logging from datetime import datetime, timezone import jsonschema import google.auth +from colorama import Fore, Style, init from google.oauth2.credentials import Credentials from google_auth_oauthlib.flow import InstalledAppFlow from google.cloud import resourcemanager_v3, service_usage_v1, api_keys_v2 @@ -22,8 +23,35 @@ LOG_DIR = "logs" # --------------------- # --- LOGGING SETUP --- +class ColoredFormatter(logging.Formatter): + """A custom logging formatter that adds color to console output.""" + + LOG_COLORS = { + logging.DEBUG: Fore.CYAN, + logging.INFO: Fore.GREEN, + logging.WARNING: Fore.YELLOW, + logging.ERROR: Fore.RED, + logging.CRITICAL: Fore.RED + Style.BRIGHT, + } + + def format(self, record): + """Formats the log record with appropriate colors.""" + color = self.LOG_COLORS.get(record.levelno) + message = super().format(record) + if color: + # Only color the message part for readability + parts = message.split(" - ", 2) + if len(parts) > 2: + parts[2] = color + parts[2] + Style.RESET_ALL + message = " - ".join(parts) + else: + message = color + message + Style.RESET_ALL + return message + def setup_logging(): - """Sets up logging to both console and a file.""" + """Sets up logging to both console and a file, with colors for the console.""" + init(autoreset=True) # Initialize Colorama + if not os.path.exists(LOG_DIR): os.makedirs(LOG_DIR) @@ -33,11 +61,11 @@ def setup_logging(): logger = logging.getLogger() logger.setLevel(logging.INFO) - # Clear existing handlers + # Clear existing handlers to avoid duplicate logs if logger.hasHandlers(): logger.handlers.clear() - # File handler for detailed logging + # File handler for detailed, non-colored logging file_handler = logging.FileHandler(log_filepath, encoding='utf-8') file_formatter = logging.Formatter( "%(asctime)s - %(levelname)s - [%(name)s:%(module)s:%(lineno)d] - %(message)s" @@ -45,9 +73,9 @@ def setup_logging(): file_handler.setFormatter(file_formatter) logger.addHandler(file_handler) - # Console handler for concise logging + # Console handler for concise, colored logging console_handler = logging.StreamHandler(sys.stdout) - console_formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s") + console_formatter = ColoredFormatter("%(asctime)s - %(levelname)s - %(message)s") console_handler.setFormatter(console_formatter) logger.addHandler(console_handler) diff --git a/pyproject.toml b/pyproject.toml index 1802a54..c44ebda 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,4 +10,5 @@ dependencies = [ "google-cloud-resource-manager>=1.14.2", "google-cloud-service-usage>=1.13.1", "jsonschema>=4.25.1", + "colorama>=0.4.6", ] diff --git a/uv.lock b/uv.lock index 19c872c..8b4b1ae 100644 --- a/uv.lock +++ b/uv.lock @@ -75,11 +75,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8a/1f/f041989e93b001bc4e44bb1669ccdcf54d3f00e628229a85b08d330615c5/charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", size = 53175, upload-time = "2025-08-09T07:57:26.864Z" }, ] +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + [[package]] name = "geminikeymanagement" version = "0.1.0" source = { virtual = "." } dependencies = [ + { name = "colorama" }, { name = "google-auth-oauthlib" }, { name = "google-cloud-api-keys" }, { name = "google-cloud-resource-manager" }, @@ -89,6 +99,7 @@ dependencies = [ [package.metadata] requires-dist = [ + { name = "colorama", specifier = ">=0.4.6" }, { name = "google-auth-oauthlib", specifier = ">=1.2.2" }, { name = "google-cloud-api-keys", specifier = ">=0.5.17" }, { name = "google-cloud-resource-manager", specifier = ">=1.14.2" },