// +build !windows,!nacl,!plan9 package logging import ( "fmt" "log/syslog" "strings" ) // // Syslog Backend // // SyslogBackend writes the logs to a syslog system type SyslogBackend struct { w *syslog.Writer formatter *Formatter level Level } // NewSyslogBackend initializes a new connection to a syslog server with the // given facility. // tag can contain an identifier for the log stream. It defaults to os.Arg[0]. 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 } // Write sends an entry to the syslog server 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 } // SetFormatter defines the formatter for this backend func (sb *SyslogBackend) SetFormatter(f *Formatter) { sb.formatter = f } // SetLevel changes the log level of the backend func (sb *SyslogBackend) SetLevel(level Level) { sb.level = level } // Level returns the log level set for this backend func (sb *SyslogBackend) Level() Level { return sb.level } // Reopen is a no-op func (sb *SyslogBackend) Reopen() error { return nil } // Close closes the connection to the syslog daemon func (sb *SyslogBackend) Close() error { return sb.w.Close() } 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) { p, ok := facilities[strings.ToLower(name)] if !ok { return 0, fmt.Errorf("Facility '%s' does not exist", name) } return p, nil }