如何禁用和重新启用在Python中的控制台日志logging?
我正在使用python 日志logging模块,我想禁用一段时间的控制台日志logging,但它不起作用。
#!/usr/bin/python import logging logger = logging.getLogger() # this gets the root logger # ... here I add my own handlers #logger.removeHandler(sys.stdout) #logger.removeHandler(sys.stderr) print logging.handlers # this will print [<logging.StreamHandler instance at ...>] # but I may have other handlers there that I want to keep logger.debug("bla bla")
上面的代码在stdout上显示“bla bla”,我不知道如何安全地禁用控制台处理程序。 我怎样才能确定我暂时删除了控制台stream处理程序,而不是另一个?
我find了一个解决scheme:
logger = logging.getLogger('my-logger') logger.propagate = False # now if you use logger it will not log to console.
这将防止logging被发送到包含控制台日志logging的上级logging器。
我用:
logger = logging.getLogger() logger.disabled = True ... whatever you want ... logger.disabled = False
您可以使用:
logging.basicConfig(level=your_level)
其中your_level是其中之一:
'debug': logging.DEBUG, 'info': logging.INFO, 'warning': logging.WARNING, 'error': logging.ERROR, 'critical': logging.CRITICAL
所以,如果您将your_level设置为logging.CRITICAL ,您将只收到关键的消息:
logging.critical('This is a critical error message')
将your_level设置为logging.DEBUG将显示所有日志级别。
有关更多详细信息,请参阅logging示例。
以同样的方式改变每个Handler的级别使用Handler.setLevel()函数。
import logging import logging.handlers LOG_FILENAME = '/tmp/logging_rotatingfile_example.out' # Set up a specific logger with our desired output level my_logger = logging.getLogger('MyLogger') my_logger.setLevel(logging.DEBUG) # Add the log message handler to the logger handler = logging.handlers.RotatingFileHandler( LOG_FILENAME, maxBytes=20, backupCount=5) handler.setLevel(logging.CRITICAL) my_logger.addHandler(handler)
(长期死的问题,但对于未来的search者)
接近原始的海报的代码/意图,这对我在Python 2.6下工作
#!/usr/bin/python import logging logger = logging.getLogger() # this gets the root logger lhStdout = logger.handlers[0] # stdout is the only handler initially # ... here I add my own handlers f = open("/tmp/debug","w") # example handler lh = logging.StreamHandler(f) logger.addHandler(lh) logger.removeHandler(lhStdout) logger.debug("bla bla")
我必须解决的问题是添加一个新的stdout处理程序, logging器代码似乎自动重新添加stdout如果没有处理程序存在。
上下文pipe理器
import logging class DisableLogger(): def __enter__(self): logging.disable(logging.CRITICAL) def __exit__(self, a, b, c): logging.disable(logging.NOTSET)
使用示例:
with DisableLogger(): do_something()
这里有一些非常好的答案,但显然最简单的是没有考虑太多(仅来自infinito)。
root_logger = logging.getLogger() root_logger.disabled = True
这将禁用根logging器,从而禁用所有其他logging器。 我没有真正的testing,但它也应该是最快的。
从Python 2.7中的日志代码我看到这个
def handle(self, record): """ Call the handlers for the specified record. This method is used for unpickled records received from a socket, as well as those created locally. Logger-level filtering is applied. """ if (not self.disabled) and self.filter(record): self.callHandlers(record)
这意味着当它被禁用时,不会调用处理函数,而且应该更有效率,例如过滤为非常高的值或设置无操作符处理函数。
不需要转移标准输出。 这是更好的方法来做到这一点:
import logging class MyLogHandler(logging.Handler): def emit(self, record): pass logging.getLogger().addHandler(MyLogHandler())
更简单的方法是:
logging.getLogger().setLevel(100)
完全禁用日志logging :
logging.disable(sys.maxint)
启用日志logging :
logging.disable(logging.NOTSET)
其他答案提供了解决问题的方法,例如
logging.getLogger().disabled = True
而对于一些大于50的n
,
logging.disable(n)
第一个解决scheme的问题是,它只适用于根logging器。 其他使用logging.getLogger(__name__)
创build的logging器不会被此方法禁用。
第二个解决scheme确实影响所有日志。 但是它将输出限制在给定的水平以上,所以可以通过logging大于50的水平来覆盖输出。
这可以通过
logging.disable(sys.maxint)
据我所知(审查来源后 )是完全禁用日志logging的唯一方法。
我不太了解日志logging模块,但是我通常只想禁用debugging(或信息)消息。 您可以使用Handler.setLevel()
将日志logging级别设置为CRITICAL或更高。
另外,你可以用一个打开的文件来代替sys.stderr和sys.stdout。 请参阅http://docs.python.org/library/sys.html#sys。; stdout 。 但我不会推荐的。
你也可以:
handlers = app.logger.handlers # detach console handler app.logger.handlers = [] # attach app.logger.handlers = handlers