Add A syslog backend that writes to the host daemon
This commit is contained in:
parent
de6ab584e9
commit
c15fae57e1
2 changed files with 94 additions and 0 deletions
90
backend.go
90
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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
Loading…
Reference in a new issue