logging.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import os
  2. import sys
  3. import logging
  4. import functools
  5. logger_initialized = {}
  6. @functools.lru_cache()
  7. def get_logger(name="openrec", log_file=None, log_level=logging.DEBUG):
  8. """Initialize and get a logger by name.
  9. If the logger has not been initialized, this method will initialize the
  10. logger by adding one or two handlers, otherwise the initialized logger will
  11. be directly returned. During initialization, a StreamHandler will always be
  12. added. If `log_file` is specified a FileHandler will also be added.
  13. Args:
  14. name (str): Logger name.
  15. log_file (str | None): The log filename. If specified, a FileHandler
  16. will be added to the logger.
  17. log_level (int): The logger level. Note that only the process of
  18. rank 0 is affected, and other processes will set the level to
  19. "Error" thus be silent most of the time.
  20. Returns:
  21. logging.Logger: The expected logger.
  22. """
  23. logger = logging.getLogger(name)
  24. if name in logger_initialized:
  25. return logger
  26. for logger_name in logger_initialized:
  27. if name.startswith(logger_name):
  28. return logger
  29. formatter = logging.Formatter(
  30. "[%(asctime)s] %(name)s %(levelname)s: %(message)s",
  31. datefmt="%Y/%m/%d %H:%M:%S")
  32. stream_handler = logging.StreamHandler(stream=sys.stdout)
  33. stream_handler.setFormatter(formatter)
  34. logger.addHandler(stream_handler)
  35. rank = int(os.environ["LOCAL_RANK"]) if "LOCAL_RANK" in os.environ else 0
  36. if log_file is not None and rank == 0:
  37. log_file_folder = os.path.split(log_file)[0]
  38. os.makedirs(log_file_folder, exist_ok=True)
  39. file_handler = logging.FileHandler(log_file, "a")
  40. file_handler.setFormatter(formatter)
  41. logger.addHandler(file_handler)
  42. if rank == 0:
  43. logger.setLevel(log_level)
  44. else:
  45. logger.setLevel(logging.ERROR)
  46. logger_initialized[name] = True
  47. logger.propagate = False
  48. return logger