//+build !windows,!nacl,!plan9 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 int, level LogLevel) 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) }