diff --git a/hooks/syslog/syslog.go b/hooks/syslog/syslog.go new file mode 100644 index 0000000..09bb1f4 --- /dev/null +++ b/hooks/syslog/syslog.go @@ -0,0 +1,61 @@ +package logrus_syslog + +import ( + "os" + "fmt" + "log/syslog" + "github.com/Sirupsen/logrus" +) + +// SyslogHook to send logs via syslog. +type SyslogHook struct{ + Writer *syslog.Writer + SyslogNetwork string + SyslogRaddr string +} + +// Creates a hook to be added to an instance of logger. This is called with +// `hook, err := NewSyslogHook("udp", "localhost:514", syslog.LOG_DEBUG, "")` +// `if err == nil { log.Hooks.Add(hook) }` +func NewSyslogHook(network, raddr string, priority syslog.Priority, tag string) (*SyslogHook, error) { + w, err := syslog.Dial(network, raddr, priority, tag) + return &SyslogHook{w, network, raddr}, err +} + +func (hook *SyslogHook) Fire(entry *logrus.Entry) error { + reader, err := entry.Reader() + if err != nil { + fmt.Fprintf(os.Stderr, "Unable to read entry, %v", err) + return err + } + + line := reader.String() + + switch entry.Data["level"] { + case "panic": + return hook.Writer.Crit(line) + case "fatal": + return hook.Writer.Crit(line) + case "error": + return hook.Writer.Err(line) + case "warn": + return hook.Writer.Warning(line) + case "info": + return hook.Writer.Info(line) + case "debug": + return hook.Writer.Debug(line) + default: + return nil + } +} + +func (hook *SyslogHook) Levels() []logrus.Level { + return []logrus.Level{ + logrus.Panic, + logrus.Fatal, + logrus.Error, + logrus.Warn, + logrus.Info, + logrus.Debug, + } +} diff --git a/hooks/syslog/syslog_test.go b/hooks/syslog/syslog_test.go new file mode 100644 index 0000000..87d90df --- /dev/null +++ b/hooks/syslog/syslog_test.go @@ -0,0 +1,26 @@ +package logrus_syslog + +import ( + "testing" + "log/syslog" + "github.com/Sirupsen/logrus" +) + +func TestLocalhostAddAndPrint(t *testing.T) { + log := logrus.New() + hook, err := NewSyslogHook("udp", "localhost:514", syslog.LOG_INFO, "") + + if err != nil { + t.Errorf("Unable to connect to local syslog.") + } + + log.Hooks.Add(hook) + + for _, level := range hook.Levels() { + if len(log.Hooks[level]) != 1 { + t.Errorf("SyslogHook was not added. The length of log.Hooks[%v]: %v", level, len(log.Hooks[level])) + } + } + + log.Info("Congratulations!") +} \ No newline at end of file