Source file src/pkg/log/syslog/syslog.go
1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // +build !windows,!plan9 6 7 // Package syslog provides a simple interface to the system log service. It 8 // can send messages to the syslog daemon using UNIX domain sockets, UDP, or 9 // TCP connections. 10 package syslog 11 12 import ( 13 "errors" 14 "fmt" 15 "log" 16 "net" 17 "os" 18 ) 19 20 type Priority int 21 22 const ( 23 // From /usr/include/sys/syslog.h. 24 // These are the same on Linux, BSD, and OS X. 25 LOG_EMERG Priority = iota 26 LOG_ALERT 27 LOG_CRIT 28 LOG_ERR 29 LOG_WARNING 30 LOG_NOTICE 31 LOG_INFO 32 LOG_DEBUG 33 ) 34 35 // A Writer is a connection to a syslog server. 36 type Writer struct { 37 priority Priority 38 prefix string 39 conn serverConn 40 } 41 42 type serverConn interface { 43 writeBytes(p Priority, prefix string, b []byte) (int, error) 44 writeString(p Priority, prefix string, s string) (int, error) 45 close() error 46 } 47 48 type netConn struct { 49 conn net.Conn 50 } 51 52 // New establishes a new connection to the system log daemon. 53 // Each write to the returned writer sends a log message with 54 // the given priority and prefix. 55 func New(priority Priority, prefix string) (w *Writer, err error) { 56 return Dial("", "", priority, prefix) 57 } 58 59 // Dial establishes a connection to a log daemon by connecting 60 // to address raddr on the network net. 61 // Each write to the returned writer sends a log message with 62 // the given priority and prefix. 63 func Dial(network, raddr string, priority Priority, prefix string) (w *Writer, err error) { 64 if prefix == "" { 65 prefix = os.Args[0] 66 } 67 var conn serverConn 68 if network == "" { 69 conn, err = unixSyslog() 70 } else { 71 var c net.Conn 72 c, err = net.Dial(network, raddr) 73 conn = netConn{c} 74 } 75 return &Writer{priority, prefix, conn}, err 76 } 77 78 // Write sends a log message to the syslog daemon. 79 func (w *Writer) Write(b []byte) (int, error) { 80 if w.priority > LOG_DEBUG || w.priority < LOG_EMERG { 81 return 0, errors.New("log/syslog: invalid priority") 82 } 83 return w.conn.writeBytes(w.priority, w.prefix, b) 84 } 85 86 func (w *Writer) writeString(p Priority, s string) (int, error) { 87 return w.conn.writeString(p, w.prefix, s) 88 } 89 90 func (w *Writer) Close() error { return w.conn.close() } 91 92 // Emerg logs a message using the LOG_EMERG priority. 93 func (w *Writer) Emerg(m string) (err error) { 94 _, err = w.writeString(LOG_EMERG, m) 95 return err 96 } 97 98 // Alert logs a message using the LOG_ALERT priority. 99 func (w *Writer) Alert(m string) (err error) { 100 _, err = w.writeString(LOG_ALERT, m) 101 return err 102 } 103 104 // Crit logs a message using the LOG_CRIT priority. 105 func (w *Writer) Crit(m string) (err error) { 106 _, err = w.writeString(LOG_CRIT, m) 107 return err 108 } 109 110 // Err logs a message using the LOG_ERR priority. 111 func (w *Writer) Err(m string) (err error) { 112 _, err = w.writeString(LOG_ERR, m) 113 return err 114 } 115 116 // Warning logs a message using the LOG_WARNING priority. 117 func (w *Writer) Warning(m string) (err error) { 118 _, err = w.writeString(LOG_WARNING, m) 119 return err 120 } 121 122 // Notice logs a message using the LOG_NOTICE priority. 123 func (w *Writer) Notice(m string) (err error) { 124 _, err = w.writeString(LOG_NOTICE, m) 125 return err 126 } 127 128 // Info logs a message using the LOG_INFO priority. 129 func (w *Writer) Info(m string) (err error) { 130 _, err = w.writeString(LOG_INFO, m) 131 return err 132 } 133 134 // Debug logs a message using the LOG_DEBUG priority. 135 func (w *Writer) Debug(m string) (err error) { 136 _, err = w.writeString(LOG_DEBUG, m) 137 return err 138 } 139 140 func (n netConn) writeBytes(p Priority, prefix string, b []byte) (int, error) { 141 _, err := fmt.Fprintf(n.conn, "<%d>%s: %s\n", p, prefix, b) 142 if err != nil { 143 return 0, err 144 } 145 return len(b), nil 146 } 147 148 func (n netConn) writeString(p Priority, prefix string, s string) (int, error) { 149 _, err := fmt.Fprintf(n.conn, "<%d>%s: %s\n", p, prefix, s) 150 if err != nil { 151 return 0, err 152 } 153 return len(s), nil 154 } 155 156 func (n netConn) close() error { 157 return n.conn.Close() 158 } 159 160 // NewLogger creates a log.Logger whose output is written to 161 // the system log service with the specified priority. The logFlag 162 // argument is the flag set passed through to log.New to create 163 // the Logger. 164 func NewLogger(p Priority, logFlag int) (*log.Logger, error) { 165 s, err := New(p, "") 166 if err != nil { 167 return nil, err 168 } 169 return log.New(s, "", logFlag), nil 170 }