mirror of
				https://github.com/grafana/grafana.git
				synced 2025-02-25 18:55:37 -06:00 
			
		
		
		
	pkg/log: implement syslog logger
This commit is contained in:
		
							
								
								
									
										93
									
								
								pkg/log/syslog.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								pkg/log/syslog.go
									
									
									
									
									
										Normal file
									
								
							@@ -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)
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user