Ctrl K
ComunidadGuías…

engine/certlog.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package engine

import (
	"github.com/sirupsen/logrus"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
)

// certMagicLogger returns a logger for CertMagic that passes the log messages
// on to logrus, so that they are formatted like the rest of the log messages
// and end up in the log file, if one is used
func certMagicLogger() *zap.Logger {
	return zap.New(&logrusCore{})
}

// zapLevel converts a logrus log level to the corresponding zap log level
func zapLevel(level logrus.Level) zapcore.Level {
	switch level {
	case logrus.PanicLevel, logrus.FatalLevel, logrus.ErrorLevel:
		return zapcore.ErrorLevel
	case logrus.WarnLevel:
		return zapcore.WarnLevel
	case logrus.InfoLevel:
		return zapcore.InfoLevel
	default:
		return zapcore.DebugLevel
	}
}

// logrusCore is a zapcore.Core that logs with logrus
type logrusCore struct {
	fields []zapcore.Field
}

func (c *logrusCore) Enabled(level zapcore.Level) bool {
	return level >= zapLevel(logrus.GetLevel())
}

func (c *logrusCore) With(fields []zapcore.Field) zapcore.Core {
	combined := make([]zapcore.Field, 0, len(c.fields)+len(fields))
	combined = append(combined, c.fields...)
	combined = append(combined, fields...)
	return &logrusCore{fields: combined}
}

func (c *logrusCore) Check(entry zapcore.Entry, checked *zapcore.CheckedEntry) *zapcore.CheckedEntry {
	if c.Enabled(entry.Level) {
		return checked.AddCore(entry, c)
	}
	return checked
}

func (c *logrusCore) Write(entry zapcore.Entry, fields []zapcore.Field) error {
	encoded := zapcore.NewMapObjectEncoder()
	for _, field := range c.fields {
		field.AddTo(encoded)
	}
	for _, field := range fields {
		field.AddTo(encoded)
	}
	if entry.LoggerName != "" {
		encoded.Fields["logger"] = entry.LoggerName
	}
	e := logrus.WithFields(logrus.Fields(encoded.Fields))
	switch {
	case entry.Level >= zapcore.ErrorLevel: // also for panic and fatal, since CertMagic should not end the process
		e.Error(entry.Message)
	case entry.Level == zapcore.WarnLevel:
		e.Warn(entry.Message)
	case entry.Level == zapcore.InfoLevel:
		e.Info(entry.Message)
	default:
		e.Debug(entry.Message)
	}
	return nil
}

func (c *logrusCore) Sync() error {
	return nil
}