22import shutil
33from logging .handlers import QueueHandler , QueueListener , RotatingFileHandler
44import multiprocessing
5- from typing import Optional
5+ from typing import Optional , Any
66
77from simple_logger .logger import DuplicateFilter , WrapperLogFormatter
88
@@ -22,7 +22,7 @@ def __repr__(self) -> str:
2222
2323
2424def setup_logging (
25- log_level : int , log_file : str = "/tmp/pytest-tests.log" , thread_name : str | None = None
25+ log_level : int , log_file : str = "/tmp/pytest-tests.log" , thread_name : str | None = None , enable_console : bool = True
2626) -> QueueListener :
2727 """
2828 Setup basic/root logging using QueueHandler/QueueListener
@@ -61,15 +61,22 @@ def setup_logging(
6161 secondary_log_colors = {},
6262 )
6363
64- console_handler = logging .StreamHandler ()
6564 log_file_handler = RotatingFileHandler (filename = log_file , maxBytes = 100 * 1024 * 1024 , backupCount = 20 )
65+ log_file_handler .setLevel (level = log_level ) # Set the file handler log level
66+
67+ handlers : list [Any ] = [log_file_handler ]
68+
69+ # Convert log_level to int if it's a string
70+ if isinstance (log_level , str ):
71+ log_level = getattr (logging , log_level .upper (), logging .INFO )
72+
73+ if enable_console :
74+ console_handler = logging .StreamHandler ()
75+ console_handler .setLevel (level = log_level ) # Set the console handler log level
76+ handlers .append (console_handler )
6677
6778 log_queue = multiprocessing .Queue (maxsize = - 1 ) # type: ignore[var-annotated]
68- log_listener = QueueListener (
69- log_queue ,
70- log_file_handler ,
71- console_handler ,
72- )
79+ log_listener = QueueListener (log_queue , * handlers )
7380
7481 basic_log_queue_handler = QueueHandler (queue = log_queue )
7582 basic_log_queue_handler .set_name (name = "basic" )
@@ -93,12 +100,25 @@ def setup_logging(
93100 root_logger .propagate = False
94101 basic_logger .propagate = False
95102
103+ # Always configure all loggers to use our queue system
104+ # This ensures test loggers and third-party loggers respect our console setting
96105 for name , logger in logging .root .manager .loggerDict .items ():
97106 if isinstance (logger , logging .Logger ) and (name not in ("root" , "basic" )):
98107 logger .handlers .clear ()
99108 logger .addHandler (hdlr = root_log_queue_handler )
100109 logger .propagate = False
101110
111+ # Configure the root logger to catch any new loggers that inherit from it
112+ # First, completely clear any existing configuration
113+ logging .root .handlers .clear ()
114+ logging .root .setLevel (level = log_level ) # Set root logger to respect our log level
115+ logging .root .addHandler (hdlr = root_log_queue_handler )
116+
117+ # Also ensure the root logger doesn't have any lingering configuration
118+ for handler in logging .root .handlers [:]:
119+ if handler != root_log_queue_handler :
120+ logging .root .removeHandler (hdlr = handler )
121+
102122 log_listener .start ()
103123 return log_listener
104124
0 commit comments