101 lines
2 KiB
Go
101 lines
2 KiB
Go
// +build !windows,!nacl,!plan9
|
|
|
|
package logging
|
|
|
|
import (
|
|
"fmt"
|
|
"log/syslog"
|
|
"strings"
|
|
)
|
|
|
|
//
|
|
// 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
|
|
}
|
|
|
|
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) {
|
|
if p, ok := facilities[strings.ToLower(name)]; !ok {
|
|
return 0, fmt.Errorf("Facility '%s' does not exist", name)
|
|
} else {
|
|
return p, nil
|
|
}
|
|
}
|