1

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

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

我们如何才能完成以下任务?

  • 确保我的异常与上下文异常明确显示在错误报告控制台中。- 我实际上知道这里的答案是[明确使用错误报告客户端][1],因为我已经在其他地方这样做了,或者允许未捕获异常(在这种情况下不希望出现,因为它会改变执行流程)。
  • 防止 GCP 显式记录这些“错误” - 这是让我难过的部分。我不想明确吞下捕获的异常的堆栈跟踪。这与我为整个应用程序配置日志记录的方式有关吗?请注意 GCP 日志资源管理器如何在下面显示 2 个单独的条目。

处理/记录 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, skipping\n",
    "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 gunzip\n    shutil.copyfileobj(fin, fout)\n  File \"/usr/local/lib/python3.7/shutil.py\", line 79, in copyfileobj\n    buf = fsrc.read(length)\n  File \"/usr/local/lib/python3.7/gzip.py\", line 287, in read\n    return self._buffer.read(size)\n  File \"/usr/local/lib/python3.7/_compression.py\", line 68, in readinto\n    data = self.read(len(byte_view))\n  File \"/usr/local/lib/python3.7/gzip.py\", line 465, in read\n    self._read_eof()\n  File \"/usr/local/lib/python3.7/gzip.py\", line 512, in _read_eof\n    hex(self._crc)))\nOSError: CRC check failed 0xa3d2ba37 != 0xb3b0d715\n",
    "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"
}
4

1 回答 1

0

您可以尝试使用Sink设置排除过滤器。这将帮助您排除匹配的日志条目被路由到接收器的目的地或被 Cloud Logging 提取。

单击此链接以获取有关创建接收器的完整指南。

  1. 在 GCP Console 中,转到日志记录 > 日志路由器页面。
  2. 选择现有的 Cloud 项目。
  3. 选择创建接收器
  4. 输入接收器名称和描述。
  5. 选择接收器目的地
  6. 选择要包含在接收器中的日志

  7. 选择要从接收器中排除的日志 在排除过滤器名称字段中,输入名称。
    湾。在构建排除过滤器字段中,输入与您要排除的日志条目匹配的过滤器表达式。您还可以使用示例函数来选择要排除的部分日志条目。

这是过滤器示例的链接。

于 2021-12-10T07:22:11.807 回答