diff --git a/config/config.go b/config/config.go index eb290b7..7ff0ca9 100644 --- a/config/config.go +++ b/config/config.go @@ -259,7 +259,7 @@ type StdoutLoggingOutlet struct { type SyslogLoggingOutlet struct { LoggingOutletCommon `yaml:",inline"` - Facility syslog.Priority `yaml:"facility,default=local0"` + Facility *SyslogFacility `yaml:"facility,optional,fromdefaults"` RetryInterval time.Duration `yaml:"retry_interval,positive,default=10s"` } @@ -286,15 +286,13 @@ type PrometheusMonitoring struct { Listen string `yaml:"listen"` } -type SyslogFacilityEnum struct { - Ret interface{} +type SyslogFacility syslog.Priority + +func (f *SyslogFacility) SetDefault() { + *f = SyslogFacility(syslog.LOG_LOCAL0) } -type SyslogFacilityEnumList []SyslogFacilityEnum - -type SyslogFacility struct { - Facility syslog.Priority -} +var _ yaml.Defaulter = (*SyslogFacility)(nil) type GlobalControl struct { SockPath string `yaml:"sockpath,default=/var/run/zrepl/control"` @@ -401,30 +399,38 @@ func (t *MonitoringEnum) UnmarshalYAML(u func(interface{}, bool) error) (err err return } -func (t *SyslogFacilityEnum) UnmarshalYAML(u func(interface{}, bool) error) (err error) { - t.Ret, err = enumUnmarshal(u, map[string]interface{}{ - "kern": &SyslogFacility{syslog.LOG_KERN}, - "user": &SyslogFacility{syslog.LOG_USER}, - "mail": &SyslogFacility{syslog.LOG_MAIL}, - "daemon": &SyslogFacility{syslog.LOG_DAEMON}, - "auth": &SyslogFacility{syslog.LOG_AUTH}, - "syslog": &SyslogFacility{syslog.LOG_SYSLOG}, - "lpr": &SyslogFacility{syslog.LOG_LPR}, - "news": &SyslogFacility{syslog.LOG_NEWS}, - "uucp": &SyslogFacility{syslog.LOG_UUCP}, - "cron": &SyslogFacility{syslog.LOG_CRON}, - "authpriv": &SyslogFacility{syslog.LOG_AUTHPRIV}, - "ftp": &SyslogFacility{syslog.LOG_FTP}, - "local0": &SyslogFacility{syslog.LOG_LOCAL0}, - "local1": &SyslogFacility{syslog.LOG_LOCAL1}, - "local2": &SyslogFacility{syslog.LOG_LOCAL2}, - "local3": &SyslogFacility{syslog.LOG_LOCAL3}, - "local4": &SyslogFacility{syslog.LOG_LOCAL4}, - "local5": &SyslogFacility{syslog.LOG_LOCAL5}, - "local6": &SyslogFacility{syslog.LOG_LOCAL6}, - "local7": &SyslogFacility{syslog.LOG_LOCAL7}, - }) - return +func (t *SyslogFacility) UnmarshalYAML(u func(interface{}, bool) error) (err error) { + var s string + if err := u(&s, true); err != nil { + return err + } + var level syslog.Priority + switch s { + case "kern": level = syslog.LOG_KERN + case "user": level = syslog.LOG_USER + case "mail": level = syslog.LOG_MAIL + case "daemon": level = syslog.LOG_DAEMON + case "auth": level = syslog.LOG_AUTH + case "syslog": level = syslog.LOG_SYSLOG + case "lpr": level = syslog.LOG_LPR + case "news": level = syslog.LOG_NEWS + case "uucp": level = syslog.LOG_UUCP + case "cron": level = syslog.LOG_CRON + case "authpriv": level = syslog.LOG_AUTHPRIV + case "ftp": level = syslog.LOG_FTP + case "local0": level = syslog.LOG_LOCAL0 + case "local1": level = syslog.LOG_LOCAL1 + case "local2": level = syslog.LOG_LOCAL2 + case "local3": level = syslog.LOG_LOCAL3 + case "local4": level = syslog.LOG_LOCAL4 + case "local5": level = syslog.LOG_LOCAL5 + case "local6": level = syslog.LOG_LOCAL6 + case "local7": level = syslog.LOG_LOCAL7 + default: + return fmt.Errorf("invalid syslog level: %q", s) + } + *t = SyslogFacility(level) + return nil } var ConfigFileDefaultLocations = []string{ diff --git a/config/config_global_test.go b/config/config_global_test.go index a6c4f7b..51204b0 100644 --- a/config/config_global_test.go +++ b/config/config_global_test.go @@ -80,6 +80,7 @@ func TestSyslogLoggingOutletFacility(t *testing.T) { Priority syslog.Priority } syslogFacilitiesPriorities := []SyslogFacilityPriority{ + {"", syslog.LOG_LOCAL0}, // default {"kern", syslog.LOG_KERN}, {"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}, @@ -99,7 +100,7 @@ global: `, sFP.Facility) conf := testValidGlobalSection(t, logcfg) assert.Equal(t, 1, len(*conf.Global.Logging)) - assert.Equal(t, sFP.Priority, (*conf.Global.Logging)[0].Ret.(*SyslogLoggingOutlet).Facility) + assert.True(t, SyslogFacility(sFP.Priority) == *(*conf.Global.Logging)[0].Ret.(*SyslogLoggingOutlet).Facility) } } diff --git a/daemon/logging/build_logging.go b/daemon/logging/build_logging.go index e4c2634..ce90d3c 100644 --- a/daemon/logging/build_logging.go +++ b/daemon/logging/build_logging.go @@ -4,6 +4,7 @@ import ( "context" "crypto/tls" "crypto/x509" + "log/syslog" "os" "github.com/mattn/go-isatty" @@ -222,7 +223,7 @@ func parseSyslogOutlet(in *config.SyslogLoggingOutlet, formatter EntryFormatter) out = &SyslogOutlet{} out.Formatter = formatter out.Formatter.SetMetadataFlags(MetadataNone) - out.Facility = in.Facility + out.Facility = syslog.Priority(*in.Facility) out.RetryInterval = in.RetryInterval return out, nil }