/
log_writer.go
52 lines (43 loc) · 991 Bytes
/
log_writer.go
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
package logr
import (
"bytes"
"io"
"regexp"
"strings"
"github.com/go-logr/logr"
)
var _ io.Writer = &LogWriter{}
type LogWriter struct {
log logr.Logger
buffer bytes.Buffer
lineBuffer bytes.Buffer
}
func NewLogWriter(log logr.Logger) *LogWriter {
return &LogWriter{
log: log,
}
}
// Write implements io.Writer.
func (w *LogWriter) Write(p []byte) (n int, err error) {
n, err = w.buffer.Write(p)
if err != nil {
return
}
for {
b, err := w.buffer.ReadBytes(byte('\n'))
if _, err := w.lineBuffer.Write(b); err != nil {
return n, err
}
if err != nil {
return n, nil
}
writeLine := strings.TrimSpace(StripAnsi(w.lineBuffer.String()))
w.log.Info(writeLine)
w.lineBuffer.Reset()
}
}
const ansi = "[\u001B\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[a-zA-Z\\d]*)*)?\u0007)|(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))"
var re = regexp.MustCompile(ansi)
func StripAnsi(str string) string {
return re.ReplaceAllString(str, "")
}