我正在使用自结构化的JSON负载从基于Node.js / Express的Cloud Run服务进行日志记录,并且无法从同一请求中获取日志以使用trace
方法进行关联。
容器日志不会自动与请求日志相关联,除非 您使用Stackdriver Logging客户端库。如果你想要这个 不使用客户端库进行关联,请使用结构化的JSON日志 包含跟踪字段和输入内容的行 X-Cloud-Trace-Context标头。然后您的日志将正确 与请求日志相关。
我知道我的结构化JSON日志正在按level/severity
和message
的方式提取并按预期显示。
我正以trace
的值作为传递值,而正是X-Cloud-Trace-Context
头传递的,它是使用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中如何显示该日志行的示例。
我还尝试使用Special fields in structured payloads documentation中提到的logging.googleapis.com/trace
属性。我相当确定X-Cloud-Trace-Context
标头的值对此属性无效,但是我不确定如何格式化标头值以匹配此页面上记录的值。
鉴于上述情况,我的问题是:
trace
使用哪个正确的属性名称? X-Cloud-Trace-Context
标头的值正确设置此属性的值? 以下是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"
}
答案 0 :(得分:3)
哪个属性用于跟踪?
您的JSON字符串中所需的属性名称为logging.googleapis.com/trace
。这是从jsonpayload中拉出来的,并进入了trace
属性,您可以在“ INFO”日志中查看示例用法。
如何根据X-Cloud-Trace-Context标头的值正确格式化此属性的值?
所需的格式如下:projects/[project]/traces/[trace]
,其中[project]
是您的Google Cloud Project,即b.......0
,而[trace]
就是您的示例,40f...........................cc
。基本参数和查询参数需要省略(没有特别的文档证明)。
下面是Google文档中{@ {3}}
中的JS代码片段。// 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
}