logger/journald/journald.go
2025-07-20 22:37:06 +01:00

66 lines
1.7 KiB
Go

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
}