35):
36 """
37 Args:
38 output (str): a file name or a directory to save log. If None, will not save log file.
39 If ends with ".txt" or ".log", assumed to be a file name.
40 Otherwise, logs will be saved to `output/log.txt`.
41 name (str): the root module name of this logger
42 abbrev_name (str): an abbreviation of the module, to avoid long names in logs.
43 Set to "" to not log the root module in logs.
44 By default, will abbreviate "detectron2" to "d2" and leave other
45 modules unchanged.
46 """
47 logger = logging.getLogger(name)
48 logger.setLevel(logging.DEBUG)
49 logger.propagate = False
50
51 if abbrev_name is None:
52 abbrev_name = "d2" if name == "detectron2" else name
53
54 plain_formatter = logging.Formatter(
55 "[%(asctime)s] %(name)s %(levelname)s: %(message)s", datefmt="%m/%d %H:%M:%S"
56 )
57
58 if distributed_rank == 0:
59 ch = logging.StreamHandler(stream=sys.stdout)
60 ch.setLevel(logging.DEBUG)
61 if color:
62 formatter = _ColorfulFormatter(
63 colored("[%(asctime)s %(name)s]: ", "green") + "%(message)s",
64 datefmt="%m/%d %H:%M:%S",
65 root_name=name,
66 abbrev_name=str(abbrev_name),
67 )
68 else:
69 formatter = plain_formatter
70 ch.setFormatter(formatter)
71 logger.addHandler(ch)
72
73
74 if output is not None:
75 if output.endswith(".txt") or output.endswith(".log"):
76 filename = output
77 else:
78 filename = os.path.join(output, "log.txt")
79 if distributed_rank > 0:
80 filename = filename + ".rank{}".format(distributed_rank)
81 PathManager.mkdirs(os.path.dirname(filename))
82
83 fh = logging.StreamHandler(_cached_log_stream(filename))
84 fh.setLevel(logging.DEBUG)
85 fh.setFormatter(plain_formatter)
86 logger.addHandler(fh)
87
88 return logger
89
90
91
92
93@functools.lru_cache(maxsize=None)