如何在Python中禁用标准错误流的日志记录?这行不通:
import logging
logger = logging.getLogger()
logger.removeHandler(sys.stderr)
logger.warning('foobar') # emits 'foobar' on sys.stderr
如何在Python中禁用标准错误流的日志记录?这行不通:
import logging
logger = logging.getLogger()
logger.removeHandler(sys.stderr)
logger.warning('foobar') # emits 'foobar' on sys.stderr
当前回答
使用装饰器找到了一个优雅的解决方案,它解决了以下问题:如果您正在编写一个具有多个函数的模块,每个函数都有几个调试消息,并且您希望禁用除当前关注的函数之外的所有函数的登录,该怎么办?
你可以使用装饰器:
import logging, sys
logger = logging.getLogger()
logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)
def disable_debug_messages(func):
def wrapper(*args, **kwargs):
prev_state = logger.disabled
logger.disabled = True
result = func(*args, **kwargs)
logger.disabled = prev_state
return result
return wrapper
然后,你可以这样做:
@disable_debug_messages
def function_already_debugged():
...
logger.debug("This message won't be showed because of the decorator")
...
def function_being_focused():
...
logger.debug("This message will be showed")
...
即使从function_being_focused内部调用function_already_debug,也不会显示来自function_already_debug的调试消息。 这确保您将只看到您所关注的函数的调试消息。
希望能有所帮助!
其他回答
(早就死了的问题,但对未来的搜索者来说)
更接近最初海报的代码/意图,这适用于我在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处理程序后删除它;如果没有处理程序,记录器代码将自动重新添加标准输出。
IndexOutOfBound修复:如果你得到一个IndexOutOfBound错误,而实例化lhStdout,移动实例化后添加你的文件处理程序,即。
...
logger.addHandler(lh)
lhStdout = logger.handlers[0]
logger.removeHandler(lhStdout)
我找到了一个解决方案:
logger = logging.getLogger('my-logger')
logger.propagate = False
# now if you use logger it will not log to console.
这将防止日志被发送到包含控制台日志的上层记录器。
这将防止所有来自第三个库的日志记录,就像这里描述的那样 https://docs.python.org/3/howto/logging.html#configuring-logging-for-a-library
logging.getLogger('somelogger').addHandler(logging.NullHandler())
你可以使用:
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设置为日志。DEBUG将显示所有级别的日志记录。
要了解更多详细信息,请查看日志示例。
以同样的方式更改每个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)
完全禁用日志记录:
logging.disable(sys.maxint) # Python 2
logging.disable(sys.maxsize) # Python 3
启用日志记录:
logging.disable(logging.NOTSET)
其他答案提供的工作并不能完全解决问题,例如
logging.getLogger().disabled = True
当n大于50时,
logging.disable(n)
第一个解决方案的问题是它只适用于根日志记录器。使用logging.getLogger(__name__)创建的其他记录器不会被此方法禁用。
第二个解决方案确实会影响所有日志。但是它将输出限制在给定级别之上,因此可以通过记录级别大于50的日志来覆盖它。
这可以通过
logging.disable(sys.maxint)
据我所知(在查看源代码后),这是完全禁用日志记录的唯一方法。