<p>我有两个解决方案,第一个很简单,但输出不是很干净。第二种方法将产生您想要的确切输出,但它稍微复杂一些。</p>
<h2>方法1</h2>
<p>要生成空行,只需用新行记录空字符串:</p>
<pre><code>import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s %(message)s', datefmt='%H:%M:%S')
logging.info('hello')
logging.info('\n')
logging.warning('new hello')
</code></pre>
<p>输出将有一个空的信息行,它不是很干净:</p>
<blockquote>
<p>16:07:26 INFO hello<br/>
16:07:26 INFO </p>
<p>16:07:26 WARNING new hello</p>
</blockquote>
<h2>方法2</h2>
<p>在这个方法中,我创建了两个不同的处理程序。我经常使用的<code>console_handler</code>。当需要新行时,我切换到第二个处理程序<code>blank_handler</code>。</p>
<pre><code>import logging
import types
def log_newline(self, how_many_lines=1):
# Switch handler, output a blank line
self.removeHandler(self.console_handler)
self.addHandler(self.blank_handler)
for i in range(how_many_lines):
self.info('')
# Switch back
self.removeHandler(self.blank_handler)
self.addHandler(self.console_handler)
def create_logger():
# Create a handler
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
console_handler.setFormatter(logging.Formatter(fmt="%(name)s %(levelname)-8s: %(message)s"))
# Create a "blank line" handler
blank_handler = logging.StreamHandler()
blank_handler.setLevel(logging.DEBUG)
blank_handler.setFormatter(logging.Formatter(fmt=''))
# Create a logger, with the previously-defined handler
logger = logging.getLogger('logging_test')
logger.setLevel(logging.DEBUG)
logger.addHandler(console_handler)
# Save some data and add a method to logger object
logger.console_handler = console_handler
logger.blank_handler = blank_handler
logger.newline = types.MethodType(log_newline, logger)
return logger
if __name__ == '__main__':
logger = create_logger()
logger.info('Start reading database')
logger.info('Updating records ...')
logger.newline()
logger.info('Finish updating records')
</code></pre>
<p>输出是您想要看到的:</p>
<pre><code>logging_test INFO : Start reading database
logging_test INFO : Updating records ...
logging_test INFO : Finish updating records
</code></pre>
<h2>讨论</h2>
<ul>
<li>如果你能忍受不太完美的输出,那么方法1就是方法。它的优点是简单、省力。</li>
<li>第二种方法正确地完成了任务,但是它有点复杂。它创建两个不同的处理程序,并切换它们以实现您的目标。</li>
<li>使用方法2的另一个缺点是必须通过搜索<code>logging</code>并用<code>logger</code>替换它们来更改代码。您必须注意只替换相关部分,并保留诸如<code>logging.DEBUG</code>这样的文本。</li>
</ul>