|
@@ -3,12 +3,14 @@
|
|
|
package syslog
|
|
|
|
|
|
import (
|
|
|
+ "errors"
|
|
|
"io"
|
|
|
"log/syslog"
|
|
|
"net"
|
|
|
"net/url"
|
|
|
"os"
|
|
|
"path"
|
|
|
+ "strconv"
|
|
|
"strings"
|
|
|
|
|
|
"github.com/Sirupsen/logrus"
|
|
@@ -18,6 +20,29 @@ import (
|
|
|
|
|
|
const name = "syslog"
|
|
|
|
|
|
+var facilities = map[string]syslog.Priority{
|
|
|
+ "kern": syslog.LOG_KERN,
|
|
|
+ "user": syslog.LOG_USER,
|
|
|
+ "mail": syslog.LOG_MAIL,
|
|
|
+ "daemon": syslog.LOG_DAEMON,
|
|
|
+ "auth": syslog.LOG_AUTH,
|
|
|
+ "syslog": syslog.LOG_SYSLOG,
|
|
|
+ "lpr": syslog.LOG_LPR,
|
|
|
+ "news": syslog.LOG_NEWS,
|
|
|
+ "uucp": syslog.LOG_UUCP,
|
|
|
+ "cron": syslog.LOG_CRON,
|
|
|
+ "authpriv": syslog.LOG_AUTHPRIV,
|
|
|
+ "ftp": syslog.LOG_FTP,
|
|
|
+ "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,
|
|
|
+}
|
|
|
+
|
|
|
type Syslog struct {
|
|
|
writer *syslog.Writer
|
|
|
}
|
|
@@ -39,10 +64,15 @@ func New(ctx logger.Context) (logger.Logger, error) {
|
|
|
return nil, err
|
|
|
}
|
|
|
|
|
|
+ facility, err := parseFacility(ctx.Config["syslog-facility"])
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
log, err := syslog.Dial(
|
|
|
proto,
|
|
|
address,
|
|
|
- syslog.LOG_DAEMON,
|
|
|
+ facility,
|
|
|
path.Base(os.Args[0])+"/"+tag,
|
|
|
)
|
|
|
if err != nil {
|
|
@@ -102,3 +132,20 @@ func parseAddress(address string) (string, string, error) {
|
|
|
|
|
|
return "", "", nil
|
|
|
}
|
|
|
+
|
|
|
+func parseFacility(facility string) (syslog.Priority, error) {
|
|
|
+ if facility == "" {
|
|
|
+ return syslog.LOG_DAEMON, nil
|
|
|
+ }
|
|
|
+
|
|
|
+ if syslogFacility, valid := facilities[facility]; valid {
|
|
|
+ return syslogFacility, nil
|
|
|
+ }
|
|
|
+
|
|
|
+ fInt, err := strconv.Atoi(facility)
|
|
|
+ if err == nil && 0 <= fInt && fInt <= 23 {
|
|
|
+ return syslog.Priority(fInt << 3), nil
|
|
|
+ }
|
|
|
+
|
|
|
+ return syslog.Priority(0), errors.New("invalid syslog facility")
|
|
|
+}
|