在 RobotFramework 中截断 Post Request 的日志记录



我正在使用机器人框架的请求库将文件上传到服务器。文件 RequestsKeywords.py 有一行

logger.info('Post Request using : alias=%s, uri=%s, data=%s, headers=%s, files=%s, allow_redirects=%s '
% (alias, uri, dataStr, headers, files, redir))

这会在我的日志文件中的请求中打印出我的上传文件的全部内容。现在我可以通过更改日志级别来摆脱此日志,但是,我的目标是能够看到日志,但只是将其截断为 80 个字符,所以我不会浏览十六进制值行。知道这是怎么做到的吗?

解决方案是创建一个包装器方法,该方法将暂时禁用日志记录,并在完成后将其启用。

流程是 - 获取 RequestsLibrary 的实例,使用参数"ERROR"调用 RF 的Set Log Level(因此如果需要,至少会通过错误),调用原始关键字,将日志级别设置回原来的状态,然后返回结果。

这是它在python中的样子:

from robot.libraries.BuiltIn import BuiltIn

def post_request_no_log(*args, **kwargs):
req_lib = BuiltIn().get_library_instance('RequestsLibrary')
current_level = BuiltIn().set_log_level('ERROR')
try:
result = req_lib.post_request(*args, **kwargs)
except Exception as ex:
raise ex
finally:
BuiltIn().set_log_level(current_level)
return result

同样,在机器人框架语法中:

Post Request With No Logging
[Documentation]     Runs RequestsLibrary's Post Request, with its logging surpressed
[Arguments]     @{args}     &{kwargs}
${current level}=       Set Log Level   ERROR
${result}=      Post Request    @{args}     &{kwargs}
[Return]    ${result}
[Teardown]      Set Log Level   ${current level}

python的版本肯定会快几毫秒 - 不需要解析和匹配RF语法中的文本,大量使用可能会增加。

也许不是您要找的答案,但是在查看了请求库的来源之后,我认为这确实是不可取的,应该纠正。在调试或跟踪设置中运行时具有文件内容是有意义的,但在常规操作期间则不然。

由于我认为这是一个错误,因此我建议在 GitHub 项目页面上注册问题或自己更正并提供拉取请求。在我看来,应该重构代码以在信息设置下发送文件名,在跟踪/调试设置下发送文件内容:

logger.info('Post Request using : alias=%s, uri=%s, data=%s, headers=%s, allow_redirects=%s' % ...
logger.trace('Post Request files : files=%s' % ...

同时,您有两种选择。正如您正确所说,暂时减少机器人代码中的日志级别设置。如果您无法更改脚本,那么使用机器人框架侦听器可以帮助解决这个问题。当然,这比自己在 ReqestsLibrary 中进行更改会有更多的工作。

一个临时的替代方法是使用请求库Post,它已被弃用,但仍然存在。

如果你看一下 RequestKeywords 库中的方法,它只调用 self。 最后_body_request()。我们最终做的是编写另一个与原始关键字相同的关键字,除了它调用 logger.info() 的部分。我们将其修改为日志文件=%.80s,将文件截断为 80 个字符。

def post_request_truncated_logs(
self,
alias,
uri,
data=None,
params=None,
headers=None,
files=None,
allow_redirects=None,
timeout=None):
session = self._cache.switch(alias)
if not files:
data = self._format_data_according_to_header(session, data, headers)
redir = True if allow_redirects is None else allow_redirects
response = self._body_request(
"post",
session,
uri,
data,
params,
files,
headers,
redir,
timeout)
dataStr = self._format_data_to_log_string_according_to_header(data, headers)
logger.info('Post Request using : alias=%s, uri=%s, data=%s, headers=%s, files=%.80s, allow_redirects=%s '
% (alias, uri, dataStr, headers, files, redir))

相关内容

最新更新