lines
parent
2a6224532b
commit
7910f65eb8
@ -0,0 +1,22 @@
|
||||
package blammo
|
||||
|
||||
import (
|
||||
"time"
|
||||
)
|
||||
|
||||
// Clock is used to allow for the injection of false clocks into log writers.
|
||||
type Clock interface {
|
||||
Now() time.Time
|
||||
}
|
||||
|
||||
// SystemClock is the default system clock
|
||||
type SystemClock struct{}
|
||||
|
||||
// Now returns the current system time
|
||||
func (c SystemClock) Now() time.Time { return time.Now() }
|
||||
|
||||
// FixedClock is a Clock implementation that always returns the same time.
|
||||
type FixedClock time.Time
|
||||
|
||||
// Now always returns the same time
|
||||
func (c FixedClock) Now() time.Time { return time.Time(c) }
|
@ -0,0 +1,4 @@
|
||||
package blammo
|
||||
|
||||
type ConsoleWriter struct {
|
||||
}
|
@ -1,4 +1,87 @@
|
||||
package blammo
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
type LineWriter struct {
|
||||
pool sync.Pool
|
||||
out struct {
|
||||
sync.Mutex
|
||||
io.Writer
|
||||
}
|
||||
}
|
||||
|
||||
func NewLineWriter(w io.Writer) *LineWriter {
|
||||
lw := new(LineWriter)
|
||||
lw.pool = sync.Pool{
|
||||
New: func() interface{} { return new(bytes.Buffer) },
|
||||
}
|
||||
lw.out.Writer = w
|
||||
return lw
|
||||
}
|
||||
|
||||
func (l *LineWriter) WriteEvent(e *Event) {
|
||||
buf := l.pool.Get().(*bytes.Buffer)
|
||||
buf.Reset()
|
||||
|
||||
buf.WriteString(e.Time.Format(time.RFC3339))
|
||||
buf.WriteRune(' ')
|
||||
|
||||
switch e.Level {
|
||||
case Debug:
|
||||
buf.WriteString("d ")
|
||||
case Info:
|
||||
buf.WriteString("i ")
|
||||
case Error:
|
||||
buf.WriteString("e ")
|
||||
default:
|
||||
buf.WriteString("? ")
|
||||
}
|
||||
|
||||
buf.WriteRune('[')
|
||||
buf.WriteString(e.Path.String())
|
||||
buf.WriteRune(']')
|
||||
buf.WriteRune(' ')
|
||||
|
||||
if e.Tags == nil {
|
||||
buf.WriteString("[] ")
|
||||
} else {
|
||||
buf.WriteRune('[')
|
||||
writeTags(buf, e.Tags)
|
||||
buf.WriteString("] ")
|
||||
}
|
||||
|
||||
buf.WriteString(strings.ReplaceAll(e.Text, string('\n'), "\n"))
|
||||
|
||||
l.out.Lock()
|
||||
l.out.Write(buf.Bytes())
|
||||
l.out.Unlock()
|
||||
l.pool.Put(buf)
|
||||
}
|
||||
|
||||
func writeTags(buf *bytes.Buffer, tags *Tags) {
|
||||
if tags.parent != nil {
|
||||
writeTags(buf, tags.parent)
|
||||
buf.WriteRune('+')
|
||||
}
|
||||
buf.WriteString(tags.key)
|
||||
if tags.value != nil {
|
||||
buf.WriteRune('=')
|
||||
switch v := tags.value.(type) {
|
||||
case int:
|
||||
buf.WriteString(strconv.Itoa(v))
|
||||
case string:
|
||||
buf.WriteString(MakeSafeName(v))
|
||||
case float64:
|
||||
buf.WriteString(strconv.FormatFloat(v, 'f', -1, 64))
|
||||
default:
|
||||
buf.WriteString("???")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,26 @@
|
||||
package blammo
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestLineWriter(t *testing.T) {
|
||||
var buf bytes.Buffer
|
||||
w := NewLineWriter(&buf)
|
||||
w.WriteEvent(&Event{
|
||||
Level: Debug,
|
||||
Time: time.Now(),
|
||||
Path: NewPath("alice").Child("bob").Child("carol"),
|
||||
Text: "hey you farthead",
|
||||
Tags: &Tags{
|
||||
key: "poop",
|
||||
parent: &Tags{
|
||||
key: "num_poops",
|
||||
value: 27,
|
||||
},
|
||||
},
|
||||
})
|
||||
t.Error(buf.String())
|
||||
}
|
@ -0,0 +1,55 @@
|
||||
package blammo
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type Log struct {
|
||||
lvl Level
|
||||
dw EventWriter
|
||||
iw EventWriter
|
||||
ew EventWriter
|
||||
path *Path
|
||||
clock Clock
|
||||
tags *Tags
|
||||
}
|
||||
|
||||
type Options struct {
|
||||
Debug EventWriter
|
||||
Info EventWriter
|
||||
Error EventWriter
|
||||
}
|
||||
|
||||
var defaults Options
|
||||
|
||||
func init() {
|
||||
defaults.Debug = NullWriter{}
|
||||
}
|
||||
|
||||
func NewLog() *Log {
|
||||
return new(Log)
|
||||
}
|
||||
|
||||
func format(t string, args ...interface{}) string {
|
||||
if len(args) == 0 {
|
||||
return t
|
||||
}
|
||||
return fmt.Sprintf(t, args...)
|
||||
}
|
||||
|
||||
func (l *Log) Debug(t string, args ...interface{}) {
|
||||
}
|
||||
|
||||
func (l *Log) Info(t string, args ...interface{}) {
|
||||
}
|
||||
|
||||
func (l *Log) Error(t string, args ...interface{}) {
|
||||
}
|
||||
|
||||
func (l *Log) Child(name string) *Log {
|
||||
return l
|
||||
}
|
||||
|
||||
func (l *Log) Tag(key string, value interface{}) *Log {
|
||||
return l
|
||||
}
|
Loading…
Reference in New Issue