// Copyright (C) 2010, Kyle Lemons <kyle@kylelemons.net>. All rights reserved. package log4go import ( "encoding/json" "fmt" "net" "os" ) // This log writer sends output to a socket type SocketLogWriter chan *LogRecord // This is the SocketLogWriter's output method func (w SocketLogWriter) LogWrite(rec *LogRecord) { w <- rec } func (w SocketLogWriter) Close() { close(w) } func NewSocketLogWriter(proto, hostport string) SocketLogWriter { sock, err := net.Dial(proto, hostport) if err != nil { fmt.Fprintf(os.Stderr, "NewSocketLogWriter(%q): %s\n", hostport, err) return nil } w := SocketLogWriter(make(chan *LogRecord, LogBufferLength)) go func() { defer func() { if sock != nil && proto == "tcp" { sock.Close() } }() for rec := range w { // Marshall into JSON js, err := json.Marshal(rec) if err != nil { fmt.Fprint(os.Stderr, "SocketLogWriter(%q): %s", hostport, err) return } _, err = sock.Write(js) if err != nil { fmt.Fprint(os.Stderr, "SocketLogWriter(%q): %s", hostport, err) return } } }() return w }