将 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.logger
的 write 函数,这样它也可以写入日志文件。此修补程序可以由库参数触发。
这将要求您只修改库的构造函数。
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。
在我的一个项目中,我们在使用各种 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.logger
的 write 函数,这样它也可以写入日志文件。此修补程序可以由库参数触发。
这将要求您只修改库的构造函数。
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。