|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
""" |
|
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): |
|
"""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. |
|
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 dist.get_rank() == 0: |
|
logger.setLevel(log_level) |
|
else: |
|
logger.setLevel(logging.ERROR) |
|
logger_initialized[name] = True |
|
logger.propagate = False |
|
return logger |
|
|