Skip to content

Commit 807cac7

Browse files
authored
Merge pull request #4433 from jcbrill/jbrill-mscommon-debug
MSCommon: add custom formatter for debug log records
2 parents a95d096 + 447f43d commit 807cac7

File tree

1 file changed

+67
-13
lines changed

1 file changed

+67
-13
lines changed

SCons/Tool/MSCommon/common.py

Lines changed: 67 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -75,32 +75,86 @@ def filter(self, record) -> bool:
7575
record.relfilename = relfilename
7676
return True
7777

78-
# Log format looks like:
79-
# 00109ms:MSCommon/vc.py:find_vc_pdir#447: VC found '14.3' [file]
80-
# debug: 00109ms:MSCommon/vc.py:find_vc_pdir#447: VC found '14.3' [stdout]
81-
log_format=(
82-
'%(relativeCreated)05dms'
83-
':%(relfilename)s'
84-
':%(funcName)s'
85-
'#%(lineno)s'
86-
': %(message)s'
87-
)
78+
class _CustomFormatter(logging.Formatter):
79+
80+
# Log format looks like:
81+
# 00109ms:MSCommon/vc.py:find_vc_pdir#447: VC found '14.3' [file]
82+
# debug: 00109ms:MSCommon/vc.py:find_vc_pdir#447: VC found '14.3' [stdout]
83+
84+
log_format=(
85+
'%(relativeCreated)05dms'
86+
':%(relfilename)s'
87+
':%(funcName)s'
88+
'#%(lineno)s'
89+
': %(message)s'
90+
)
91+
92+
log_format_classname=(
93+
'%(relativeCreated)05dms'
94+
':%(relfilename)s'
95+
':%(classname)s'
96+
'.%(funcName)s'
97+
'#%(lineno)s'
98+
': %(message)s'
99+
)
100+
101+
def __init__(self, log_prefix):
102+
super().__init__()
103+
if log_prefix:
104+
self.log_format = log_prefix + self.log_format
105+
self.log_format_classname = log_prefix + self.log_format_classname
106+
log_record = logging.LogRecord(
107+
'', # name (str)
108+
0, # level (int)
109+
'', # pathname (str)
110+
0, # lineno (int)
111+
None, # msg (Any)
112+
{}, # args (tuple | dict[str, Any])
113+
None # exc_info (tuple[type[BaseException], BaseException, types.TracebackType] | None)
114+
)
115+
self.default_attrs = set(log_record.__dict__.keys())
116+
self.default_attrs.add('relfilename')
117+
118+
def format(self, record):
119+
extras = set(record.__dict__.keys()) - self.default_attrs
120+
if 'classname' in extras:
121+
log_format = self.log_format_classname
122+
else:
123+
log_format = self.log_format
124+
formatter = logging.Formatter(log_format)
125+
return formatter.format(record)
126+
88127
if LOGFILE == '-':
89-
log_format = 'debug: ' + log_format
128+
log_prefix = 'debug: '
90129
log_handler = logging.StreamHandler(sys.stdout)
91130
else:
131+
log_prefix = ''
92132
log_handler = logging.FileHandler(filename=LOGFILE)
93-
log_formatter = logging.Formatter(log_format)
133+
log_formatter = _CustomFormatter(log_prefix)
94134
log_handler.setFormatter(log_formatter)
95135
logger = logging.getLogger(name=__name__)
96136
logger.setLevel(level=logging.DEBUG)
97137
logger.addHandler(log_handler)
98138
logger.addFilter(_Debug_Filter())
99139
debug = logger.debug
140+
141+
def debug_extra(cls=None):
142+
if cls:
143+
extra = {'classname': cls.__qualname__}
144+
else:
145+
extra = None
146+
return extra
147+
148+
DEBUG_ENABLED = True
149+
100150
else:
101-
def debug(x, *args):
151+
def debug(x, *args, **kwargs):
152+
return None
153+
154+
def debug_extra(*args, **kwargs):
102155
return None
103156

157+
DEBUG_ENABLED = False
104158

105159
# SCONS_CACHE_MSVC_CONFIG is public, and is documented.
106160
CONFIG_CACHE = os.environ.get('SCONS_CACHE_MSVC_CONFIG', '')

0 commit comments

Comments
 (0)