Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何手动设置Google应用程序引擎请求日志的严重性?_Python 3.x_Google App Engine_Logging_Google Cloud Platform_Stackdriver - Fatal编程技术网

Python 3.x 如何手动设置Google应用程序引擎请求日志的严重性?

Python 3.x 如何手动设置Google应用程序引擎请求日志的严重性?,python-3.x,google-app-engine,logging,google-cloud-platform,stackdriver,Python 3.x,Google App Engine,Logging,Google Cloud Platform,Stackdriver,我在谷歌应用程序引擎Python 3标准环境中有一个应用程序。我已将其设置为按请求对日志条目进行分组,如中所述(在“查看相关请求日志条目”部分) 该页指出: “子”日志条目的最高严重性不会自动应用于顶级条目。如果需要该行为,请在顶级条目中手动设置最高严重性 问题中的顶级条目是应用程序引擎自动创建的请求日志。它始终处于日志级别“Any”。我不知道如何更改其日志级别/严重性 以下是我现在掌握的(一个分支)代码: import os from flask import request from goo

我在谷歌应用程序引擎Python 3标准环境中有一个应用程序。我已将其设置为按请求对日志条目进行分组,如中所述(在“查看相关请求日志条目”部分)

该页指出:

“子”日志条目的最高严重性不会自动应用于顶级条目。如果需要该行为,请在顶级条目中手动设置最高严重性

问题中的顶级条目是应用程序引擎自动创建的请求日志。它始终处于日志级别“Any”。我不知道如何更改其日志级别/严重性

以下是我现在掌握的(一个分支)代码:

import os
from flask import request
from google.cloud import logging as gcp_logging
from google.cloud.logging.resource import Resource

client = gcp_logging.Client()
logger = client.logger('my_custom_log_type')
trace_id = (f"projects/{os.environ['GOOGLE_CLOUD_PROJECT']}/traces/"
            f"{request.headers['X-Cloud-Trace-Context'].split('/')[0]}")
res = Resource(type='gae_app',
               labels={'project_id': os.environ['GOOGLE_CLOUD_PROJECT'],
                       'module_id': os.environ['GAE_SERVICE'],
                       'version_id': os.environ['GAE_VERSION']})
logger.log_text('Sample log text', resource=res, trace=trace_id, severity='INFO')
将日志与它们的请求进行分组非常有效,但是父(请求)日志,例如

> * 2019-11-19 15:54:56.613 EST  GET  200  1.21 KiB  390ms  Chrome 78  /

以“任意”日志级别显示。我希望它是“信息”或“错误”,视情况而定。我怎样才能做到这一点呢?

我还没有找到一种方法来修补自动生成的日志

我仍然对是否有更好的方法感兴趣,所以我不认为这个答案被接受

但是我已经找到了一个几乎可以满足我需求的解决方法,通过添加我自己的请求日志并忽略自动生成的日志

对于每个子日志,我使用与问题代码中相同的想法,但在flask的
g
对象上更新一个新属性,以跟踪到目前为止请求中最严重的日志级别

from flask import g

LOG_LEVELS = ('DEFAULT', 'DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')

previous_level = g.get('log_level', 0)
g.log_level = max(previous_level, new_level)
(其中new_level是
LOG_LEVELS
中级别的整数索引)

然后,为了生成新的请求日志,我使用了以下的缩小版本:

上述内容位于
我的日志记录
模块中。然后,只需对
main.py
添加几项即可:

import time
from flask import g
import my_logging

@app.before_request
def setup_timing():
    g.request_start_time = time.time()
    g.request_duration = lambda: f'{(time.time() - g.request_start_time):.5f}s'

@app.after_request
def log_request(response):
    my_logging.log_request(response)
    return response

这是相当好的工作-我很想听到任何想法,使它更好。

我不认为你可以。记录的请求来自Google,而不是您的应用程序。Google Frontend(GFE)位于发送到您的应用程序的应用程序引擎代理请求的前面。使用这种方法,您是否仍然会得到嵌套在它下面的其他日志项?@BogdanDumitru如果您使用子日志(如问题中的代码)和父日志(如此答案中)的组合,然后,只要父对象可见,所有子对象都将嵌套在父对象下。请注意,如果您不想同时单独查看子对象,则需要确保Stackdriver的筛选器不包含子对象的日志类型(“在本例中为my_custom_log_type”)。是的,我最终自己实现了这种方法,目前为止,它比内置方法工作得更好,因此感谢!管理与请求关联的任意标签,然后使用这些标签在UI中过滤请求,也会容易得多。@SteveMcClellan我正在尝试实现您的解决方案。但到目前为止还没有成功。我问了一个新问题。你能看一看吗?@Kumar唉,这就是我所有的了。上面的乱七八糟对于我正在进行的项目来说已经足够好了,从那以后我就再也没有使用过appengine日志。据我所知,约翰·汉利对这个问题的评论是正确的,自动生成的日志无法调整。
import time
from flask import g
import my_logging

@app.before_request
def setup_timing():
    g.request_start_time = time.time()
    g.request_duration = lambda: f'{(time.time() - g.request_start_time):.5f}s'

@app.after_request
def log_request(response):
    my_logging.log_request(response)
    return response