sor*_*rin 134 python console logging stdout
我正在使用Python的日志记录模块,我想暂时禁用控制台日志记录,但它不起作用.
#!/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 logger.handlers
# this will print [<logging.StreamHandler instance at ...>]
# but I may have other handlers there that I want to keep
logger.debug("bla bla")
Run Code Online (Sandbox Code Playgroud)
上面的代码显示了bla bla
on stdout,我不知道如何安全地禁用控制台处理程序.我怎么能确定我暂时删除了控制台StreamHandler而不是另一个?
sor*_*rin 183
我找到了一个解决方案:
logger = logging.getLogger('my-logger')
logger.propagate = False
# now if you use logger it will not log to console.
Run Code Online (Sandbox Code Playgroud)
这将阻止将日志记录发送到包含控制台日志记录的上部记录程序.
inf*_*ito 92
我用:
logger = logging.getLogger()
logger.disabled = True
... whatever you want ...
logger.disabled = False
Run Code Online (Sandbox Code Playgroud)
Vad*_*kus 66
您可以使用:
logging.basicConfig(level=your_level)
Run Code Online (Sandbox Code Playgroud)
其中your_level是其中之一:
'debug': logging.DEBUG,
'info': logging.INFO,
'warning': logging.WARNING,
'error': logging.ERROR,
'critical': logging.CRITICAL
Run Code Online (Sandbox Code Playgroud)
因此,如果将your_level设置为logging.CRITICAL,则只会发送以下关键消息:
logging.critical('This is a critical error message')
Run Code Online (Sandbox Code Playgroud)
将your_level设置为logging.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)
Run Code Online (Sandbox Code Playgroud)
小智 45
(长期存在的问题,但未来的搜索者)
更接近原始海报的代码/意图,这在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")
Run Code Online (Sandbox Code Playgroud)
我必须解决的问题是在添加新的stdout处理程序后删除它; 如果没有处理程序,则记录器代码似乎会自动重新添加标准输出.
pym*_*men 36
上下文管理器
import logging
class DisableLogger():
def __enter__(self):
logging.disable(logging.CRITICAL)
def __exit__(self, a, b, c):
logging.disable(logging.NOTSET)
Run Code Online (Sandbox Code Playgroud)
使用示例:
with DisableLogger():
do_something()
Run Code Online (Sandbox Code Playgroud)
sta*_*fry 33
要完全禁用日志记录:
logging.disable(sys.maxint) # Python 2
logging.disable(sys.maxsize) # Python 3
Run Code Online (Sandbox Code Playgroud)
要启用日志记录:
logging.disable(logging.NOTSET)
Run Code Online (Sandbox Code Playgroud)
其他答案提供的工作不能完全解决问题,例如
logging.getLogger().disabled = True
Run Code Online (Sandbox Code Playgroud)
对于n
超过50的人,
logging.disable(n)
Run Code Online (Sandbox Code Playgroud)
第一个解决方案的问题是它只适用于根记录器.例如,使用logging.getLogger(__name__)
此方法禁用的其他记录器不会被禁用.
第二种解决方案会影响所有日志.但它将输出限制在高于给定值的水平,因此可以通过以大于50的级别记录来覆盖它.
这可以通过以下方式预防
logging.disable(sys.maxint)
Run Code Online (Sandbox Code Playgroud)
据我所知(在查看源代码之后)是完全禁用日志记录的唯一方法.
and*_*tti 25
这里有一些非常好的答案,但显然最简单的是没有考虑太多(仅限于infinito).
root_logger = logging.getLogger()
root_logger.disabled = True
Run Code Online (Sandbox Code Playgroud)
这会禁用根记录器,从而禁用所有其他记录器.我还没有真正测试,但它也应该是最快的.
从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)
Run Code Online (Sandbox Code Playgroud)
这意味着当它被禁用时,不会调用任何处理程序,例如,过滤到非常高的值或设置无操作处理程序应该更有效.
Mag*_*ero 12
日志具有以下结构:
logging.WARNING
默认为根记录器,logging.NOTSET
默认为非根记录器)和有效级别(父记录器的有效级别,用于非根记录器logging.NOTSET
的级别,否则为记录器的级别);logging.NOTSET
默认情况下);日志记录有以下过程(用流程图表示):
因此,要禁用特定记录器,您可以采用以下策略之一:
将记录器的级别设置为logging.CRITICAL + 1
.
使用主 API:
import logging
logger = logging.getLogger("foo")
logger.setLevel(logging.CRITICAL + 1)
Run Code Online (Sandbox Code Playgroud)
使用配置 API:
import logging.config
logging.config.dictConfig({
"version": 1,
"loggers": {
"foo": {
"level": logging.CRITICAL + 1
}
}
})
Run Code Online (Sandbox Code Playgroud)
lambda record: False
向记录器添加过滤器。
使用主 API:
import logging
logger = logging.getLogger("foo")
logger.addFilter(lambda record: False)
Run Code Online (Sandbox Code Playgroud)
使用配置 API:
import logging.config
logging.config.dictConfig({
"version": 1,
"filters": {
"all": {
"()": lambda: (lambda record: False)
}
},
"loggers": {
"foo": {
"filters": ["all"]
}
}
})
Run Code Online (Sandbox Code Playgroud)
除去记录器的现存的处理器,添加处理程序logging.NullHandler()
的记录器(以防止从该处理程序被处理的事件logging.lastResort
是一种logging.StreamHandler
使用当前流sys.stderr
和一个电平logging.WARNING
)和属性集propagate
的记录器,以False
(以防止正被处理的事件由记录器的祖先记录器的处理程序)。
使用主 API:
import logging
logger = logging.getLogger("foo")
for handler in logger.handlers.copy():
try:
logger.removeHandler(handler)
except ValueError: # in case another thread has already removed it
pass
logger.addHandler(logging.NullHandler())
logger.propagate = False
Run Code Online (Sandbox Code Playgroud)
使用配置 API:
import logging.config
logging.config.dictConfig({
"version": 1,
"handlers": {
"null": {
"class": "logging.NullHandler"
}
},
"loggers": {
"foo": {
"handlers": ["null"],
"propagate": False
}
}
})
Run Code Online (Sandbox Code Playgroud)
警告。— 策略 1 和 2 只防止记录器记录的事件被记录器及其祖先记录器的处理程序发出,策略 3 还防止记录器的后代记录器(例如logging.getLogger("foo.bar")
)记录的事件被记录器发出记录器及其祖先记录器的处理程序。
笔记。— 将disabled
记录器的属性设置True
为不是另一种策略,因为它不是公共 API 的一部分(参见https://bugs.python.org/issue36318):
import logging
logger = logging.getLogger("foo")
logger.disabled = True # DO NOT DO THIS
Run Code Online (Sandbox Code Playgroud)
Ehs*_*ghi 10
无需转移标准输出.这是更好的方法:
import logging
class MyLogHandler(logging.Handler):
def emit(self, record):
pass
logging.getLogger().addHandler(MyLogHandler())
Run Code Online (Sandbox Code Playgroud)
更简单的方法是:
logging.getLogger().setLevel(100)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
136071 次 |
最近记录: |