<p>如果您阅读<a href="https://github.com/python/cpython/blob/master/Lib/logging/__init__.py#L1540" rel="nofollow noreferrer">^{<cd1>}</a>方法的源代码,该方法返回一个带有给定日志信息的<code>LogRecord</code>对象,您会发现它将<code>extra</code>dict与returing <code>LogRecord</code>对象的<code>__dict__</code>属性合并,因此您无法在格式化程序中检索原始的<code>extra</code>dict。你知道吗</p>
<p>相反,您可以使用包装函数修补<code>logging.Logger.makeRecord</code>方法,该包装函数将给定的<code>extra</code>dict存储为返回的<code>LogRecord</code>对象的<code>_extra</code>属性:</p>
<pre><code>def make_record_with_extra(self, name, level, fn, lno, msg, args, exc_info, func=None, extra=None, sinfo=None):
record = original_makeRecord(self, name, level, fn, lno, msg, args, exc_info, func, extra, sinfo)
record._extra = extra
return record
original_makeRecord = logging.Logger.makeRecord
logging.Logger.makeRecord = make_record_with_extra
</code></pre>
<p>以便:</p>
<pre><code>class myFormatter(logging.Formatter):
def format(self, record):
print('Got extra:', record._extra) # or do whatever you want with _extra
return super().format(record)
logger = logging.getLogger(__name__)
handler = logging.StreamHandler()
handler.setFormatter(myFormatter('%(name)s - %(levelname)s - %(message)s - %(foo)s'))
logger.addHandler(handler)
logger.warning('test', extra={'foo': 'bar'})
</code></pre>
<p>输出:</p>
<pre><code>Got extra: {'foo': 'bar'}
__main__ - WARNING - test - bar
</code></pre>
<p>演示:<a href="https://repl.it/@blhsing/WorthyTotalLivedistro" rel="nofollow noreferrer">https://repl.it/@blhsing/WorthyTotalLivedistro</a></p>