Просмотр исходного кода

pkg/log: implement syslog logger

Nick Owens 10 лет назад
Родитель
Сommit
0bff097afb
1 измененных файлов с 93 добавлено и 0 удалено
  1. 93 0
      pkg/log/syslog.go

+ 93 - 0
pkg/log/syslog.go

@@ -0,0 +1,93 @@
+package log
+
+import (
+	"encoding/json"
+	"errors"
+	"log/syslog"
+)
+
+type SyslogWriter struct {
+	syslog   *syslog.Writer
+	Network  string `json:"network"`
+	Address  string `json:"address"`
+	Facility string `json:"facility"`
+	Tag      string `json:"tag"`
+}
+
+func NewSyslog() LoggerInterface {
+	return new(SyslogWriter)
+}
+
+func (sw *SyslogWriter) Init(config string) error {
+	if err := json.Unmarshal([]byte(config), sw); err != nil {
+		return err
+	}
+
+	prio, err := parseFacility(sw.Facility)
+	if err != nil {
+		return err
+	}
+
+	w, err := syslog.Dial(sw.Network, sw.Address, prio, sw.Tag)
+	if err != nil {
+		return err
+	}
+
+	sw.syslog = w
+	return nil
+}
+
+func (sw *SyslogWriter) WriteMsg(msg string, skip, level int) error {
+	var err error
+
+	switch level {
+	case TRACE, DEBUG:
+		err = sw.syslog.Debug(msg)
+	case INFO:
+		err = sw.syslog.Info(msg)
+	case WARN:
+		err = sw.syslog.Warning(msg)
+	case ERROR:
+		err = sw.syslog.Err(msg)
+	case CRITICAL:
+		err = sw.syslog.Crit(msg)
+	case FATAL:
+		err = sw.syslog.Alert(msg)
+	default:
+		err = errors.New("invalid syslog level")
+	}
+
+	return err
+}
+
+func (sw *SyslogWriter) Destroy() {
+	sw.syslog.Close()
+}
+
+func (sw *SyslogWriter) Flush() {}
+
+var facilities = map[string]syslog.Priority{
+	"user":   syslog.LOG_USER,
+	"daemon": syslog.LOG_DAEMON,
+	"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 parseFacility(facility string) (syslog.Priority, error) {
+	prio, ok := facilities[facility]
+	if !ok {
+		return syslog.LOG_LOCAL0, errors.New("invalid syslog facility")
+	}
+
+	return prio, nil
+}
+
+func init() {
+	Register("syslog", NewSyslog)
+}