2

在 python 2.7 中,应用引擎 sdk 在后台进行工作,将所有日志与父请求嵌套,以便在 Google StackDriver 中建立关联。

在过渡到 python 3 时,它是通过使用谷歌云日志记录或结构化日志记录,并且从我能找到的所有不同参考资料中,重要的是在堆栈驱动程序的“子”日志中具有相同的跟踪 ID与“请求”日志匹配。

正如您在下面看到的那样,它仍然显示为不同的日志。

对于上下文,我什至在应用引擎上部署的一个空的 django 项目上尝试了这个。

得到相同的结果,即使遵循文档中的示例: https ://cloud.google.com/run/docs/logging#writing_structured_logs

日志堆栈驱动程序

尝试登录到标准输出会给出相同的结果。

记录 StackDriver 2

编辑:

在初始请求之后,使用标准输出时,所有其他请求都将嵌套在初始请求下。

但是,“父”日志不采用“子”日志的最高严重性,因此过滤器不会获取实际日志。见下文:

在此处输入图像描述

4

2 回答 2

1

感谢您的提问!

看起来您正在正确记录跟踪,但您的 logName 表明您没有使用 stdout 或 stderr。如果您将其中之一用于您的日志,它们将正确关联,如下所示:

StackDriver 日志截图

可以看到 logName 以 stdout 结尾。标准输出或标准错误将相关。您可以按照教程中的此处所示创建它:

# Build structured log messages as an object.
global_log_fields = {}

# Add log correlation to nest all log messages
# beneath request log in Log Viewer.
trace_header = request.headers.get('X-Cloud-Trace-Context')

if trace_header and PROJECT:
    trace = trace_header.split('/')
    global_log_fields['logging.googleapis.com/trace'] = (
        f"projects/{PROJECT}/traces/{trace[0]}")

# Complete a structured log entry.
entry = dict(severity='NOTICE',
             message='This is the default display field.',
             # Log viewer accesses 'component' as jsonPayload.component'.
             component='arbitrary-property',
             **global_log_fields)

print(json.dumps(entry))

编辑:

要过滤掉标准输出并仅在堆栈驱动程序 UI 中看到请求日志,您可以从过滤器中取消选择标准输出。 日志过滤器

有关使用 python 客户端 API 的示例,请参阅本文和附加的示例 Flask 应用程序。 在 Google Stackdriver 中组合相关的日志行

于 2019-11-15T00:22:30.010 回答
0

我能够在 Google Cloud Logging Console 上实现这种日志记录结构:在此处输入图像描述

我正在使用 Django 框架。我编写了集成了 Google Cloud Logging API 的 Django 中间件。

需要将“Trace”添加到指向其父日志对象的每个日志对象。

请检查使用 Django 在 Google Stackdriver 中管理日志嵌套

请查看Github 上的 django-google-stackdriver-nested-logging log_middleware.py 源代码。

于 2020-05-18T13:17:48.560 回答