【问题标题】:Truncating logging of Post Request in RobotFramework在 RobotFramework 中截断 Post 请求的日志记录
【发布时间】:2018-05-15 00:48:22
【问题描述】:

我正在使用机器人框架的 Requests 库将文件上传到服务器。文件 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 个字符,所以我不会浏览十六进制值的行。知道如何做到这一点吗?

【问题讨论】:

    标签: python-3.x robotframework


    【解决方案1】:

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

    流程是 - 获取 RequestsLibrary 的实例,使用参数“ERROR”调用 RF 的 Set Log Level(因此,如果需要,至少会出现错误),调用 original 关键字,将日志级别设置回原来的级别是,并返回结果。

    这是它在 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 语法中的文本,在大量使用时可能会累加。

    【讨论】:

      【解决方案2】:

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

      由于我认为这是一个错误,我建议使用 GitHub project page 注册问题或自行更正并提供拉取请求。在我看来,代码应该被重构以发送 info 设置下的文件名和 trace/debug 设置下的文件内容:

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

      与此同时,您有两个选择。如您所说,暂时降低机器人代码中的日志级别设置。如果您无法更改脚本,那么使用Robot Framework Listener 可以帮助解决这个问题。诚然,与自己在 ReqestsLibrary 中进行更改相比,工作量更大。

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

      【讨论】:

        【解决方案3】:

        如果您查看 RequestKeywords 库中的方法,它只会调用 self. _body_request() 最后。我们最终做的是编写另一个与原始关键字相同的关键字,除了它调用 logger.info() 的部分。我们将其修改为 log files=%.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))
        

        【讨论】:

        • 如果您将此更改公关到库中会不会更好 - 因此所有用户都会从中受益。而且,现在您有一个并行实现,因此您不会从上游的修复/更改中受益。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-08
        • 2012-11-07
        • 1970-01-01
        相关资源
        最近更新 更多