【问题标题】:Google StackDriver correlating logs with parent request python 3Google StackDriver将日志与父请求python 3相关联
【发布时间】:2019-11-13 21:51:10
【问题描述】:

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

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

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

就上下文而言,我什至在应用引擎上部署的一个空的 django 项目上进行了尝试。

得到了相同的结果,即使按照文档中的示例进行操作: https://cloud.google.com/run/docs/logging#writing_structured_logs

尝试记录到标准输出会得到相同的结果。

编辑:

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

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

【问题讨论】:

    标签: python stackdriver google-cloud-stackdriver google-cloud-logging structured-logging


    【解决方案1】:

    感谢您的提问!

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

    StackDriver Logs Screenshot

    您可以看到 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 中看到请求日志,您可以从过滤器中取消选择标准输出。 Logs Filter

    有关使用 python 客户端 API 的示例,请参阅本文和随附的示例 Flask 应用程序。 Combining correlated Log Lines in Google Stackdriver

    【讨论】:

    • 谢谢!不幸的是,按照我所说的尝试它并没有关联我的日志。我确实使用标准输出尝试过,结果是一样的,请参阅更新的屏幕截图。
    • 你能再试一次吗?当您重新部署应用程序时,此消息将与日志相关联:“此请求为您的应用程序启动了一个新进程,从而导致您的应用程序代码首次加载。该请求可能会占用比应用程序的典型请求更长且使用更多 CPU。” - 当我重新部署我的应用程序时,我看到了同样的事情。但是当我重新加载页面时,自定义消息显示与请求日志相关。
    • 你是对的!它确实出现在请求中!但是日志出现了两次:一次在请求中,一次在自己的行中。你知道如何让多余的消失吗?
    • 另一个问题是“父”日志(请求)不采用“子”日志严重性,这使得所有请求日志都具有默认严重性。
    • 添加到答案中:您可以轻松过滤掉标准输出,使用 UI 中的过滤器仅查看请求日志。
    【解决方案2】:

    我能够在 Google Cloud Logging Console 上实现这种日志结构:

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

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

    请查看manage nesting of logs in Google Stackdriver with Django

    请在 Github 上查看django-google-stackdriver-nested-logginglog_middleware.py 源代码。

    【讨论】:

      猜你喜欢
      • 2020-02-13
      • 2020-04-09
      • 1970-01-01
      • 2020-03-16
      • 1970-01-01
      • 1970-01-01
      • 2019-01-29
      • 2019-12-24
      • 1970-01-01
      相关资源
      最近更新 更多