Created
January 15, 2020 14:08
-
-
Save IljaN/2715ea22afa6e2b9cab235e7e6bb7dc0 to your computer and use it in GitHub Desktop.
Zerolog wrapper for logrus
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package log | |
import ( | |
"github.com/rs/zerolog" | |
"github.com/sirupsen/logrus" | |
"io/ioutil" | |
) | |
type levelMap map[logrus.Level]zerolog.Level | |
var levelMapping = levelMap{ | |
logrus.PanicLevel: zerolog.PanicLevel, | |
logrus.ErrorLevel: zerolog.ErrorLevel, | |
logrus.TraceLevel: zerolog.TraceLevel, | |
logrus.DebugLevel: zerolog.DebugLevel, | |
logrus.WarnLevel: zerolog.WarnLevel, | |
logrus.InfoLevel: zerolog.InfoLevel, | |
} | |
// LogrusWrapper around zerolog. Required because konnectd uses logrus internally. | |
type LogrusWrapper struct { | |
zeroLog *zerolog.Logger | |
levelMap levelMap | |
} | |
// Wrap return a logrus logger which internally logs to /dev/null. Messages are passed to the | |
// underlying zerolog via hooks. | |
func Wrap(zr zerolog.Logger) *logrus.Logger { | |
lr := logrus.New() | |
lr.SetOutput(ioutil.Discard) | |
lr.SetLevel(logrusLevel(zr.GetLevel())) | |
lr.AddHook(&LogrusWrapper{ | |
zeroLog: &zr, | |
levelMap: levelMapping, | |
}) | |
return lr | |
} | |
// Levels on which logrus hooks should be triggered | |
func (h *LogrusWrapper) Levels() []logrus.Level { | |
return logrus.AllLevels | |
} | |
// Fire called by logrus on new message | |
func (h *LogrusWrapper) Fire(entry *logrus.Entry) error { | |
h.zeroLog.WithLevel(h.levelMap[entry.Level]). | |
Fields(zeroLogFields(entry.Data)). | |
Msg(entry.Message) | |
return nil | |
} | |
//Convert logrus fields to zerolog | |
func zeroLogFields(fields logrus.Fields) map[string]interface{} { | |
fm := make(map[string]interface{}) | |
for k, v := range fields { | |
fm[k] = v | |
} | |
return fm | |
} | |
// Convert logrus level to zerolog | |
func logrusLevel(level zerolog.Level) logrus.Level { | |
for lrLvl, zrLvl := range levelMapping { | |
if zrLvl == level { | |
return lrLvl | |
} | |
} | |
panic("Unexpected loglevel") | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment