1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
package xlog
import "os"
import "io"
import "time"
import "fmt"
import "github.com/shiena/ansicolor"
// Sink which writes each log message on a line to an io.Writer.
type WriterSink struct {
Systemd bool // Use systemd-format output: "<3>some-log-message"
w io.Writer
minSeverity Severity
isTerminal bool
severityString map[Severity]string
}
func NewWriterSink(w io.Writer) *WriterSink {
ws := &WriterSink{
w: w,
minSeverity: SevTrace,
isTerminal: isTerminal(w),
}
ws.isTerminal = false
if ws.isTerminal {
// windows terminal colour compatibility
ws.w = ansicolor.NewAnsiColorWriter(ws.w)
ws.severityString = ansiSeverityString
} else {
ws.severityString = severityString
}
return ws
}
func (ws *WriterSink) SetSeverity(sev Severity) {
ws.minSeverity = sev
}
func (ws *WriterSink) ReceiveLocally(sev Severity, format string, params ...interface{}) {
ws.ReceiveFromChild(sev, format, params...)
}
func (ws *WriterSink) ReceiveFromChild(sev Severity, format string, params ...interface{}) {
if sev > ws.minSeverity {
return
}
msg := ws.prefix(sev) + fmt.Sprintf(format, params...) + "\n"
io.WriteString(ws.w, msg)
}
func (ws *WriterSink) prefix(sev Severity) string {
if ws.Systemd {
return fmt.Sprintf("<%d>", sev.Syslog())
}
return fmt.Sprintf("%s [%s] ", time.Now().Format("20060102150405"), ws.severityString[sev])
}
// A sink which writes to stderr. This is added to the root sink by default.
var StderrSink *WriterSink
func init() {
StderrSink = NewWriterSink(os.Stderr)
}
|