1// +build linux darwin freebsd openbsd solaris 2 3package gsyslog 4 5import ( 6 "fmt" 7 "log/syslog" 8 "strings" 9) 10 11// builtinLogger wraps the Golang implementation of a 12// syslog.Writer to provide the Syslogger interface 13type builtinLogger struct { 14 *builtinWriter 15} 16 17// NewLogger is used to construct a new Syslogger 18func NewLogger(p Priority, facility, tag string) (Syslogger, error) { 19 fPriority, err := facilityPriority(facility) 20 if err != nil { 21 return nil, err 22 } 23 priority := syslog.Priority(p) | fPriority 24 l, err := newBuiltin(priority, tag) 25 if err != nil { 26 return nil, err 27 } 28 return &builtinLogger{l}, nil 29} 30 31// WriteLevel writes out a message at the given priority 32func (b *builtinLogger) WriteLevel(p Priority, buf []byte) error { 33 var err error 34 m := string(buf) 35 switch p { 36 case LOG_EMERG: 37 _, err = b.writeAndRetry(syslog.LOG_EMERG, m) 38 case LOG_ALERT: 39 _, err = b.writeAndRetry(syslog.LOG_ALERT, m) 40 case LOG_CRIT: 41 _, err = b.writeAndRetry(syslog.LOG_CRIT, m) 42 case LOG_ERR: 43 _, err = b.writeAndRetry(syslog.LOG_ERR, m) 44 case LOG_WARNING: 45 _, err = b.writeAndRetry(syslog.LOG_WARNING, m) 46 case LOG_NOTICE: 47 _, err = b.writeAndRetry(syslog.LOG_NOTICE, m) 48 case LOG_INFO: 49 _, err = b.writeAndRetry(syslog.LOG_INFO, m) 50 case LOG_DEBUG: 51 _, err = b.writeAndRetry(syslog.LOG_DEBUG, m) 52 default: 53 err = fmt.Errorf("Unknown priority: %v", p) 54 } 55 return err 56} 57 58// facilityPriority converts a facility string into 59// an appropriate priority level or returns an error 60func facilityPriority(facility string) (syslog.Priority, error) { 61 facility = strings.ToUpper(facility) 62 switch facility { 63 case "KERN": 64 return syslog.LOG_KERN, nil 65 case "USER": 66 return syslog.LOG_USER, nil 67 case "MAIL": 68 return syslog.LOG_MAIL, nil 69 case "DAEMON": 70 return syslog.LOG_DAEMON, nil 71 case "AUTH": 72 return syslog.LOG_AUTH, nil 73 case "SYSLOG": 74 return syslog.LOG_SYSLOG, nil 75 case "LPR": 76 return syslog.LOG_LPR, nil 77 case "NEWS": 78 return syslog.LOG_NEWS, nil 79 case "UUCP": 80 return syslog.LOG_UUCP, nil 81 case "CRON": 82 return syslog.LOG_CRON, nil 83 case "AUTHPRIV": 84 return syslog.LOG_AUTHPRIV, nil 85 case "FTP": 86 return syslog.LOG_FTP, nil 87 case "LOCAL0": 88 return syslog.LOG_LOCAL0, nil 89 case "LOCAL1": 90 return syslog.LOG_LOCAL1, nil 91 case "LOCAL2": 92 return syslog.LOG_LOCAL2, nil 93 case "LOCAL3": 94 return syslog.LOG_LOCAL3, nil 95 case "LOCAL4": 96 return syslog.LOG_LOCAL4, nil 97 case "LOCAL5": 98 return syslog.LOG_LOCAL5, nil 99 case "LOCAL6": 100 return syslog.LOG_LOCAL6, nil 101 case "LOCAL7": 102 return syslog.LOG_LOCAL7, nil 103 default: 104 return 0, fmt.Errorf("invalid syslog facility: %s", facility) 105 } 106} 107