You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
1.1 KiB
57 lines
1.1 KiB
// Copyright (C) 2010, Kyle Lemons <[email protected]>. 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 |
|
}
|
|
|