2 回答

TA贡献1810条经验 获得超4个赞
事实证明,日志条目已成功写入
,但logviewer Web UI中的默认 Cloud Run 过滤器不包含它们
下面的过滤器表达式可帮助我获取所有日志:
resource.type = "project" OR resource.type = "cloud_run_revision"
(服务名称、地点、严重程度省略)
“stdout\stderr”日志条目匹配resource.type="cloud_run_revision"
,而 stackdriver 日志条目匹配resource.type="project"

TA贡献1820条经验 获得超9个赞
由于 Cloud Run 已与 Cloud Logging 集成,因此无需使用 Go 客户端库。我们在 Cloud Run 上运行所有 gRPC 服务,并使用以下内容来确保 Cloud Logging 中的日志格式正确:
package main
import (
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"os"
)
// initializeLogging sets up the logging configuration for the service.
// Invoke this method in your Init() method.
func initializeLogging() {
// Set logging options for production development
if os.Getenv("ENV") != "DEV" {
// change the level field name to ensure these are parsed correctly in Stackdriver
zerolog.LevelFieldName = "severity"
// UNIX Time is faster and smaller than most timestamps
zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
} else {
// Set logging options for local development
log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr})
zerolog.SetGlobalLevel(zerolog.DebugLevel)
}
// Example log
log.Info().Msg("This is how you log at Info level")
}
然后日志会很好地显示以供本地开发。
如果您不想使用任何第三方日志记录库,一个简单的方法是构造您自己的 Entry 对象。
package main
import (
"context"
"encoding/json"
"fmt"
"google.golang.org/grpc"
"google.golang.org/grpc/metadata"
"log"
"os"
"strings"
)
// LogSeverity is used to map the logging levels consistent with Google Cloud Logging.
type LogSeverity string
const (
// LogSeverity_DEBUG Debug or trace information.
LogSeverity_DEBUG LogSeverity = "DEBUG"
// LogSeverity_INFO Routine information, such as ongoing status or performance.
LogSeverity_INFO LogSeverity = "INFO"
// LogSeverity_NOTICE Normal but significant events, such as start up, shut down, or
// a configuration change.
LogSeverity_NOTICE LogSeverity = "NOTICE"
// LogSeverity_WARNING Warning events might cause problems.
LogSeverity_WARNING LogSeverity = "WARNING"
// LogSeverity_ERROR Error events are likely to cause problems.
LogSeverity_ERROR LogSeverity = "ERROR"
// LogSeverity_CRITICAL Critical events cause more severe problems or outages.
LogSeverity_CRITICAL LogSeverity = "CRITICAL"
// LogSeverity_ALERT A person must take an action immediately.
LogSeverity_ALERT LogSeverity = "ALERT"
// LogSeverity_EMERGENCY One or more systems are unusable.
LogSeverity_EMERGENCY LogSeverity = "EMERGENCY"
)
// Entry defines a log entry.
// If logs are provided in this format, Google Cloud Logging automatically
// parses the attributes into their LogEntry format as per
// https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry which then automatically
// makes the logs available in Google Cloud Logging and Tracing.
type Entry struct {
Message string `json:"message"`
Severity LogSeverity `json:"severity,omitempty"`
Trace string `json:"logging.googleapis.com/trace,omitempty"`
// To extend details sent to the logs, you may add the attributes here.
//MyAttr1 string `json:"component,omitempty"`
}
// String renders an entry structure to the JSON format expected by Cloud Logging.
func (e Entry) String() string {
// Defaults to INFO level.
if e.Severity == "" {
e.Severity = LogSeverity_INFO
}
// if Development is local then print out all logs
if os.Getenv("ENV") == "LOCAL" {
var prefix string
switch e.Severity {
case LogSeverity_DEBUG:
prefix = colorize("DBG: ", 90)
case LogSeverity_INFO:
prefix = colorize("INFO: ", 32)
case LogSeverity_NOTICE:
prefix = colorize("NOTICE: ", 34)
case LogSeverity_WARNING:
prefix = colorize("WARNING: ", 33)
case LogSeverity_ERROR:
prefix = colorize("ERROR: ", 31)
case LogSeverity_ALERT:
prefix = colorize("ALERT: ", 91)
case LogSeverity_CRITICAL:
prefix = colorize("CRITICAL: ", 41)
case LogSeverity_EMERGENCY:
prefix = colorize("EMERGENCY:", 101)
}
return prefix + " " + e.Message
} else {
out, err := json.Marshal(e)
if err != nil {
log.Printf("json.Marshal: %v", err)
}
return string(out)
}
}
// colorize returns the string s wrapped in ANSI code c
// Codes available at https://en.wikipedia.org/wiki/ANSI_escape_code#Colors
func colorize(s interface{}, c int) string {
return fmt.Sprintf("\x1b[%dm%v\x1b[0m", c, s)
}
使用 Google Cloud 的特殊字段可以与其 Cloud Logging 产品更紧密地集成。
- 2 回答
- 0 关注
- 180 浏览
添加回答
举报