2 回答

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
事實(shí)證明,日志條目已成功寫(xiě)入
,但logviewer Web UI中的默認(rèn) Cloud Run 過(guò)濾器不包含它們
下面的過(guò)濾器表達(dá)式可幫助我獲取所有日志:
resource.type?=?"project"?OR?resource.type?=?"cloud_run_revision"
(服務(wù)名稱(chēng)、地點(diǎn)、嚴(yán)重程度省略)
“stdout\stderr”日志條目匹配resource.type="cloud_run_revision"
,而 stackdriver 日志條目匹配resource.type="project"

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超9個(gè)贊
由于 Cloud Run 已與 Cloud Logging 集成,因此無(wú)需使用 Go 客戶端庫(kù)。我們?cè)?Cloud Run 上運(yùn)行所有 gRPC 服務(wù),并使用以下內(nèi)容來(lái)確保 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")
}
然后日志會(huì)很好地顯示以供本地開(kāi)發(fā)。
如果您不想使用任何第三方日志記錄庫(kù),一個(gè)簡(jiǎn)單的方法是構(gòu)造您自己的 Entry 對(duì)象。
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 產(chǎn)品更緊密地集成。
- 2 回答
- 0 關(guān)注
- 158 瀏覽
添加回答
舉報(bào)