package journald import ( "errors" "github.com/coreos/go-systemd/v22/journal" "go.uber.org/zap/zapcore" "time" ) var zapToJournaldLevelMap = map[int]int{ int(zapcore.DebugLevel): int(journal.PriDebug), int(zapcore.InfoLevel): int(journal.PriInfo), int(zapcore.WarnLevel): int(journal.PriWarning), int(zapcore.ErrorLevel): int(journal.PriErr), int(zapcore.DPanicLevel): int(journal.PriCrit), int(zapcore.PanicLevel): int(journal.PriCrit), int(zapcore.FatalLevel): int(journal.PriEmerg), } type Core struct { zapcore.LevelEnabler fields []zapcore.Field } func NewLogger(enabler zapcore.LevelEnabler) zapcore.Core { core := Core{} core.LevelEnabler = enabler return &core } func (c *Core) With(fields []zapcore.Field) zapcore.Core { newFields := make([]zapcore.Field, len(c.fields)+len(fields)) copy(newFields, c.fields) copy(newFields[len(c.fields):], fields) c.fields = newFields return c } func (c *Core) Check(entry zapcore.Entry, checked *zapcore.CheckedEntry) *zapcore.CheckedEntry { if c.Enabled(entry.Level) { return checked.AddCore(entry, c) } return checked } func (c *Core) Write(entry zapcore.Entry, fields []zapcore.Field) error { ok := journal.Enabled() if !ok { return errors.New("unable to use journal native protocol") } mappedFields := make(map[string]string) mappedFields["SYSLOG_TIMESTAMP"] = entry.Time.Format(time.RFC3339) for _, field := range c.fields { mappedFields[field.Key] = field.String } for _, field := range fields { mappedFields[field.Key] = field.String } return journal.Send(entry.Message, journal.Priority(zapToJournaldLevelMap[int(entry.Level)]), mappedFields) } func (c *Core) Sync() error { return nil }