66 lines
1.7 KiB
Go
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
|
|
}
|