Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Python:创建日志自定义处理程序并配置现有配置文件,以将日志重定向到输出小部件_Python 3.x_Logging_Widget_Handler_Jupyter Lab - Fatal编程技术网

Python 3.x 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

注意:这是我的第一篇帖子。我试着先寻找我的答案,抱歉没有找到它是否已经存在。如果我对这篇文章有任何错误,请通知我,教我,帮助我改进。

我有一个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')
这在单独运行脚本时工作得非常好

现在,我需要通过%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
,因此在创建的输出小部件中不会显示任何内容

谢谢你的帮助,如果你有任何线索,任何想法都是受欢迎的,可能会解决这个问题。干杯