| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- # Copyright (c) Alibaba, Inc. and its affiliates.
- import importlib.util as iutil
- import logging
- import os
- from typing import Optional
- init_loggers = {}
- formatter = logging.Formatter(
- '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
- default_log_level = int(os.getenv('MODELSCOPE_LOG_LEVEL', str(logging.INFO)))
- logging.getLogger('numba').setLevel(logging.INFO)
- def get_logger(log_file: Optional[str] = None,
- log_level: int = default_log_level,
- file_mode: str = 'w'):
- """ 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').
- """
- logger_name = __name__.split('.')[0]
- logger = logging.getLogger(logger_name)
- logger.propagate = False
- if logger_name in init_loggers:
- add_file_handler_if_needed(logger, log_file, file_mode, log_level)
- if logger.level != log_level:
- logger.setLevel(log_level)
- return logger
- # handle duplicate logs to the console
- # Starting in 1.8.0, PyTorch DDP attaches a StreamHandler <stderr> (NOTSET)
- # to the root logger. As logger.propagate is True by default, this root
- # level handler causes logging messages from rank>0 processes to
- # unexpectedly show up on the console, creating much unwanted clutter.
- # To fix this issue, we set the root logger's StreamHandler, if any, to log
- # at the ERROR level.
- torch_dist = False
- is_worker0 = True
- if iutil.find_spec('torch') is not None:
- from modelscope.utils.torch_utils import is_dist, is_master
- torch_dist = is_dist()
- is_worker0 = is_master()
- if torch_dist:
- for handler in logger.root.handlers:
- if type(handler) is logging.StreamHandler:
- handler.setLevel(logging.ERROR)
- stream_handler = logging.StreamHandler()
- handlers = [stream_handler]
- if is_worker0 and log_file is not None:
- file_handler = logging.FileHandler(log_file, file_mode)
- handlers.append(file_handler)
- for handler in handlers:
- handler.setFormatter(formatter)
- handler.setLevel(log_level)
- logger.addHandler(handler)
- if is_worker0:
- logger.setLevel(log_level)
- else:
- logger.setLevel(logging.ERROR)
- init_loggers[logger_name] = True
- return logger
- def add_file_handler_if_needed(logger, log_file, file_mode, log_level):
- for handler in logger.handlers:
- if isinstance(handler, logging.FileHandler):
- return
- if iutil.find_spec('torch') is not None:
- from modelscope.utils.torch_utils import is_master
- is_worker0 = is_master()
- else:
- is_worker0 = True
- if is_worker0 and log_file is not None:
- file_handler = logging.FileHandler(log_file, file_mode)
- file_handler.setFormatter(formatter)
- file_handler.setLevel(log_level)
- logger.addHandler(file_handler)
|