TradingAgents/tradingagents/utils/logger.py

62 lines
1.9 KiB
Python

import logging
import os
import sys
from typing import Optional
def get_logger(name: str, level: Optional[int] = None) -> logging.Logger:
"""
Get a configured logger instance.
Environment variables:
LOG_LEVEL: Set logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
LOG_FILE: Path to log file (if set, logs will be written to this file)
LOG_TO_CONSOLE: Set to 'false' to disable console logging (default: true)
Args:
name: The name of the logger (usually __name__)
level: Optional logging level override (defaults to INFO or LOG_LEVEL env var)
Returns:
Configured logger instance
Example:
export LOG_FILE=ranker_debug.log
export LOG_LEVEL=DEBUG
python cli/main.py
"""
logger = logging.getLogger(name)
# If logger is already configured, return it
if logger.hasHandlers():
return logger
# Get level from environment variable or use provided/default
if level is None:
env_level = os.getenv("LOG_LEVEL", "INFO").upper()
level = getattr(logging, env_level, logging.INFO)
logger.setLevel(level)
# Create formatter
formatter = logging.Formatter(
"[%(asctime)s] %(levelname)s in %(module)s: %(message)s", datefmt="%Y-%m-%d %H:%M:%S"
)
# Add file handler if LOG_FILE is set
log_file = os.getenv("LOG_FILE")
if log_file:
file_handler = logging.FileHandler(log_file, mode="a")
file_handler.setLevel(level)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
# Add console handler (unless explicitly disabled)
log_to_console = os.getenv("LOG_TO_CONSOLE", "true").lower() != "false"
if log_to_console:
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(level)
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
return logger