# HG changeset patch # User Chris Jones # Date 1355692034 25200 # Node ID 24231ff0016cfd58037b644eb76ed999c0f14abe # Parent c9cc4eda6dce72e44b86b27cc80f3477c5fd2862 Reworked logging. diff -r c9cc4eda6dce -r 24231ff0016c examples/interact.go --- a/examples/interact.go Sun Dec 16 13:03:03 2012 -0700 +++ b/examples/interact.go Sun Dec 16 14:07:14 2012 -0700 @@ -5,7 +5,7 @@ package main import ( - "cjyar/xmpp" + xmpp ".." "flag" "fmt" "log" diff -r c9cc4eda6dce -r 24231ff0016c stream.go --- a/stream.go Sun Dec 16 13:03:03 2012 -0700 +++ b/stream.go Sun Dec 16 14:07:14 2012 -0700 @@ -18,7 +18,6 @@ "encoding/xml" "fmt" "io" - "log/syslog" "math/big" "net" "regexp" @@ -51,16 +50,12 @@ continue } } - if Log != nil { - Log.Err("read: " + err.Error()) - } + Warnf("read: %s", err) break } nw, err := w.Write(p[:nr]) if nw < nr { - if Log != nil { - Log.Err("read: " + err.Error()) - } + Warnf("read: %s", err) break } } @@ -72,16 +67,12 @@ for { nr, err := r.Read(p) if nr == 0 { - if Log != nil { - Log.Err("write: " + err.Error()) - } + Warnf("write: %s", err) break } nw, err := cl.socket.Write(p[:nr]) if nw < nr { - if Log != nil { - Log.Err("write: " + err.Error()) - } + Warnf("write: %s", err) break } } @@ -89,7 +80,7 @@ func readXml(r io.Reader, ch chan<- interface{}, extStanza map[string]func(*xml.Name) interface{}) { - if Loglevel >= syslog.LOG_DEBUG { + if Debug != nil { pr, pw := io.Pipe() go tee(r, pw, "S: ") r = pr @@ -105,9 +96,7 @@ t, err := p.Token() if t == nil { if err != io.EOF { - if Log != nil { - Log.Err("read: " + err.Error()) - } + Warnf("read: %s", err) } break } @@ -123,10 +112,7 @@ case NsStream + " stream": st, err := parseStream(se) if err != nil { - if Log != nil { - Log.Err("unmarshal stream: " + - err.Error()) - } + Warnf("unmarshal stream: %s", err) break Loop } ch <- st @@ -148,18 +134,14 @@ obj = &Presence{} default: obj = &Generic{} - if Log != nil { - Log.Notice("Ignoring unrecognized: " + - se.Name.Space + " " + se.Name.Local) - } + Infof("Ignoring unrecognized: %s %s", se.Name.Space, + se.Name.Local) } // Read the complete XML stanza. err = p.DecodeElement(obj, &se) if err != nil { - if Log != nil { - Log.Err("unmarshal: " + err.Error()) - } + Warnf("unmarshal: %s", err) break Loop } @@ -169,11 +151,7 @@ if st, ok := obj.(Stanza); ok { err = parseExtended(st, extStanza) if err != nil { - if Log != nil { - Log.Err("ext unmarshal: " + - err.Error()) - } - fmt.Printf("ext: %v\n", err) + Warnf("ext unmarshal: %s", err) break Loop } } @@ -216,7 +194,7 @@ } func writeXml(w io.Writer, ch <-chan interface{}) { - if Loglevel >= syslog.LOG_DEBUG { + if Debug != nil { pr, pw := io.Pipe() go tee(pr, w, "C: ") w = pw @@ -235,16 +213,12 @@ if st, ok := obj.(*stream); ok { _, err := w.Write([]byte(st.String())) if err != nil { - if Log != nil { - Log.Err("write: " + err.Error()) - } + Warnf("write: %s", err) } } else { err := enc.Encode(obj) if err != nil { - if Log != nil { - Log.Err("marshal: " + err.Error()) - } + Warnf("marshal: %s", err) break } } @@ -284,10 +258,7 @@ } st, ok := x.(Stanza) if !ok { - if Log != nil { - Log.Warning(fmt.Sprintf( - "Unhandled non-stanza: %v", x)) - } + Warnf("Unhandled non-stanza: %v", x) continue } if handlers[st.GetId()] != nil { @@ -328,10 +299,7 @@ break Loop } if x == nil { - if Log != nil { - Log.Notice("Refusing to send" + - " nil stanza") - } + Infof("Refusing to send nil stanza") continue } srvOut <- x @@ -349,9 +317,7 @@ select { case newFilterOut := <-filterOut: if newFilterOut == nil { - if Log != nil { - Log.Warning("Received nil filter") - } + Warnf("Received nil filter") filterIn <- nil continue } @@ -378,9 +344,7 @@ } func (cl *Client) handleStreamError(se *streamError) { - if Log != nil { - Log.Notice(fmt.Sprintf("Received stream error: %v", se)) - } + Infof("Received stream error: %v", se) close(cl.Out) } @@ -425,9 +389,7 @@ cl.socket = tls cl.socketSync.Wait() - if Log != nil { - Log.Info("TLS negotiation succeeded.") - } + Infof("TLS negotiation succeeded.") cl.Features = nil // Now re-send the initial handshake message to start the new @@ -473,10 +435,7 @@ b64 := base64.StdEncoding str, err := b64.DecodeString(srv.Chardata) if err != nil { - if Log != nil { - Log.Err("SASL challenge decode: " + - err.Error()) - } + Warnf("SASL challenge decode: %s", err) return } srvMap := parseSasl(string(str)) @@ -487,13 +446,9 @@ cl.saslDigest2(srvMap) } case "failure": - if Log != nil { - Log.Notice("SASL authentication failed") - } + Infof("SASL authentication failed") case "success": - if Log != nil { - Log.Info("Sasl authentication succeeded") - } + Infof("Sasl authentication succeeded") cl.Features = nil ss := &stream{To: cl.Jid.Domain, Version: Version} cl.xmlOut <- ss @@ -509,9 +464,7 @@ } } if !hasAuth { - if Log != nil { - Log.Err("Server doesn't support SASL auth") - } + Warnf("Server doesn't support SASL auth") return } @@ -541,9 +494,7 @@ randSize.Lsh(big.NewInt(1), 64) cnonce, err := rand.Int(rand.Reader, randSize) if err != nil { - if Log != nil { - Log.Err("SASL rand: " + err.Error()) - } + Warnf("SASL rand: %s", err) return } cnonceStr := fmt.Sprintf("%016x", cnonce) @@ -649,14 +600,10 @@ f := func(st Stanza) bool { iq, ok := st.(*Iq) if !ok { - if Log != nil { - Log.Err("non-iq response") - } + Warnf("non-iq response") } if iq.Type == "error" { - if Log != nil { - Log.Err("Resource binding failed") - } + Warnf("Resource binding failed") return false } var bindRepl *bindIq @@ -667,31 +614,21 @@ } } if bindRepl == nil { - if Log != nil { - Log.Err(fmt.Sprintf("Bad bind reply: %v", - iq)) - } + Warnf("Bad bind reply: %v", iq) return false } jidStr := bindRepl.Jid if jidStr == nil || *jidStr == "" { - if Log != nil { - Log.Err("Can't bind empty resource") - } + Warnf("Can't bind empty resource") return false } jid := new(JID) if err := jid.Set(*jidStr); err != nil { - if Log != nil { - Log.Err(fmt.Sprintf("Can't parse JID %s: %s", - *jidStr, err)) - } + Warnf("Can't parse JID %s: %s", *jidStr, err) return false } cl.Jid = *jid - if Log != nil { - Log.Info("Bound resource: " + cl.Jid.String()) - } + Infof("Bound resource: %s", cl.Jid.String()) cl.bindDone() return false } diff -r c9cc4eda6dce -r 24231ff0016c structs.go --- a/structs.go Sun Dec 16 13:03:03 2012 -0700 +++ b/structs.go Sun Dec 16 14:07:14 2012 -0700 @@ -274,9 +274,7 @@ func (er *Error) Error() string { buf, err := xml.Marshal(er) if err != nil { - if Log != nil { - Log.Err("double bad error couldn't marshal error") - } + Warnf("double bad error: couldn't marshal error") return "unreadable error" } return string(buf) diff -r c9cc4eda6dce -r 24231ff0016c xmpp.go --- a/xmpp.go Sun Dec 16 13:03:03 2012 -0700 +++ b/xmpp.go Sun Dec 16 14:07:14 2012 -0700 @@ -12,7 +12,7 @@ "errors" "fmt" "io" - "log/syslog" + "log" "net" "sync" ) @@ -37,11 +37,12 @@ ) var ( - // If non-nil when NewClient() is called, log messages will be - // sent to this writer. - Log *syslog.Writer - // Threshold for which messages are logged. - Loglevel syslog.Priority = syslog.LOG_NOTICE + // If any of these are non-nil when NewClient() is called, + // they will be used to log messages of the indicated + // severity. + Warn *log.Logger + Info *log.Logger + Debug *log.Logger ) // This channel may be used as a convenient way to generate a unique @@ -249,13 +250,13 @@ } buf.Write(c[:n]) if c[0] == '\n' || c[0] == '>' { - Log.Debug(buf.String()) + Debug.Print(buf) buf.Reset() } } leftover := buf.String() if leftover != "" { - Log.Debug(buf.String()) + Debug.Print(buf) } } @@ -278,17 +279,12 @@ f := func(st Stanza) bool { iq, ok := st.(*Iq) if !ok { - if Log != nil { - Log.Err("iq reply not iq; can't start session") - } + Warnf("iq reply not iq; can't start session") ch <- errors.New("bad session start reply") return false } if iq.Type == "error" { - if Log != nil { - Log.Err(fmt.Sprintf("Can't start session: %v", - iq)) - } + Warnf("Can't start session: %v", iq) ch <- iq.Error return false } @@ -323,3 +319,21 @@ cl.filterOut <- out return <-cl.filterIn } + +func Warnf(msg string, args ...interface{}) { + if Warn != nil { + Warn.Printf(msg, args) + } +} + +func Infof(msg string, args ...interface{}) { + if Info != nil { + Info.Printf(msg, args) + } +} + +func Debugf(msg string, args ...interface{}) { + if Debug != nil { + Debug.Printf(msg, args) + } +}