我在Go 1.11运行时中使用Google App Engine标准环境。 Go 1.11的文档说:“使用stdout记录输出内容,使用stderr记录错误,编写应用程序日志”。从Go 1.9指南进行的迁移还建议不要直接调用Google Cloud Logging库,而应通过stdout进行日志记录。 https://cloud.google.com/appengine/docs/standard/go111/writing-application-logs
考虑到这一点,我编写了一个小的HTTP服务(下面的代码),以尝试使用JSON输出到stdout记录到Stackdriver。
当我打印纯文本消息时,它们会按预期显示在textPayload
下的“日志查看器”面板中。当我传递JSON字符串时,它们会出现在jsonPayload
下。到目前为止,一切都很好。
因此,我在输出字符串中添加了一个severity
字段,然后Stackdriver Log Viewer根据已分级的日志记录NOTICE,WARNING等成功地对消息进行了分类。
https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry
文档说要设置trace
标识符,以将日志条目与原始请求日志相关联。跟踪ID是从容器设置的X-Cloud-Trace-Context
标头中提取的。
使用curl -v -H 'X-Cloud-Trace-Context: 1ad1e4f50427b51eadc9b36064d40cc2/8196282844182683029;o=1' http://localhost:8080/
但是,这不会导致消息根据请求进行线程传递,而是trace
属性出现在日志的jsonPayload
对象中。 (请参见下文)。
请注意,severity
已按预期解释,并且未出现在jsonPayload
中。我曾期望trace
会发生同样的情况,但是它似乎未处理。
如何在原始请求日志消息中实现嵌套消息? (这必须在Go 1.11上使用stdout完成,因为我不希望直接使用Google Cloud日志记录程序包进行记录。)
GAE从正在运行的进程中解析stdout流的确切方式是什么? (在GCE上的VM设置指南中,有一些关于安装代理程序以充当Stackdriver Logging的管道的事情-这是GAE安装的吗?)
app.yaml文件如下:
runtime: go111
handlers:
- url: /.*
script: auto
package main
import (
"fmt"
"log"
"net/http"
"os"
"strings"
)
var projectID = "glowing-market-234808"
func parseXCloudTraceContext(t string) (traceID, spanID, traceTrue string) {
slash := strings.Index(t, "/")
semi := strings.Index(t, ";")
equal := strings.Index(t, "=")
return t[0:slash], t[slash+1 : semi], t[equal+1:]
}
func sayHello(w http.ResponseWriter, r *http.Request) {
xTrace := r.Header.Get("X-Cloud-Trace-Context")
traceID, spanID, _ := parseXCloudTraceContext(xTrace)
trace := fmt.Sprintf("projects/%s/traces/%s", projectID, traceID)
warning := fmt.Sprintf(`{"trace":"%s","spanId":"%s", "severity":"WARNING","name":"Andy","age":45}`, trace, spanID)
fmt.Fprintf(os.Stdout, "%s\n", warning)
message := "Hello"
w.Write([]byte(message))
}
func main() {
http.HandleFunc("/", sayHello)
port := os.Getenv("PORT")
if port == "" {
port = "8080"
}
log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", port), nil))
}
在日志查看器中显示的输出:
...,
jsonPayload: {
age: 45
name: "Andy"
spanId: "13076979521824861986"
trace: "projects/glowing-market-234808/traces/e880a38fb5f726216f94548a76a6e474"
},
severity: "WARNING",
...
答案 0 :(得分:2)
我已通过调整程序以使用logging.googleapis.com/trace
代替trace
和使用logging.googleapis.com/spanId
代替spanId
来解决了这个问题。
warning := fmt.Sprintf(`{"logging.googleapis.com/trace":"%s","logging.googleapis.com/spanId":"%s", "severity":"WARNING","name":"Andy","age":45}`, trace, spanID)
fmt.Fprintf(os.Stdout, "%s\n", warning)
GAE似乎正在使用日志记录代理google-fluentd
(fluentd
日志数据收集器的修改版。)
有关完整说明,请参见此链接。 https://cloud.google.com/logging/docs/agent/configuration#special-fields