如何关联 Cloud 运行 中的请求日志?
How do I correlate request logs in Cloud Run?
我正在使用自结构 JSON 有效负载从我的节点进行日志记录。js/Express 基于云 运行 服务,我无法从同一请求中获取日志以使用trace
方法。
Container logs are not automatically correlated to request logs unless
you use a Stackdriver Logging client library. If you want this
correlation without using a client library, use a structured JSON log
line that contains a trace field with the content of the incoming
X-Cloud-Trace-Context header. Then your logs will be correctly
correlated to the request log.
我知道我的结构化 JSON 日志正在正常工作,因为 level/severity
和 message
正在按预期提取和显示。
我作为 trace
的值传递的正是 X-Cloud-Trace-Context
header 传递的值,这是我使用 Express 提供的 req.get
方法得到的:req.get('X-Cloud-Trace-Context')
.
这是正在记录的 JSON:
{
"message": "Create Query",
"level": "debug",
"severity": "DEBUG",
"trace": "40f...........................cc/131...............23;o=1"
}
下面是该日志行如何出现在 Stackdriver Logging 中的示例。
我也试过使用 logging.googleapis.com/trace
属性 Special fields in structured payloads documentation 中提到的。我相当确定 X-Cloud-Trace-Context
header 的值对此 属性 无效,但我不确定如何格式化 header 值以匹配值记录在此页面上。
综上所述,我的问题是:
- 哪个 属性 名称用于
trace
是正确的?
- 如何根据
X-Cloud-Trace-Context
header 的值正确格式化此 属性 的值?
以下是 Stackdriver Logging 中显示的完整日志消息示例(已删除 ID):
{
insertId: "..."
jsonPayload: {
level: "debug"
message: "Create Query"
trace: "40f...........................cc/131...............23;o=1"
}
labels: {
instanceId: "0.........................................2"
}
logName: "projects/b.............0/logs/run.googleapis.com%2Fstdout"
receiveTimestamp: "2019-08-16T18:05:58.816240093Z"
resource: {
labels: {
configuration_name: "a..................ing"
location: "..."
project_id: "b.............0"
revision_name: "a..................ing-01987"
service_name: "a..................ing"
}
type: "cloud_run_revision"
}
severity: "DEBUG"
timestamp: "2019-08-16T18:05:58.479527Z"
}
哪个是用于跟踪的正确 属性 名称?
您的 JSON 字符串中所需的 属性 名称是 logging.googleapis.com/trace
。这是从 jsonpayload 中拉出并进入 trace
属性,您可以在 "INFO" 日志中看到示例用法。
如何根据 X-Cloud-Trace-Context header 的值正确格式化此 属性 的值?
所需的格式如下:projects/[project]/traces/[trace]
其中 [project]
是您的 Google 云项目,即 b.......0
和 [trace]
作为您的示例是 40f...........................cc
。需要省略基本参数和查询参数(这不是特别有据可查)。
下面是从此处找到的 Google 文档中用 JS 执行的片段:https://cloud.google.com/run/docs/logging
// Build structured log messages as an object.
const globalLogFields = {};
// Add log correlation to nest all log messages beneath request log in Log Viewer.
const traceHeader = req.header('X-Cloud-Trace-Context');
if (traceHeader && project) {
const [trace] = traceHeader.split('/');
globalLogFields[
'logging.googleapis.com/trace'
] = `projects/${project}/traces/${trace}`;
}
下面是一个 Golang 函数,我在提取信息和正确格式化方面取得了成功:
func extractTracePath(r *http.Request, app *application) string {
s := r.Header.Get("X-Cloud-Trace-Context")
traceURL, err := url.Parse(s)
if err != nil {
app.infoLog.Fatal("Invalid trace URL")
}
tracePath := traceURL.Path
trace := strings.Split(tracePath, "/")[0]
project := os.Getenv("GCLOUD_PROJECT")
partialTracePath, err := url.Parse("projects/" + project + "/traces/")
tracePath = partialTracePath.Path
tracePath = path.Join(tracePath, trace)
return tracePath
}
我正在使用自结构 JSON 有效负载从我的节点进行日志记录。js/Express 基于云 运行 服务,我无法从同一请求中获取日志以使用trace
方法。
Container logs are not automatically correlated to request logs unless you use a Stackdriver Logging client library. If you want this correlation without using a client library, use a structured JSON log line that contains a trace field with the content of the incoming X-Cloud-Trace-Context header. Then your logs will be correctly correlated to the request log.
我知道我的结构化 JSON 日志正在正常工作,因为 level/severity
和 message
正在按预期提取和显示。
我作为 trace
的值传递的正是 X-Cloud-Trace-Context
header 传递的值,这是我使用 Express 提供的 req.get
方法得到的:req.get('X-Cloud-Trace-Context')
.
这是正在记录的 JSON:
{
"message": "Create Query",
"level": "debug",
"severity": "DEBUG",
"trace": "40f...........................cc/131...............23;o=1"
}
下面是该日志行如何出现在 Stackdriver Logging 中的示例。
我也试过使用 logging.googleapis.com/trace
属性 Special fields in structured payloads documentation 中提到的。我相当确定 X-Cloud-Trace-Context
header 的值对此 属性 无效,但我不确定如何格式化 header 值以匹配值记录在此页面上。
综上所述,我的问题是:
- 哪个 属性 名称用于
trace
是正确的? - 如何根据
X-Cloud-Trace-Context
header 的值正确格式化此 属性 的值?
以下是 Stackdriver Logging 中显示的完整日志消息示例(已删除 ID):
{
insertId: "..."
jsonPayload: {
level: "debug"
message: "Create Query"
trace: "40f...........................cc/131...............23;o=1"
}
labels: {
instanceId: "0.........................................2"
}
logName: "projects/b.............0/logs/run.googleapis.com%2Fstdout"
receiveTimestamp: "2019-08-16T18:05:58.816240093Z"
resource: {
labels: {
configuration_name: "a..................ing"
location: "..."
project_id: "b.............0"
revision_name: "a..................ing-01987"
service_name: "a..................ing"
}
type: "cloud_run_revision"
}
severity: "DEBUG"
timestamp: "2019-08-16T18:05:58.479527Z"
}
哪个是用于跟踪的正确 属性 名称?
您的 JSON 字符串中所需的 属性 名称是 logging.googleapis.com/trace
。这是从 jsonpayload 中拉出并进入 trace
属性,您可以在 "INFO" 日志中看到示例用法。
如何根据 X-Cloud-Trace-Context header 的值正确格式化此 属性 的值?
所需的格式如下:projects/[project]/traces/[trace]
其中 [project]
是您的 Google 云项目,即 b.......0
和 [trace]
作为您的示例是 40f...........................cc
。需要省略基本参数和查询参数(这不是特别有据可查)。
下面是从此处找到的 Google 文档中用 JS 执行的片段:https://cloud.google.com/run/docs/logging
// Build structured log messages as an object.
const globalLogFields = {};
// Add log correlation to nest all log messages beneath request log in Log Viewer.
const traceHeader = req.header('X-Cloud-Trace-Context');
if (traceHeader && project) {
const [trace] = traceHeader.split('/');
globalLogFields[
'logging.googleapis.com/trace'
] = `projects/${project}/traces/${trace}`;
}
下面是一个 Golang 函数,我在提取信息和正确格式化方面取得了成功:
func extractTracePath(r *http.Request, app *application) string {
s := r.Header.Get("X-Cloud-Trace-Context")
traceURL, err := url.Parse(s)
if err != nil {
app.infoLog.Fatal("Invalid trace URL")
}
tracePath := traceURL.Path
trace := strings.Split(tracePath, "/")[0]
project := os.Getenv("GCLOUD_PROJECT")
partialTracePath, err := url.Parse("projects/" + project + "/traces/")
tracePath = partialTracePath.Path
tracePath = path.Join(tracePath, trace)
return tracePath
}