mirror of https://github.com/grafana/grafana.git
				
				
				
			
		
			
				
	
	
		
			105 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
//+build !windows,!nacl,!plan9
 | 
						|
 | 
						|
package log
 | 
						|
 | 
						|
import (
 | 
						|
	"errors"
 | 
						|
	"log/syslog"
 | 
						|
	"os"
 | 
						|
 | 
						|
	"github.com/inconshreveable/log15"
 | 
						|
	"gopkg.in/ini.v1"
 | 
						|
)
 | 
						|
 | 
						|
type SysLogHandler struct {
 | 
						|
	syslog   *syslog.Writer
 | 
						|
	Network  string
 | 
						|
	Address  string
 | 
						|
	Facility string
 | 
						|
	Tag      string
 | 
						|
	Format   log15.Format
 | 
						|
}
 | 
						|
 | 
						|
func NewSyslog(sec *ini.Section, format log15.Format) *SysLogHandler {
 | 
						|
	handler := &SysLogHandler{
 | 
						|
		Format: log15.LogfmtFormat(),
 | 
						|
	}
 | 
						|
 | 
						|
	handler.Format = format
 | 
						|
	handler.Network = sec.Key("network").MustString("")
 | 
						|
	handler.Address = sec.Key("address").MustString("")
 | 
						|
	handler.Facility = sec.Key("facility").MustString("local7")
 | 
						|
	handler.Tag = sec.Key("tag").MustString("")
 | 
						|
 | 
						|
	if err := handler.Init(); err != nil {
 | 
						|
		Root.Error("Failed to init syslog log handler", "error", err)
 | 
						|
		os.Exit(1)
 | 
						|
	}
 | 
						|
 | 
						|
	return handler
 | 
						|
}
 | 
						|
 | 
						|
func (sw *SysLogHandler) Init() error {
 | 
						|
	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 *SysLogHandler) Log(r *log15.Record) error {
 | 
						|
	var err error
 | 
						|
 | 
						|
	msg := string(sw.Format.Format(r))
 | 
						|
 | 
						|
	switch r.Lvl {
 | 
						|
	case log15.LvlDebug:
 | 
						|
		err = sw.syslog.Debug(msg)
 | 
						|
	case log15.LvlInfo:
 | 
						|
		err = sw.syslog.Info(msg)
 | 
						|
	case log15.LvlWarn:
 | 
						|
		err = sw.syslog.Warning(msg)
 | 
						|
	case log15.LvlError:
 | 
						|
		err = sw.syslog.Err(msg)
 | 
						|
	case log15.LvlCrit:
 | 
						|
		err = sw.syslog.Crit(msg)
 | 
						|
	default:
 | 
						|
		err = errors.New("invalid syslog level")
 | 
						|
	}
 | 
						|
 | 
						|
	return err
 | 
						|
}
 | 
						|
 | 
						|
func (sw *SysLogHandler) Close() {
 | 
						|
	sw.syslog.Close()
 | 
						|
}
 | 
						|
 | 
						|
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
 | 
						|
}
 |