Я отлаживал свой модуль отладки, и я полагаюсь на попытку ... ловить, чтобы обнаружить TypeError и правильно отформатировать журнал, а затем я заметил, что при передаче словарей Python не вызывает традиционное исключение.
>>> 'var' % {1: 'variable'}
'var'
>>> 'var' % (1,)
Traceback (most recent call last):
File "<string>", line 1, in <module>
Это минимальный пример с модулем регистрации:
import logging
class SmartLogRecord(logging.LogRecord):
def _getMessage(self, remaining_arguments):
try:
if self.args:
remaining_arguments.append( self.msg % self.args )
else:
remaining_arguments.append( self.msg )
return False
except TypeError as error:
last = self.args[-1]
self.args = self.args[:-1]
remaining_arguments.append( str( last ) )
if len( self.args ):
return True
else:
remaining_arguments.append( self.msg )
return False
def getMessage(self):
"""
Return the message for this LogRecord.
Return the message for this LogRecord after merging any user-supplied
arguments with the message.
"""
remaining_arguments = []
self.msg = str( self.msg )
while self._getMessage( remaining_arguments ): pass
return " ".join( reversed( remaining_arguments ) )
logging.setLogRecordFactory(SmartLogRecord)
var = 'SmartLogRecord'
logging.warning('I am a', var)
dumb = {1: 'variable'}
logging.warning('I am a', dumb)
Запустив его, вы получите:
WARNING:root:I am a SmartLogRecord
WARNING:root:I am a
Как вы можете заметить, последнее dumb
сообщение было потеряно.