如何按请求捆绑 Cloud Logging 条目?
How to bundle Cloud Logging entries by request?
我尝试让 Cloud Logging 在 Cloud Logs Explorer 中按请求捆绑(即分组)日志条目,类似于 node-js-logging-winston 在 Cloud Functions 节点运行时所做的事情:
https://github.com/googleapis/nodejs-logging-winston#using-as-an-express-middleware
这也是 App Engine 自动执行的操作。
以下博客中有关于如何使用 Python 和 Flask 完成此操作的一般说明:
https://medium.com/google-cloud/combining-correlated-log-lines-in-google-stackdriver-dd23284aeb29
这是日志资源管理器中的屏幕截图。
这是一个应该执行此操作的脚本,但条目未按请求分组。
import argparse
import datetime
import time
import uuid
from google.cloud import logging
def _log_timestamp():
return datetime.datetime.now(datetime.timezone.utc)
def _log_trace_id():
return uuid.uuid4().hex
def _log_request_time(request_start_time):
return "%.5fs" % (time.time() - request_start_time)
def run(project_id):
request_start_time = time.time()
trace_id = _log_trace_id()
client = logging.Client(project=project_id)
app_logger = client.logger('child')
app_logger.log_struct(
{"message": 'app log entry # 1'},
severity='INFO',
trace=f'projects/{project_id}/traces/{trace_id}',
timestamp=_log_timestamp()
)
app_logger.log_struct(
{"message": 'app log entry # 2'},
severity='INFO',
trace=f'projects/{project_id}/traces/{trace_id}',
timestamp=_log_timestamp()
)
request_logger = client.logger('parent')
request_logger.log_struct(
{"message": 'TEXT'},
severity='INFO',
trace=f'projects/{project_id}/traces/{trace_id}',
timestamp=_log_timestamp(),
http_request=dict(
request_method='GET',
request_url='https://request.example.com/test-logging',
status=200,
user_agent='Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko)'
' Chrome/92.0.4515.107 Safari/537.36',
response_size=15773,
latency=_log_request_time(request_start_time),
remote_ip='127.0.0.1',
referer='https://referer.example.com/',
)
)
if __name__ == '__main__':
parser = argparse.ArgumentParser(
description=__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter
)
parser.add_argument('--project',
required=True,
help='Project ID')
args = parser.parse_args()
run(args.project)
这里是日志资源管理器的屏幕截图,显示请求未捆绑在一起:
谢谢。
我收到了来自 Google 云支持的答复。我问题中的代码很好。为了查看按请求捆绑的日志,有必要在日志资源管理器中过滤父 logName
。然后应用程序日志条目嵌套在请求日志条目中。如果父 logName
没有被特别过滤,那么它会在一个平面列表中显示所有日志条目(请求和应用程序),如我问题中的屏幕截图所示。
这是正确嵌套的日志条目的屏幕截图:
我尝试让 Cloud Logging 在 Cloud Logs Explorer 中按请求捆绑(即分组)日志条目,类似于 node-js-logging-winston 在 Cloud Functions 节点运行时所做的事情: https://github.com/googleapis/nodejs-logging-winston#using-as-an-express-middleware 这也是 App Engine 自动执行的操作。
以下博客中有关于如何使用 Python 和 Flask 完成此操作的一般说明: https://medium.com/google-cloud/combining-correlated-log-lines-in-google-stackdriver-dd23284aeb29
这是日志资源管理器中的屏幕截图。
这是一个应该执行此操作的脚本,但条目未按请求分组。
import argparse
import datetime
import time
import uuid
from google.cloud import logging
def _log_timestamp():
return datetime.datetime.now(datetime.timezone.utc)
def _log_trace_id():
return uuid.uuid4().hex
def _log_request_time(request_start_time):
return "%.5fs" % (time.time() - request_start_time)
def run(project_id):
request_start_time = time.time()
trace_id = _log_trace_id()
client = logging.Client(project=project_id)
app_logger = client.logger('child')
app_logger.log_struct(
{"message": 'app log entry # 1'},
severity='INFO',
trace=f'projects/{project_id}/traces/{trace_id}',
timestamp=_log_timestamp()
)
app_logger.log_struct(
{"message": 'app log entry # 2'},
severity='INFO',
trace=f'projects/{project_id}/traces/{trace_id}',
timestamp=_log_timestamp()
)
request_logger = client.logger('parent')
request_logger.log_struct(
{"message": 'TEXT'},
severity='INFO',
trace=f'projects/{project_id}/traces/{trace_id}',
timestamp=_log_timestamp(),
http_request=dict(
request_method='GET',
request_url='https://request.example.com/test-logging',
status=200,
user_agent='Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko)'
' Chrome/92.0.4515.107 Safari/537.36',
response_size=15773,
latency=_log_request_time(request_start_time),
remote_ip='127.0.0.1',
referer='https://referer.example.com/',
)
)
if __name__ == '__main__':
parser = argparse.ArgumentParser(
description=__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter
)
parser.add_argument('--project',
required=True,
help='Project ID')
args = parser.parse_args()
run(args.project)
这里是日志资源管理器的屏幕截图,显示请求未捆绑在一起:
谢谢。
我收到了来自 Google 云支持的答复。我问题中的代码很好。为了查看按请求捆绑的日志,有必要在日志资源管理器中过滤父 logName
。然后应用程序日志条目嵌套在请求日志条目中。如果父 logName
没有被特别过滤,那么它会在一个平面列表中显示所有日志条目(请求和应用程序),如我问题中的屏幕截图所示。
这是正确嵌套的日志条目的屏幕截图: