<p>上面的答案不是很正确-它只是将显示来自其他模块的消息的条设置得更高。</p>
<p>一个非常快速的方法是使用这段代码:</p>
<pre><code>import logging.config
logging.config.dictConfig({
'version': 1,
'disable_existing_loggers': True,
})
</code></pre>
<p>您必须在导入所有模块后设置此项-它将禁用在此之前创建的所有记录器。这在大多数情况下都会起作用,但是有些模块在创建类实例时会创建它们的记录器(这将在稍后的代码中发生)。</p>
<hr/>
<p>当您根据基本的python教程设置记录器时,它们会告诉您使用<code>logging.basicConfig(...)</code>。这是一个问题,因为这会将处理程序(也就是日志将被路由到的位置)设置为<code>logging.lastResort</code>,这是一个从Python 3.2开始的stderr,用于进程中全局的<em>所有</em>记录器。这意味着您现在已经为所有模块启用了完整日志记录。</p>
<p>因此,更好的方法是只为您的模块创建一个不同的记录器,并给它一些自己的处理程序,而不是使用<code>basicConfig()</code>。</p>
<p>有两种方法:</p>
<p>1)所有功能:</p>
<pre><code>import logging
log = logging.getLogger(__name__)
log.setLevel(logging.DEBUG)
formatter = logging.Formatter(fmt="%(asctime)s %(levelname)s: %(message)s",
datefmt="%Y-%m-%d - %H:%M:%S")
ch = logging.StreamHandler(sys.stdout)
ch.setLevel(logging.DEBUG)
ch.setFormatter(formatter)
fh = logging.FileHandler("mylog.log", "w")
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
log.addHandler(ch)
log.addHandler(fh)
</code></pre>
<p>这将为您提供日志记录器<code>log</code>,然后您可以像<code>log.error("Error found")</code>那样使用它。它将写入一个名为mylog.log的新文件,还将记录so sys.stdout。你当然可以随意改变。</p>
<p>2)使用听写:</p>
<pre><code>import logging
import logging.config
DEFAULT_LOGGING = {
'version': 1,
'formatters': {
'standard': {
'format': '%(asctime)s %(levelname)s: %(message)s',
'datefmt': '%Y-%m-%d - %H:%M:%S' },
},
'handlers': {
'console': {'class': 'logging.StreamHandler',
'formatter': "standard",
'level': 'DEBUG',
'stream': sys.stdout},
'file': {'class': 'logging.FileHandler',
'formatter': "standard",
'level': 'DEBUG',
'filename': 'live_detector.log','mode': 'w'}
},
'loggers': {
__name__: {'level': 'INFO',
'handlers': ['console', 'file'],
'propagate': False },
}
}
logging.config.dictConfig(DEFAULT_LOGGING)
log = logging.getLogger(__name__)
</code></pre>
<p>这将给出与上述相同的结果,更长一点,但可能更容易阅读。这也将自动设置<code>'disable_existing_loggers': True</code>。如果不需要,则必须添加并将其设置为False。</p>