logging/backend_syslog_linux.go

111 lines
2.4 KiB
Go

// +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
}
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
}