pkg/output/syslog/syslog.go (107 lines of code) (raw):

// Package syslog supports writing events to syslog // // Configuration: // "type", "network", "host", and "port" are all required. // // "facility" is optional and defaults to LOG.KERN // "severity" is optional and defaults to LOG.EMERG // "tag" is optional tag to add to message // // output: // type: syslog // network: tcp // host: localhost // port: 1234 //go:build !windows package syslog import ( "io" "log/syslog" "net" "github.com/elastic/go-ucfg" "github.com/elastic/spigot/pkg/output" ) // Name is the name used in the configuration file and the registry. const Name = "syslog" // Output hosts the WriteCloser type Output struct { pWC io.WriteCloser } func init() { output.Register(Name, New) } // New is the Factory for making a new syslog output func New(cfg *ucfg.Config) (s output.Output, err error) { c := defaultConfig() if err := cfg.Unpack(&c); err != nil { return nil, err } priority := getPriority(c.Facility, c.Severity) sysLog, err := syslog.Dial(c.Network, net.JoinHostPort(c.Host, c.Port), priority, c.Tag) if err != nil { return nil, err } s = &Output{ pWC: sysLog, } return s, nil } // Write sends the log message to the syslog server func (s *Output) Write(b []byte) (n int, err error) { return s.pWC.Write(b) } // Close closes the connection to the syslog server func (s *Output) Close() error { return s.pWC.Close() } func getPriority(facility string, severity string) syslog.Priority { var f, s syslog.Priority switch severity { case "LOG_EMERG": s = syslog.LOG_EMERG case "LOG_ALERT": s = syslog.LOG_ALERT case "LOG_CRIT": s = syslog.LOG_CRIT case "LOG_ERR": s = syslog.LOG_ERR case "LOG_WARNING": s = syslog.LOG_WARNING case "LOG_NOTICE": s = syslog.LOG_NOTICE case "LOG_INFO": s = syslog.LOG_INFO case "LOG_DEBUG": s = syslog.LOG_DEBUG default: s = syslog.LOG_EMERG } switch facility { case "LOG_KERN": f = syslog.LOG_KERN case "LOG_USER": f = syslog.LOG_USER case "LOG_MAIL": f = syslog.LOG_MAIL case "LOG_DAEMON": f = syslog.LOG_DAEMON case "LOG_AUTH": f = syslog.LOG_AUTH case "LOG_SYSLOG": f = syslog.LOG_SYSLOG case "LOG_LPR": f = syslog.LOG_LPR case "LOG_NEWS": f = syslog.LOG_NEWS case "LOG_UUCP": f = syslog.LOG_UUCP case "LOG_CRON": f = syslog.LOG_CRON case "LOG_AUTHPRIV": f = syslog.LOG_AUTHPRIV case "LOG_FTP": f = syslog.LOG_FTP case "LOG_LOCAL0": f = syslog.LOG_LOCAL0 case "LOG_LOCAL1": f = syslog.LOG_LOCAL1 case "LOG_LOCAL2": f = syslog.LOG_LOCAL2 case "LOG_LOCAL3": f = syslog.LOG_LOCAL3 case "LOG_LOCAL4": f = syslog.LOG_LOCAL4 case "LOG_LOCAL5": f = syslog.LOG_LOCAL5 case "LOG_LOCAL6": f = syslog.LOG_LOCAL6 case "LOG_LOCAL7": f = syslog.LOG_LOCAL7 default: f = syslog.LOG_KERN } return s | f } func (s *Output) NewInterval() error { return nil }