Get logging logger Args: log_file: Log filename, if specified, file handler will be added to logger log_level: Logging level. file_mode: Specifies the mode to open the file, if filename is specified (if filemode is unspecified, it defaults to 'w'
(log_file: Optional[str] = None,
log_level: int = default_log_level,
file_mode: str = 'w')
| 15 | |
| 16 | |
| 17 | def get_logger(log_file: Optional[str] = None, |
| 18 | log_level: int = default_log_level, |
| 19 | file_mode: str = 'w'): |
| 20 | """ Get logging logger |
| 21 | |
| 22 | Args: |
| 23 | log_file: Log filename, if specified, file handler will be added to |
| 24 | logger |
| 25 | log_level: Logging level. |
| 26 | file_mode: Specifies the mode to open the file, if filename is |
| 27 | specified (if filemode is unspecified, it defaults to 'w'). |
| 28 | """ |
| 29 | |
| 30 | logger_name = __name__.split('.')[0] |
| 31 | logger = logging.getLogger(logger_name) |
| 32 | logger.propagate = False |
| 33 | if logger_name in init_loggers: |
| 34 | add_file_handler_if_needed(logger, log_file, file_mode, log_level) |
| 35 | if logger.level != log_level: |
| 36 | logger.setLevel(log_level) |
| 37 | return logger |
| 38 | |
| 39 | # handle duplicate logs to the console |
| 40 | # Starting in 1.8.0, PyTorch DDP attaches a StreamHandler <stderr> (NOTSET) |
| 41 | # to the root logger. As logger.propagate is True by default, this root |
| 42 | # level handler causes logging messages from rank>0 processes to |
| 43 | # unexpectedly show up on the console, creating much unwanted clutter. |
| 44 | # To fix this issue, we set the root logger's StreamHandler, if any, to log |
| 45 | # at the ERROR level. |
| 46 | torch_dist = False |
| 47 | is_worker0 = True |
| 48 | if iutil.find_spec('torch') is not None: |
| 49 | from modelscope.utils.torch_utils import is_dist, is_master |
| 50 | torch_dist = is_dist() |
| 51 | is_worker0 = is_master() |
| 52 | |
| 53 | if torch_dist: |
| 54 | for handler in logger.root.handlers: |
| 55 | if type(handler) is logging.StreamHandler: |
| 56 | handler.setLevel(logging.ERROR) |
| 57 | |
| 58 | stream_handler = logging.StreamHandler() |
| 59 | handlers = [stream_handler] |
| 60 | |
| 61 | if is_worker0 and log_file is not None: |
| 62 | file_handler = logging.FileHandler(log_file, file_mode) |
| 63 | handlers.append(file_handler) |
| 64 | |
| 65 | for handler in handlers: |
| 66 | handler.setFormatter(formatter) |
| 67 | handler.setLevel(log_level) |
| 68 | logger.addHandler(handler) |
| 69 | |
| 70 | if is_worker0: |
| 71 | logger.setLevel(log_level) |
| 72 | else: |
| 73 | logger.setLevel(logging.ERROR) |
| 74 |
no test coverage detected
searching dependent graphs…