如何禁用和重新启用在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