// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build !windows,!plan9 // Package syslog provides a simple interface to the system log service. It // can send messages to the syslog daemon using UNIX domain sockets, UDP, or // TCP connections. package syslog import ( "errors" "fmt" "log" "net" "os" ) type Priority int const ( // From /usr/include/sys/syslog.h. // These are the same on Linux, BSD, and OS X. LOG_EMERG Priority = iota LOG_ALERT LOG_CRIT LOG_ERR LOG_WARNING LOG_NOTICE LOG_INFO LOG_DEBUG ) // A Writer is a connection to a syslog server. type Writer struct { priority Priority prefix string conn serverConn } type serverConn interface { writeBytes(p Priority, prefix string, b []byte) (int, error) writeString(p Priority, prefix string, s string) (int, error) close() error } type netConn struct { conn net.Conn } // New establishes a new connection to the system log daemon. // Each write to the returned writer sends a log message with // the given priority and prefix. func New(priority Priority, prefix string) (w *Writer, err error) { return Dial("", "", priority, prefix) } // Dial establishes a connection to a log daemon by connecting // to address raddr on the network net. // Each write to the returned writer sends a log message with // the given priority and prefix. func Dial(network, raddr string, priority Priority, prefix string) (w *Writer, err error) { if prefix == "" { prefix = os.Args[0] } var conn serverConn if network == "" { conn, err = unixSyslog() } else { var c net.Conn c, err = net.Dial(network, raddr) conn = netConn{c} } return &Writer{priority, prefix, conn}, err } // Write sends a log message to the syslog daemon. func (w *Writer) Write(b []byte) (int, error) { if w.priority > LOG_DEBUG || w.priority < LOG_EMERG { return 0, errors.New("log/syslog: invalid priority") } return w.conn.writeBytes(w.priority, w.prefix, b) } func (w *Writer) writeString(p Priority, s string) (int, error) { return w.conn.writeString(p, w.prefix, s) } func (w *Writer) Close() error { return w.conn.close() } // Emerg logs a message using the LOG_EMERG priority. func (w *Writer) Emerg(m string) (err error) { _, err = w.writeString(LOG_EMERG, m) return err } // Alert logs a message using the LOG_ALERT priority. func (w *Writer) Alert(m string) (err error) { _, err = w.writeString(LOG_ALERT, m) return err } // Crit logs a message using the LOG_CRIT priority. func (w *Writer) Crit(m string) (err error) { _, err = w.writeString(LOG_CRIT, m) return err } // Err logs a message using the LOG_ERR priority. func (w *Writer) Err(m string) (err error) { _, err = w.writeString(LOG_ERR, m) return err } // Warning logs a message using the LOG_WARNING priority. func (w *Writer) Warning(m string) (err error) { _, err = w.writeString(LOG_WARNING, m) return err } // Notice logs a message using the LOG_NOTICE priority. func (w *Writer) Notice(m string) (err error) { _, err = w.writeString(LOG_NOTICE, m) return err } // Info logs a message using the LOG_INFO priority. func (w *Writer) Info(m string) (err error) { _, err = w.writeString(LOG_INFO, m) return err } // Debug logs a message using the LOG_DEBUG priority. func (w *Writer) Debug(m string) (err error) { _, err = w.writeString(LOG_DEBUG, m) return err } func (n netConn) writeBytes(p Priority, prefix string, b []byte) (int, error) { _, err := fmt.Fprintf(n.conn, "<%d>%s: %s\n", p, prefix, b) if err != nil { return 0, err } return len(b), nil } func (n netConn) writeString(p Priority, prefix string, s string) (int, error) { _, err := fmt.Fprintf(n.conn, "<%d>%s: %s\n", p, prefix, s) if err != nil { return 0, err } return len(s), nil } 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 // the Logger. func NewLogger(p Priority, logFlag int) (*log.Logger, error) { s, err := New(p, "") if err != nil { return nil, err } return log.New(s, "", logFlag), nil }