| |
| |
| |
| |
|
|
| import functools |
| import logging |
| import os |
| import sys |
| from typing import Optional |
|
|
| import dinov2.distributed as distributed |
| from .helpers import MetricLogger, SmoothedValue |
|
|
|
|
| |
| @functools.lru_cache() |
| def _configure_logger( |
| name: Optional[str] = None, |
| *, |
| level: int = logging.DEBUG, |
| output: Optional[str] = None, |
| ): |
| """ |
| Configure a logger. |
| |
| Adapted from Detectron2. |
| |
| Args: |
| name: The name of the logger to configure. |
| level: The logging level to use. |
| output: A file name or a directory to save log. If None, will not save log file. |
| If ends with ".txt" or ".log", assumed to be a file name. |
| Otherwise, logs will be saved to `output/log.txt`. |
| |
| Returns: |
| The configured logger. |
| """ |
|
|
| logger = logging.getLogger(name) |
| logger.setLevel(level) |
| logger.propagate = False |
|
|
| |
| |
| |
| |
| fmt_prefix = "%(levelname).1s%(asctime)s %(process)s %(name)s %(filename)s:%(lineno)s] " |
| fmt_message = "%(message)s" |
| fmt = fmt_prefix + fmt_message |
| datefmt = "%Y%m%d %H:%M:%S" |
| formatter = logging.Formatter(fmt=fmt, datefmt=datefmt) |
|
|
| |
| if distributed.is_main_process(): |
| handler = logging.StreamHandler(stream=sys.stdout) |
| handler.setLevel(logging.DEBUG) |
| handler.setFormatter(formatter) |
| logger.addHandler(handler) |
|
|
| |
| if output: |
| if os.path.splitext(output)[-1] in (".txt", ".log"): |
| filename = output |
| else: |
| filename = os.path.join(output, "logs", "log.txt") |
|
|
| if not distributed.is_main_process(): |
| global_rank = distributed.get_global_rank() |
| filename = filename + ".rank{}".format(global_rank) |
|
|
| os.makedirs(os.path.dirname(filename), exist_ok=True) |
|
|
| handler = logging.StreamHandler(open(filename, "a")) |
| handler.setLevel(logging.DEBUG) |
| handler.setFormatter(formatter) |
| logger.addHandler(handler) |
|
|
| return logger |
|
|
|
|
| def setup_logging( |
| output: Optional[str] = None, |
| *, |
| name: Optional[str] = None, |
| level: int = logging.DEBUG, |
| capture_warnings: bool = True, |
| ) -> None: |
| """ |
| Setup logging. |
| |
| Args: |
| output: A file name or a directory to save log files. If None, log |
| files will not be saved. If output ends with ".txt" or ".log", it |
| is assumed to be a file name. |
| Otherwise, logs will be saved to `output/log.txt`. |
| name: The name of the logger to configure, by default the root logger. |
| level: The logging level to use. |
| capture_warnings: Whether warnings should be captured as logs. |
| """ |
| logging.captureWarnings(capture_warnings) |
| _configure_logger(name, level=level, output=output) |
|
|