blob: 5b3928dc8f968cb9efdaa1ae244d762db643b013 [file] [log] [blame]
package sklog
import (
"os"
_logger "github.com/jcgregorio/logger"
"github.com/jcgregorio/slog"
)
// CloudLoggerSLogImpl implements CloudLogger using slog.Logger.
type CloudLoggerSLogImpl struct {
stdLog slog.Logger
}
// NewSLogCloudLogger returns a CloudLoggerSLogImpl that uses the given slog.Logger.
func NewSLogCloudLogger(l slog.Logger) *CloudLoggerSLogImpl {
return &CloudLoggerSLogImpl{
stdLog: l,
}
}
// SLogLogMode is the mode logging enum type.
type SLogLogMode int
// Types of logging that NewSLogLogger supports.
const (
SLogNone SLogLogMode = iota
SLogStderr
)
// NewSLogLogger creates a new CloudLoggerSLogImpl that either logs to stderr, or does
// no logging, depending upon the value of mode. It uses github.com/jcgregorio/logger
// to implement the slog.Logger interface.
//
// The return value implements CloudLogger.
//
// Usage:
//
// sklog.SetLogger(sklog.NewStdErrCloudLogger(logToStdErr))
//
func NewStdErrCloudLogger(mode SLogLogMode) *CloudLoggerSLogImpl {
if mode == SLogStderr {
return NewSLogCloudLogger(_logger.NewFromOptions(&_logger.Options{
SyncWriter: os.Stderr,
DepthDelta: 3,
}))
} else {
return NewSLogCloudLogger(_logger.NewNopLogger())
}
}
// See CloudLogger.
func (c *CloudLoggerSLogImpl) CloudLog(reportName string, payload *LogPayload) {
switch payload.Severity {
case DEBUG:
c.stdLog.Debug(payload.Payload)
case INFO, NOTICE:
c.stdLog.Info(payload.Payload)
case WARNING:
c.stdLog.Warning(payload.Payload)
case ERROR:
c.stdLog.Error(payload.Payload)
case CRITICAL, ALERT:
c.stdLog.Fatal(payload.Payload)
}
}
// See CloudLogger.
func (c *CloudLoggerSLogImpl) BatchCloudLog(reportName string, payloads ...*LogPayload) {
for _, payload := range payloads {
c.CloudLog(reportName, payload)
}
}
// See CloudLogger.
func (c *CloudLoggerSLogImpl) Flush() {
_ = os.Stdout.Sync()
}
// Assert that we implement the ClougLogger interface:
var _ CloudLogger = (*CloudLoggerSLogImpl)(nil)