我们正在开发一个 python 程序/库,我们想为其设置一个日志系统。基本上我们想在终端上登录或在文件上登录。为此,我们将使用标准发行版中嵌入的优秀日志记录包。
用户应通过其首选项来自定义日志记录级别。我的问题是如何检索连接到记录器的处理程序之一?我在想一些类似这样的事情:
import logging
class NullHandler(logging.Handler):
def emit(self,record):
pass
HANDLERS = {}
HANDLERS['console'] = logging.StreamHandler()
HANDLERS['logfile'] = logging.FileHandler('test.log','w')
logging.getLogger().addHandler(NullHandler())
logging.getLogger('console').addHandler(HANDLERS['console'])
logging.getLogger('logfile').addHandler(HANDLERS['logfile'])
def set_log_level(handler, level):
if hanlder not in HANDLERS:
return
HANDLERS[handler].setLevel(level)
def log(message, level, logger=None):
if logger is None:
logger= HANDLERS.keys()
for l in logger:
logging.getLogger(l).log(level, message)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我的实现意味着使用 HANDLERS 全局字典来存储我创建的处理程序的实例。我找不到更好的方法来做到这一点。在该设计中,可以说,由于我只为每个记录器插入一个处理程序,因此我的记录器对象的处理程序属性应该没问题,但我正在寻找更通用的东西(即,如果有一天插入多个处理程序,该怎么办到我的一位记录器?)
你怎么看待这件事 ?
非常感谢
埃里克
您不仅可以设置处理程序的级别,还可以设置记录器的级别:
import logging
class NullHandler(logging.Handler):
def emit(self,record):
pass
logging.getLogger().addHandler(NullHandler())
logging.getLogger('console').addHandler(logging.StreamHandler())
logging.getLogger('console').info("foo")
logging.getLogger('console').setLevel(1000)
logging.getLogger('console').info("foo")
logging.getLogger('console').setLevel(1)
logging.getLogger('console').info("foo")
Run Code Online (Sandbox Code Playgroud)
请注意,处理程序的日志级别与此级别无关,并且处理程序仅在达到这两个级别时才记录日志。