首页 > 解决方案 > Python:创建日志记录自定义处理程序并配置现有配置文件以将日志重定向到输出小部件

问题描述

注意:这是我的第一篇文章。我尝试先搜索我的答案,很抱歉没有找到它是否已经存在。如果我在这篇文章中做错了什么,请通知我,教我,帮助我改进。

我有一个分隔在不同类中的 Python 脚本,使用日志记录模块来显示各种消息。日志记录设置通过以下配置文件完成:

[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')

单独运行脚本时,这工作得很好。

现在,我需要通过%run魔术命令在 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,)

到目前为止,我的代码基于此答案 Use fileConfig to configure custom handlers in Python

但是我似乎很不幸,因为在以下笔记本单元格中运行脚本时,日志输出似乎无法连接到 custom OutpuWidgetHandler,因此在创建的输出小部件中不显示任何内容。

如果您有任何线索,感谢您的帮助,欢迎任何想法,并可能解决这个问题。干杯。

标签: python-3.xloggingwidgethandlerjupyter-lab

解决方案


推荐阅读