raddr string
mu sync.Mutex // guards conn
+ conn serverConn
+}
+
+// This interface and the separate syslog_unix.go file exist for
+// Solaris support as implemented by gccgo. On Solaris you can not
+// simply open a TCP connection to the syslog daemon. The gccgo
+// sources have a syslog_solaris.go file that implements unixSyslog to
+// return a type that satisfies this interface and simply calls the C
+// library syslog function.
+type serverConn interface {
+ writeString(p Priority, hostname, tag, s, nl string) error
+ close() error
+}
+
+type netConn struct {
conn net.Conn
}
func (w *Writer) connect() (err error) {
if w.conn != nil {
// ignore err from close, it makes sense to continue anyway
- w.conn.Close()
+ w.conn.close()
w.conn = nil
}
var c net.Conn
c, err = net.Dial(w.network, w.raddr)
if err == nil {
- w.conn = c
+ w.conn = netConn{c}
if w.hostname == "" {
w.hostname = c.LocalAddr().String()
}
defer w.mu.Unlock()
if w.conn != nil {
- err := w.conn.Close()
+ err := w.conn.close()
w.conn = nil
return err
}
nl = "\n"
}
- timestamp := time.Now().Format(time.RFC3339)
- _, err := fmt.Fprintf(w.conn, "<%d>%s %s %s[%d]: %s%s",
- p, timestamp, w.hostname,
- w.tag, os.Getpid(), msg, nl)
+ err := w.conn.writeString(p, w.hostname, w.tag, msg, nl)
if err != nil {
return 0, err
}
return len(msg), nil
}
+func (n netConn) writeString(p Priority, hostname, tag, msg, nl string) error {
+ timestamp := time.Now().Format(time.RFC3339)
+ _, err := fmt.Fprintf(n.conn, "<%d>%s %s %s[%d]: %s%s",
+ p, timestamp, hostname,
+ tag, os.Getpid(), msg, nl)
+ return err
+}
+
+func (n netConn) close() error {
+ return n.conn.Close()
+}
+
// NewLogger creates a log.Logger whose output is written to
// the system log service with the specified priority. The logFlag
// argument is the flag set passed through to log.New to create
// unixSyslog opens a connection to the syslog daemon running on the
// local machine using a Unix domain socket.
-func unixSyslog() (conn net.Conn, err error) {
+func unixSyslog() (conn serverConn, err error) {
logTypes := []string{"unixgram", "unix"}
logPaths := []string{"/dev/log", "/var/run/syslog"}
for _, network := range logTypes {
if err != nil {
continue
} else {
- return conn, nil
+ return netConn{conn}, nil
}
}
}