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