| | import logging |
| | import sys |
| |
|
| | CRITICAL = logging.CRITICAL |
| | FATAL = logging.FATAL |
| | ERROR = logging.ERROR |
| | WARNING = logging.WARNING |
| | INFO = logging.INFO |
| | DEBUG = logging.DEBUG |
| | NOTSET = logging.NOTSET |
| |
|
| | _loggers = set() |
| | _log_level = NOTSET |
| | DATE_FORMAT = "%Y-%m-%d %H:%M:%S" |
| | DEBUG_LOG_FORMAT = "%(asctime)s %(levelname)s [%(filename)s:%(lineno)d] %(message)s" |
| | LOG_FORMAT = "[%(levelname)s] %(message)s" |
| |
|
| |
|
| | def get_logger(name: str) -> logging.Logger: |
| | """ |
| | Create a logger with the specified name. The logger will use the log level |
| | specified by set_log_level() |
| | """ |
| | logger = logging.getLogger(name=name) |
| |
|
| | if _log_level == DEBUG: |
| | formatter = logging.Formatter(fmt=DEBUG_LOG_FORMAT, datefmt=DATE_FORMAT) |
| | else: |
| | formatter = logging.Formatter(fmt=LOG_FORMAT) |
| | handler = logging.StreamHandler(stream=sys.stdout) |
| | handler.setFormatter(formatter) |
| | logger.addHandler(handler) |
| |
|
| | |
| | if _log_level != NOTSET: |
| | logger.setLevel(_log_level) |
| |
|
| | |
| | _loggers.add(logger) |
| | return logger |
| |
|
| |
|
| | def set_log_level(log_level: int) -> None: |
| | """ |
| | Set the ML-Agents logging level. This will also configure the logging format (if it hasn't already been set). |
| | """ |
| | global _log_level |
| | _log_level = log_level |
| |
|
| | for logger in _loggers: |
| | logger.setLevel(log_level) |
| |
|
| | if log_level == DEBUG: |
| | formatter = logging.Formatter(fmt=DEBUG_LOG_FORMAT, datefmt=DATE_FORMAT) |
| | else: |
| | formatter = logging.Formatter(LOG_FORMAT) |
| | _set_formatter_for_all_loggers(formatter) |
| |
|
| |
|
| | def _set_formatter_for_all_loggers(formatter: logging.Formatter) -> None: |
| | for logger in _loggers: |
| | for handler in logger.handlers[:]: |
| | handler.setFormatter(formatter) |
| |
|