zlg is a (hopefully) straightforward LevelWriter for using zerolog with Google Cloud Operations Logging, which used to be named Stackdriver.
Some notable features:
- The first log written to Cloud Logging is a slow, blocking write to confirm connectivity + permissions, but all subsequent writes are non-blocking.
- Flushes all logs before a
.Fatal()
or.Panic()
- Ensure that all zlg-created loggers are flushed before program exit with
defer zlg.Flush()
- Overridable Cloud Monitoring levels (zerolog -> Cloud Logging):
- Trace -> Default
- Warn -> Warning
- Cloud Logging's Alert and Emergency levels are not used.
Logging only to Stackdriver:
import zlg "github.com/mark-ignacio/zerolog-gcp"
// [...]
gcpWriter, err := zlg.NewCloudLoggingWriter(ctx, projectID, logID, zlg.CloudLoggingOptions{})
if err != nil {
log.Panic().Err(err).Msg("could not create a CloudLoggingWriter")
}
log.Logger = log.Output(gcpWriter)
For non-GCP-hosted situations, you can log to both stdout/stderr and GCP without much additional fuss.
gcpWriter, err := zlg.NewCloudLoggingWriter(ctx, projectID, logID, zlg.CloudLoggingOptions{})
if err != nil {
log.Panic().Err(err).Msg("could not create a CloudLoggingWriter")
}
log.Logger = log.Output(zerolog.MultiLevelWriter(
zerolog.NewConsoleWriter(),
gcpWriter,
))
To ensure that the last asynchronous logs are delivered to Cloud Logging, zlg keeps a reference to all logging.Logger
structs that zlg itself creates. If memory leaks of loggers are a concern, consider specifying providing a logger client via zlg.CloudLoggingOptions
instead.
gcpWriter, err := zlg.NewCloudLoggingWriter(ctx, projectID, logID, zlg.CloudLoggingOptions{})
if err != nil {
log.Panic().Err(err).Msg("could not create a CloudLoggingWriter")
}
defer zlg.Flush()
doEverythingElse()
More advanced usage involves a non-empty zlg.CloudLoggingOptions, which allows for log level and GCP client customization.