我创建了一个用 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 中的 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()仅在发生不可打印的异常时才会被调用。
升级到新版本应该可以解决记录多行回溯的问题。