将 robot.api.logger 调用重定向到文件,因为 XML-RPC 导致消息不可见

Redirect robot.api.logger calls to file as messages are invisible due to XML-RPC

在我的一个项目中,我们在使用各种 ECU 和 PC 的复杂测试环境中使用带有自定义关键字库的 Robot Framework。一个关键字库必须由 python 远程服务器通过 XML-RPC 控制,因为它必须在另一台 PC 上。

现在,由于 XML-RPC,来自 robot.api.logger 调用的所有重要消息,例如 logger.debug()logger.console() 都被吞没了。这是一个已知问题,在 docs.

中也有明确说明

For most parts these APIs work exactly like when using with Robot Framework normally. There main limitation is that logging using robot.api.logger or Python's logging module is currently not supported.

可以为 robot.api.logger 编写一个精简的包装器或装饰器,以便所有调试消息都重定向到一个简单的 txt 文件,例如:

DEBUG HH:MM:SS > Message
WARN  HH:MM:SS > Message

如果出现问题,这将非常有用。

当然,使用内置的 python 日志模块会很容易,但是 我正在寻找一个解决方案,它对现有代码的更改最少,而且我还希望将结果写入机器人报告正常 robot.api.logging 之外的文本文件,因为我们使用的是相同的本地和远程方式的图书馆。

所以基本上我需要找到一种方法来调用 extend/redirected robot.api.logger,方法是首先使用正常的 python 日志记录模块,然后使用正常的 robot.api.logger

您可以修补 robot.api.loggerwrite 函数,这样它也可以写入日志文件。此修补程序可以由库参数触发。 这将要求您只修改库的构造函数。

RemoteLib.py

import sys

from robot.api import logger
from robot.output import librarylogger

from robotremoteserver import RobotRemoteServer
   
def write(msg, level='INFO', html=False):
    librarylogger.write(msg, level, html)
    with open('log.txt', 'a') as f:
        print(f'{level}\tHH:MM:SS > {msg}', file=f)
    

class RemoteLib():
    ROBOT_LIBRARY_SCOPE = 'GLOBAL'
    ROBOT_LIBRARY_VERSION = 0.1
    
    def __init__(self, to_file=True):
        if to_file:
            logger.write = write
        
    def log_something(self, msg):
        logger.info(msg)
        logger.debug(msg)
        logger.warn(msg)
        logger.trace(msg)
        logger.error(msg)
        logger.console(msg)
        
if __name__ == '__main__':
    RobotRemoteServer(RemoteLib(), *sys.argv[1:])

local_run.robot

*** Settings ***
Library    RemoteLib    to_file=False

*** Test Cases ***
Test
    Log Something    something    

remote_run.robot

*** Settings ***
Library       Remote    http://127.0.0.1:8270

*** Test Cases ***
Test
    Log Something    something    

您也可以在 write 补丁中使用 Python 日志记录模块,就像在 Robot Framework 本身中使用的一样,Redirects the robot.api.logger to python logging if robot is not running