如何防止Python中的gRPC服务器记录多行回溯

问题描述 投票:0回答:1

我创建了一个用 python 编写的 grpc 服务器。当出现错误时,我需要在服务器中引发异常,grpc/_servery.py中的此函数因引发的异常而失败。这导致程序打印仅使用打印功能的痕迹。有没有办法让这个功能使用用于所有其他日志记录的jsonlogger?

由于多行跟踪,我在 datadog 中收到相同错误的多行日志。如何修复多线痕迹。

服务器端示例代码

class UnaryService(pb2_grpc.UnaryServicer):

    def __init__(self, *args, **kwargs):
        pass

    def GetServerResponse(self, request, context):
        message = request.message
        raise Exception("error raised")

我尝试过以下方法:

  • 返回 None:我尝试在 gRPC 上下文中设置状态代码、错误详细信息,并在出现异常而不是引发异常时返回 None。从某种意义上说,这是有效的,它现在不记录跟踪,但我遇到了数据狗跟踪的问题。即使请求失败,也被视为成功。我还尝试向当前范围添加标签,但它仍然没有标记为失败。

  • 修补 print_exc():我采用的另一个解决方案是修补traceback.print_exc() 函数。这也有效,但我不喜欢这个解决方案,因为如果回溯或 grpc 库中发生了某些变化,它可能会受到影响。

og_print_exc = traceback.print_exc()

def patched_print_exc(*args, **kwargs):
    tb = traceback.format_exc()
    logger.error("error traceback: ", tb)

traceback.print_exc = patched_print_exc

有更好的方法来处理这种情况吗? 谢谢你

python python-3.x grpc python-logging grpc-python
1个回答
0
投票

我遇到了类似的问题,Python 中的 gRPC 服务器记录了多行回溯,导致 Datadog 中的同一错误出现多个日志行。我是这样解决的:

通过将grpcio从版本1.59.3升级到1.64.1,问题得到解决。

在grpcio==1.59.3中,grpc._server.py中的_call_behavior函数在发生异常时总是调用traceback.print_exc(),这会导致traceback被打印到终端。然而,在grpcio==1.64.1中,traceback.print_exc()仅在发生不可打印的异常时才会被调用。

升级到新版本应该可以解决记录多行回溯的问题。

© www.soinside.com 2019 - 2024. All rights reserved.