package logrus_syslog import ( "fmt" "github.com/Sirupsen/logrus" "log/syslog" "os" ) // 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 { line, err := entry.String() if err != nil { fmt.Fprintf(os.Stderr, "Unable to read entry, %v", err) return err } 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.PanicLevel, logrus.FatalLevel, logrus.ErrorLevel, logrus.WarnLevel, logrus.InfoLevel, logrus.DebugLevel, } }