@@ -28,12 +28,6 @@ def get_logger(name, log_file=None, log_level=logging.INFO, file_mode='w'):
28
28
logging.Logger: The expected logger.
29
29
"""
30
30
logger = logging .getLogger (name )
31
-
32
- # set the root logger's StreamHandler, if any, to log at the ERROR level
33
- for handler in logger .root .handlers :
34
- if type (handler ) is logging .StreamHandler :
35
- handler .setLevel (logging .ERROR )
36
-
37
31
if name in logger_initialized :
38
32
return logger
39
33
# handle hierarchical names
@@ -43,6 +37,17 @@ def get_logger(name, log_file=None, log_level=logging.INFO, file_mode='w'):
43
37
if name .startswith (logger_name ):
44
38
return logger
45
39
40
+ # handle duplicate logs to the console
41
+ # Starting in 1.8.0, PyTorch DDP attaches a StreamHandler <stderr> (NOTSET)
42
+ # to the root logger. As logger.propagate is True by default, this root
43
+ # level handler causes logging messages from rank>0 processes to
44
+ # unexpectedly show up on the console, creating much unwanted clutter.
45
+ # To fix this issue, we set the root logger's StreamHandler, if any, to log
46
+ # at the ERROR level.
47
+ for handler in logger .root .handlers :
48
+ if type (handler ) is logging .StreamHandler :
49
+ handler .setLevel (logging .ERROR )
50
+
46
51
stream_handler = logging .StreamHandler ()
47
52
handlers = [stream_handler ]
48
53
0 commit comments