88
99import logging
1010import os
11+ import sys
1112from pathlib import Path
1213from typing import Optional
1314
@@ -41,6 +42,11 @@ def setup_logger(
4142
4243 # Create logger
4344 logger = logging .getLogger (name )
45+
46+ # Only configure if not already configured (has handlers and proper level)
47+ if logger .handlers and logger .level != logging .NOTSET :
48+ return logger
49+
4450 logger .setLevel (level )
4551
4652 # Clear existing handlers to avoid duplicates
@@ -50,20 +56,23 @@ def setup_logger(
5056 file_formatter = logging .Formatter ("%(asctime)s - %(name)s - %(levelname)s - %(message)s" )
5157 console_formatter = logging .Formatter ("%(levelname)s - %(message)s" )
5258
53- # Console handler
54- console_handler = logging .StreamHandler ()
59+ # Console handler - explicitly write to sys.stdout
60+ console_handler = logging .StreamHandler (sys . stdout )
5561 console_handler .setLevel (console_level )
5662 console_handler .setFormatter (console_formatter )
5763 logger .addHandler (console_handler )
5864
59- # File handler (if log_file specified)
65+ # File handler (if log_file specified) - explicitly write to file only
6066 if log_file :
6167 log_file_path = logs_dir / log_file
6268 file_handler = logging .FileHandler (log_file_path )
6369 file_handler .setLevel (file_level )
6470 file_handler .setFormatter (file_formatter )
6571 logger .addHandler (file_handler )
6672
73+ # Prevent propagation to avoid duplicate logging
74+ logger .propagate = False
75+
6776 return logger
6877
6978
@@ -81,7 +90,19 @@ def get_logger(name: str) -> logging.Logger:
8190
8291 # If logger doesn't have handlers, set it up with defaults
8392 if not logger .handlers :
84- logger = setup_logger (name , f"{ name } .log" )
93+ # For eval_watcher, check if running in daemon mode
94+ if name == "eval_watcher" :
95+ import sys
96+
97+ # Check if running in daemon mode (subprocess)
98+ if "--daemon" in sys .argv :
99+ # Subprocess: log to file only
100+ logger = setup_logger (name , f"{ name } .log" , console_level = logging .CRITICAL )
101+ else :
102+ # Top-level: log to console only
103+ logger = setup_logger (name , None )
104+ else :
105+ logger = setup_logger (name , f"{ name } .log" )
85106
86107 return logger
87108
0 commit comments