阻止GCP错误报告从日志消息的中间记录嵌套堆栈跟踪



我在try/except块中有一个代码块,它抛出/捕获异常(在一种情况下为psycopg2,在另一种情况中为CRCError(。使用标准库记录异常(下面的示例代码(。

GCP错误报告正在记录捕获的异常(缺少上下文(。

我们如何才能做到以下几点?

  • 确保我的异常和上下文异常显式显示在错误报告控制台中。-我实际上知道这里的答案是[明确使用错误报告客户端][1],就像我在其他地方所做的那样,或者允许不捕获异常(在这种情况下是不可取的,因为它会改变执行流(
  • 阻止GCP显式地记录这些"数据";错误"-这是让我为难的部分。我不想明确地接受捕获的异常的堆栈跟踪。这与我为整个应用程序配置日志记录的方式有关吗?请注意GCP日志资源管理器如何在下面显示两个单独的条目

处理/记录OSError的示例代码:

try:
with open(out_path, 'wb') as fout:
with gzip.open(in_path, 'rb') as fin:
shutil.copyfileobj(fin, fout)
except Exception:
LOGGER.exception("Fatal error decompressing %s to %s, skipping", in_path, out_path)

相应的错误报告条目:

OSError: CRC check failed 0xa3d2ba37 != 0xb3b0d715
at _read_eof (/usr/local/lib/python3.7/gzip.py:512)
at read (/usr/local/lib/python3.7/gzip.py:465)
at readinto (/usr/local/lib/python3.7/_compression.py:68)
at read (/usr/local/lib/python3.7/gzip.py:287)
at copyfileobj (/usr/local/lib/python3.7/shutil.py:79)
at gunzip (xxx:NN)

日志资源管理器显示两个单独的条目:

{
"textPayload": "2021-12-09 20:49:08,918 - __main__ - ERROR - Fatal error decompressing 0001.bin.gz to 0001.bin, skippingn",
"insertId": "insertId1",
"resource": {
"type": "k8s_container",
...
},
"timestamp": "2021-12-09T20:49:08.918859648Z",
"severity": "ERROR",
"logName": "projects/myproject/logs/stderr",
"receiveTimestamp": "2021-12-09T20:49:10.383920475Z"
}
{
"textPayload": "Traceback (most recent call last):n  File "xxx.py", line NN, in gunzipn    shutil.copyfileobj(fin, fout)n  File "/usr/local/lib/python3.7/shutil.py", line 79, in copyfileobjn    buf = fsrc.read(length)n  File "/usr/local/lib/python3.7/gzip.py", line 287, in readn    return self._buffer.read(size)n  File "/usr/local/lib/python3.7/_compression.py", line 68, in readinton    data = self.read(len(byte_view))n  File "/usr/local/lib/python3.7/gzip.py", line 465, in readn    self._read_eof()n  File "/usr/local/lib/python3.7/gzip.py", line 512, in _read_eofn    hex(self._crc)))nOSError: CRC check failed 0xa3d2ba37 != 0xb3b0d715n",
"insertId": "insertId2",
"resource": {
"type": "k8s_container",
...
},
"timestamp": "2021-12-09T20:49:08.918931417Z",
"severity": "ERROR",
"logName": "projects/myproject/logs/stderr",
"receiveTimestamp": "2021-12-09T20:49:10.383920475Z"
}

您可以尝试使用Sink设置排除筛选器。这将帮助您排除匹配的日志条目被路由到接收器的目的地或被云日志捕获。

单击此链接可获取有关创建水槽的完整指南。

  1. 在云控制台中,转到日志记录>日志路由器页面
  2. 选择一个现有的云项目
  3. 选择创建接收器
  4. 输入接收器名称和说明
  5. 选择接收器目标
  6. 选择要包含在接收器中的日志
  7. 选择要从接收器中排除的日志
    a。在"排除筛选器名称"字段中,输入一个名称
    b。在"生成排除筛选器"字段中,输入与要排除的日志项匹配的筛选器表达式。您还可以使用示例函数来选择要排除的日志项的一部分

下面是筛选器示例的链接。