From c15fae57e125c96e5e8147dc6c9b2eb7ce7c3e6d Mon Sep 17 00:00:00 2001 From: Bruno Carlin Date: Wed, 22 Oct 2014 11:32:57 +0200 Subject: [PATCH] Add A syslog backend that writes to the host daemon --- backend.go | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ logging.go | 4 +++ 2 files changed, 94 insertions(+) diff --git a/backend.go b/backend.go index 39fc205..882357b 100644 --- a/backend.go +++ b/backend.go @@ -4,7 +4,9 @@ import ( "errors" "fmt" "io" + "log/syslog" "os" + "strings" ) type Backend interface { @@ -80,3 +82,91 @@ func (b *FileBackend) Level() Level { func (b *FileBackend) SetFormatter(f *Formatter) { b.formatter = f } + +// +// Syslog Backend +// + +type SyslogBackend struct { + w *syslog.Writer + formatter *Formatter + level Level +} + +func NewSyslogBackend(facilityName string, tag string) (Backend, error) { + f, err := facility(facilityName) + if err != nil { + return nil, err + } + w, err := syslog.New(f, tag) + if err != nil { + return nil, err + } + sb := &SyslogBackend{ + w: w, + formatter: &basicFormatter, + } + return sb, nil +} + +func (sb *SyslogBackend) Write(r *Record) (err error) { + text := (*sb.formatter)(r) + switch r.Level { + case DEBUG: + err = sb.w.Debug(text) + case INFO: + err = sb.w.Info(text) + case WARNING: + err = sb.w.Warning(text) + case ERROR: + err = sb.w.Err(text) + case CRITICAL: + err = sb.w.Crit(text) + case FATAL: + err = sb.w.Emerg(text) + } + return err +} + +func (sb *SyslogBackend) SetFormatter(f *Formatter) { + sb.formatter = f +} + +func (sb *SyslogBackend) SetLevel(level Level) { + sb.level = level +} + +func (sb *SyslogBackend) Level() Level { + return sb.level +} + +var facilities = map[string]syslog.Priority{ + "kern": syslog.LOG_KERN, + "user": syslog.LOG_USER, + "mail": syslog.LOG_MAIL, + "daemon": syslog.LOG_DAEMON, + "auth": syslog.LOG_AUTH, + "syslog": syslog.LOG_SYSLOG, + "lpr": syslog.LOG_LPR, + "news": syslog.LOG_NEWS, + "uucp": syslog.LOG_UUCP, + "cron": syslog.LOG_CRON, + "authpriv": syslog.LOG_AUTHPRIV, + "ftp": syslog.LOG_FTP, + "local0": syslog.LOG_LOCAL0, + "local1": syslog.LOG_LOCAL1, + "local2": syslog.LOG_LOCAL2, + "local3": syslog.LOG_LOCAL3, + "local4": syslog.LOG_LOCAL4, + "local5": syslog.LOG_LOCAL5, + "local6": syslog.LOG_LOCAL6, + "local7": syslog.LOG_LOCAL7, +} + +func facility(name string) (syslog.Priority, error) { + if p, ok := facilities[strings.ToLower(name)]; !ok { + return 0, fmt.Errorf("Facility '%s' does not exist", name) + } else { + return p, nil + } +} diff --git a/logging.go b/logging.go index 43d7b59..daff311 100644 --- a/logging.go +++ b/logging.go @@ -58,6 +58,10 @@ var defaultFormatter Formatter = func(r *Record) string { strings.TrimSpace(r.Message)) } +var basicFormatter Formatter = func(r *Record) string { + return fmt.Sprintf("%s: %s", r.Logger, strings.TrimSpace(r.Message)) +} + func init() { loggers = make(map[string]*Logger, 3)