python-3.x - 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
,因此在创建的输出小部件中不显示任何内容。
如果您有任何线索,感谢您的帮助,欢迎任何想法,并可能解决这个问题。干杯。
解决方案
推荐阅读
- javascript - NestJS Nest 无法解析 RolesService 的依赖项(+、+、?)
- caching - 我们可以使用注释或 Java 反射在 GemFire PdxSerializer 之间转换字段吗?
- r - 在r中以不同方式替换字符串中的多个符号
- python - 如何通过函数传递数据帧并返回另一个数据帧?
- jquery - 在某些条件下禁用弹出窗口制作工具
- barcode-scanner - 霍尼韦尔 PyUSB 无按钮条码扫描器
- blueprism - 突出显示菜单项后,无法在 Web 应用程序的 Application Moduler 中监视菜单项
- python - Scrapy 返回垃圾数据,例如空格和换行符。我该如何过滤这些?
- java - ObjectBox 是否具有等效的 SQL Like 关键字
- sql-server - MDriven DB 逆向工程/Evolve DB 不起作用