Python 3.x Python:创建日志自定义处理程序并配置现有配置文件,以将日志重定向到输出小部件
注意:这是我的第一篇帖子。我试着先寻找我的答案,抱歉没有找到它是否已经存在。如果我对这篇文章有任何错误,请通知我,教我,帮助我改进。 我有一个Python脚本,分为不同的类,使用日志模块显示各种消息。通过以下配置文件完成日志记录设置:Python 3.x Python:创建日志自定义处理程序并配置现有配置文件,以将日志重定向到输出小部件,python-3.x,logging,widget,handler,jupyter-lab,Python 3.x,Logging,Widget,Handler,Jupyter Lab,注意:这是我的第一篇帖子。我试着先寻找我的答案,抱歉没有找到它是否已经存在。如果我对这篇文章有任何错误,请通知我,教我,帮助我改进。 我有一个Python脚本,分为不同的类,使用日志模块显示各种消息。通过以下配置文件完成日志记录设置: [loggers] keys=root, main , [...list of loggers...] [handlers] keys=consoleHandler, fileHandler [formatters] keys=simpleFormatter
[loggers]
keys=root, main , [...list of loggers...]
[handlers]
keys=consoleHandler, fileHandler
[formatters]
keys=simpleFormatter
[logger_root]
level=DEBUG
handlers=consoleHandler
[logger_main]
level=DEBUG
handlers=consoleHandler, fileHandler
qualname=main
propagate=0
[...all loggers...]
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)
[handler_fileHandler]
class=FileHandler
level=DEBUG
formatter=simpleFormatter
args=('logconfig.log',)
[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=
class=logging.Formatter
然后在每个模块开头的脚本中调用,如下所示:
logging.config.fileConfig('logging.conf')
logger = logging.getLogger('main')
这在单独运行脚本时工作得非常好
现在,我需要通过%runmagic命令在Jupyter笔记本中运行我的脚本,该命令也可以正常运行。但从这里开始,我想做的是将日志记录的任何输出重定向到输出小部件。因此,在运行脚本的前一个单元格中,我(尝试)声明了一个自定义处理程序:
class OutputWidgetHandler(logging.StreamHandler):
""" Custom logging handler sending logs to an output widget """
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
layout = {
'width': '80%',
'height': '160px',
'border': '1px solid black'
}
self.out = widgets.Output(layout=layout)
display(self.out)
def emit(self, record):
""" Overload of logging.Handler method """
formatted_record = self.format(record)
new_output = {
'name': 'stdout',
'output_type': 'stream',
'text': formatted_record+'\n'
}
self.out.outputs = (new_output, ) + self.out.outputs
使用以下内容绑定到配置文件:
logging.handlers.OutputWidgetHandler = OutputWidgetHandler
logging.config.fileConfig('logging.conf')
我相应地用以下内容更新配置:
[handlers]
keys= OutputWidgetHandler, consoleHandler, fileHandler
[logger_main]
level=DEBUG
handlers= OutputWidgetHandler, fileHandler
qualname=main
propagate=0
[...]
[handler_OutputWidgetHandler]
class=handlers.OutputWidgetHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)
到目前为止,我的代码都是基于这个答案的
但我似乎运气不好,因为在下面的笔记本单元中运行脚本时,日志输出似乎无法连接到自定义的OutpuWidgetHandler
,因此在创建的输出小部件中不会显示任何内容
谢谢你的帮助,如果你有任何线索,任何想法都是受欢迎的,可能会解决这个问题。干杯