| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| """ |
| This code is refer from: |
| https://github.com/WenmuZhou/PytorchOCR/blob/master/torchocr/utils/logging.py |
| """ |
|
|
| import os |
| import sys |
| import logging |
| import functools |
| import paddle.distributed as dist |
|
|
| logger_initialized = {} |
|
|
|
|
| @functools.lru_cache() |
| def get_logger(name="ppocr", log_file=None, log_level=logging.DEBUG, log_ranks="0"): |
| """Initialize and get a logger by name. |
| If the logger has not been initialized, this method will initialize the |
| logger by adding one or two handlers, otherwise the initialized logger will |
| be directly returned. During initialization, a StreamHandler will always be |
| added. If `log_file` is specified a FileHandler will also be added. |
| Args: |
| name (str): Logger name. |
| log_file (str | None): The log filename. If specified, a FileHandler |
| will be added to the logger. |
| log_level (int): The logger level. Note that only the process of |
| rank 0 is affected, and other processes will set the level to |
| "Error" thus be silent most of the time. |
| log_ranks (str): The ids of gpu to log which are separated by "," when more than 1, "0" by default. |
| Returns: |
| logging.Logger: The expected logger. |
| """ |
| logger = logging.getLogger(name) |
| if name in logger_initialized: |
| return logger |
| for logger_name in logger_initialized: |
| if name.startswith(logger_name): |
| return logger |
|
|
| formatter = logging.Formatter( |
| "[%(asctime)s] %(name)s %(levelname)s: %(message)s", datefmt="%Y/%m/%d %H:%M:%S" |
| ) |
|
|
| stream_handler = logging.StreamHandler(stream=sys.stdout) |
| stream_handler.setFormatter(formatter) |
| logger.addHandler(stream_handler) |
| if log_file is not None and dist.get_rank() == 0: |
| log_file_folder = os.path.split(log_file)[0] |
| os.makedirs(log_file_folder, exist_ok=True) |
| file_handler = logging.FileHandler(log_file, "a") |
| file_handler.setFormatter(formatter) |
| logger.addHandler(file_handler) |
|
|
| if isinstance(log_ranks, str): |
| log_ranks = [int(i) for i in log_ranks.split(",")] |
| elif isinstance(log_ranks, int): |
| log_ranks = [log_ranks] |
|
|
| if dist.get_rank() in log_ranks: |
| logger.setLevel(log_level) |
| else: |
| logger.setLevel(logging.ERROR) |
| logger_initialized[name] = True |
| logger.propagate = False |
| return logger |
|
|