micro/debug/log/os.go

98 lines
1.5 KiB
Go
Raw Normal View History

2019-12-17 21:16:45 +03:00
package log
import (
"bufio"
"encoding/json"
"os"
"time"
)
// Should stream from OS
type osLog struct{}
type osStream struct {
stream chan Record
scanner *bufio.Reader
stop chan bool
}
// Read reads log entries from the logger
func (o *osLog) Read(...ReadOption) ([]Record, error) {
return []Record{}, nil
}
// Write writes records to log
func (o *osLog) Write(r Record) error {
b, _ := json.Marshal(r)
_, err := os.Stderr.Write(b)
return err
}
// Stream log records
func (o *osLog) Stream() (Stream, error) {
// read from standard error
scanner := bufio.NewReader(os.Stderr)
stream := make(chan Record, 128)
stop := make(chan bool)
go func() {
for {
select {
case <-stop:
return
default:
// read the line
line, err := scanner.ReadString('\n')
if err != nil {
return
}
// check if the line exists
if len(line) == 0 {
continue
}
// parse the record
var r Record
if line[0] == '{' {
json.Unmarshal([]byte(line), &r)
} else {
r = Record{
Timestamp: time.Now(),
Value: line,
Metadata: make(map[string]string),
}
}
// send to stream
select {
case <-stop:
return
case stream <- r:
}
}
}
}()
return &osStream{
stream: stream,
scanner: scanner,
stop: stop,
}, nil
}
func (o *osStream) Chan() <-chan Record {
return o.stream
}
func (o *osStream) Stop() error {
select {
case <-o.stop:
return nil
default:
close(o.stop)
}
return nil
}
func NewLog(opts ...Option) Log {
return &osLog{}
}