File: writersink.go

package info (click to toggle)
golang-github-hlandau-xlog 1.0.0-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 120 kB
  • sloc: makefile: 2
file content (69 lines) | stat: -rw-r--r-- 1,563 bytes parent folder | download | duplicates (4)
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)
}