Normalize logging hierarchy (#294)

This commit is contained in:
Dillon DuPont
2025-06-20 10:20:44 -04:00
parent 910e8bc937
commit 531fb7ccaf
18 changed files with 27 additions and 46 deletions

View File

@@ -6,7 +6,7 @@ import logging
__version__ = "0.1.0"
# Initialize logging
logger = logging.getLogger("cua.agent")
logger = logging.getLogger("agent")
# Initialize telemetry when the package is imported
try:

View File

@@ -11,10 +11,8 @@ from .types import AgentResponse
from .factory import LoopFactory
from .provider_config import DEFAULT_MODELS, ENV_VARS
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class ComputerAgent:
"""A computer agent that can perform automated tasks using natural language instructions."""

View File

@@ -34,7 +34,7 @@ flush = _default_flush
is_telemetry_enabled = _default_is_telemetry_enabled
is_telemetry_globally_disabled = _default_is_telemetry_globally_disabled
logger = logging.getLogger("cua.agent.telemetry")
logger = logging.getLogger("agent.telemetry")
try:
# Import from core telemetry

View File

@@ -26,10 +26,8 @@ from .api_handler import OmniAPIHandler
from .tools.manager import ToolManager
from .tools import ToolResult
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def extract_data(input_string: str, data_type: str) -> str:
"""Extract content from code blocks."""
pattern = f"```{data_type}" + r"(.*?)(```|$)"

View File

@@ -25,10 +25,8 @@ from .prompts import COMPUTER_USE, SYSTEM_PROMPT, MAC_SPECIFIC_NOTES
from .clients.oaicompat import OAICompatClient
from .clients.mlxvlm import MLXVLMUITarsClient
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class UITARSLoop(BaseLoop):
"""UI-TARS-specific implementation of the agent loop.

View File

@@ -15,13 +15,7 @@ from computer_server.diorama.diorama_computer import DioramaComputer
from computer_server.handlers.macos import *
# simple, nicely formatted logging
logging.basicConfig(
level=logging.INFO,
format='[%(asctime)s] [%(levelname)s] %(message)s',
datefmt='%H:%M:%S',
stream=sys.stdout
)
logger = logging.getLogger("diorama.virtual_desktop")
logger = logging.getLogger(__name__)
automation_handler = MacOSAutomationHandler()

View File

@@ -28,13 +28,7 @@ import functools
import logging
# simple, nicely formatted logging
logging.basicConfig(
level=logging.INFO,
format='[%(asctime)s] [%(levelname)s] %(message)s',
datefmt='%H:%M:%S',
stream=sys.stdout
)
logger = logging.getLogger("diorama.draw")
logger = logging.getLogger(__name__)
from computer_server.diorama.safezone import (
get_menubar_bounds,

View File

@@ -12,8 +12,8 @@ import os
import aiohttp
# Set up logging with more detail
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
# Configure WebSocket with larger message size
WEBSOCKET_MAX_SIZE = 1024 * 1024 * 10 # 10MB limit

View File

@@ -6,14 +6,14 @@ import sys
__version__ = "0.1.0"
# Initialize logging
logger = logging.getLogger("cua.computer")
logger = logging.getLogger("computer")
# Initialize telemetry when the package is imported
try:
# Import from core telemetry
from core.telemetry import (
is_telemetry_enabled,
flush,
is_telemetry_enabled,
record_event,
)

View File

@@ -85,7 +85,7 @@ class Computer:
experiments: Optional list of experimental features to enable (e.g. ["app-use"])
"""
self.logger = Logger("cua.computer", verbosity)
self.logger = Logger("computer", verbosity)
self.logger.info("Initializing Computer...")
# Store original parameters
@@ -132,11 +132,11 @@ class Computer:
# Configure root logger
self.verbosity = verbosity
self.logger = Logger("cua", verbosity)
self.logger = Logger("computer", verbosity)
# Configure component loggers with proper hierarchy
self.vm_logger = Logger("cua.vm", verbosity)
self.interface_logger = Logger("cua.interface", verbosity)
self.vm_logger = Logger("computer.vm", verbosity)
self.interface_logger = Logger("computer.interface", verbosity)
if not use_host_computer_server:
if ":" not in image or len(image.split(":")) != 2:

View File

@@ -30,7 +30,7 @@ class LinuxComputerInterface(BaseComputerInterface):
self._command_lock = asyncio.Lock() # Lock to ensure only one command at a time
# Set logger name for Linux interface
self.logger = Logger("cua.interface.linux", LogLevel.NORMAL)
self.logger = Logger("computer.interface.linux", LogLevel.NORMAL)
@property
def ws_uri(self) -> str:

View File

@@ -29,7 +29,7 @@ class MacOSComputerInterface(BaseComputerInterface):
self._command_lock = asyncio.Lock() # Lock to ensure only one command at a time
# Set logger name for macOS interface
self.logger = Logger("cua.interface.macos", LogLevel.NORMAL)
self.logger = Logger("computer.interface.macos", LogLevel.NORMAL)
@property
def ws_uri(self) -> str:

View File

@@ -30,7 +30,7 @@ class WindowsComputerInterface(BaseComputerInterface):
self._command_lock = asyncio.Lock() # Lock to ensure only one command at a time
# Set logger name for Windows interface
self.logger = Logger("cua.interface.windows", LogLevel.NORMAL)
self.logger = Logger("computer.interface.windows", LogLevel.NORMAL)
@property
def ws_uri(self) -> str:

View File

@@ -9,10 +9,10 @@ TELEMETRY_AVAILABLE = False
try:
from core.telemetry import (
record_event,
increment,
is_telemetry_enabled,
is_telemetry_globally_disabled,
record_event,
)
def increment_counter(counter_name: str, value: int = 1) -> None:
@@ -22,14 +22,14 @@ try:
def set_dimension(name: str, value: Any) -> None:
"""Set a dimension that will be attached to all events."""
logger = logging.getLogger("cua.computer.telemetry")
logger = logging.getLogger("computer.telemetry")
logger.debug(f"Setting dimension {name}={value}")
TELEMETRY_AVAILABLE = True
logger = logging.getLogger("cua.computer.telemetry")
logger = logging.getLogger("computer.telemetry")
logger.info("Successfully imported telemetry")
except ImportError as e:
logger = logging.getLogger("cua.computer.telemetry")
logger = logging.getLogger("computer.telemetry")
logger.warning(f"Could not import telemetry: {e}")
TELEMETRY_AVAILABLE = False
@@ -40,7 +40,7 @@ def _noop(*args: Any, **kwargs: Any) -> None:
pass
logger = logging.getLogger("cua.computer.telemetry")
logger = logging.getLogger("computer.telemetry")
# If telemetry isn't available, use no-op functions
if not TELEMETRY_AVAILABLE:

View File

@@ -15,7 +15,7 @@ from typing import Any, Dict, List, Optional
from core import __version__
from core.telemetry.sender import send_telemetry
logger = logging.getLogger("cua.telemetry")
logger = logging.getLogger("core.telemetry")
# Controls how frequently telemetry will be sent (percentage)
TELEMETRY_SAMPLE_RATE = 5 # 5% sampling rate

View File

@@ -16,7 +16,7 @@ from typing import Any, Dict, List, Optional
import posthog
from core import __version__
logger = logging.getLogger("cua.telemetry")
logger = logging.getLogger("core.telemetry")
# Controls how frequently telemetry will be sent (percentage)
TELEMETRY_SAMPLE_RATE = 100 # 100% sampling rate (was 5%)

View File

@@ -3,7 +3,7 @@
import logging
from typing import Any, Dict
logger = logging.getLogger("cua.telemetry")
logger = logging.getLogger("core.telemetry")
def send_telemetry(payload: Dict[str, Any]) -> bool:

View File

@@ -30,7 +30,7 @@ def _configure_telemetry_logging() -> None:
level = logging.ERROR
# Configure the main telemetry logger
telemetry_logger = logging.getLogger("cua.telemetry")
telemetry_logger = logging.getLogger("core.telemetry")
telemetry_logger.setLevel(level)
@@ -46,11 +46,11 @@ try:
POSTHOG_AVAILABLE = True
except ImportError:
logger = logging.getLogger("cua.telemetry")
logger = logging.getLogger("core.telemetry")
logger.info("PostHog not available. Install with: pdm add posthog")
POSTHOG_AVAILABLE = False
logger = logging.getLogger("cua.telemetry")
logger = logging.getLogger("core.telemetry")
# Check environment variables for global telemetry opt-out
@@ -292,10 +292,9 @@ def set_telemetry_log_level(level: Optional[int] = None) -> None:
# Set the level for all telemetry-related loggers
telemetry_loggers = [
"cua.telemetry",
"core.telemetry",
"cua.agent.telemetry",
"cua.computer.telemetry",
"agent.telemetry",
"computer.telemetry",
"posthog",
]