Implement handlers to normalise how logging is handled
This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
package batch
|
||||
|
||||
import (
|
||||
j "encoding/json"
|
||||
"io"
|
||||
"os"
|
||||
"sync"
|
||||
|
||||
"github.com/apex/log"
|
||||
)
|
||||
|
||||
// Default handler outputting to stderr.
|
||||
var Default = New(os.Stderr)
|
||||
|
||||
// Handler implementation.
|
||||
type Handler struct {
|
||||
*j.Encoder
|
||||
mu sync.Mutex
|
||||
}
|
||||
|
||||
// New handler.
|
||||
func New(w io.Writer) *Handler {
|
||||
return &Handler{
|
||||
Encoder: j.NewEncoder(w),
|
||||
}
|
||||
}
|
||||
|
||||
// HandleLog implements log.Handler.
|
||||
func (h *Handler) HandleLog(e *log.Entry) error {
|
||||
h.mu.Lock()
|
||||
defer h.mu.Unlock()
|
||||
return h.Encoder.Encode(e)
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
package cli
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/apex/log"
|
||||
"github.com/fatih/color"
|
||||
colorable "github.com/mattn/go-colorable"
|
||||
)
|
||||
|
||||
// Default handler outputting to stderr.
|
||||
var Default = New(os.Stderr)
|
||||
|
||||
// start time.
|
||||
var start = time.Now()
|
||||
|
||||
var bold = color.New(color.Bold)
|
||||
|
||||
// Colors mapping.
|
||||
var Colors = [...]*color.Color{
|
||||
log.DebugLevel: color.New(color.FgWhite),
|
||||
log.InfoLevel: color.New(color.FgBlue),
|
||||
log.WarnLevel: color.New(color.FgYellow),
|
||||
log.ErrorLevel: color.New(color.FgRed),
|
||||
log.FatalLevel: color.New(color.FgRed),
|
||||
}
|
||||
|
||||
// Strings mapping.
|
||||
var Strings = [...]string{
|
||||
log.DebugLevel: "•",
|
||||
log.InfoLevel: "•",
|
||||
log.WarnLevel: "•",
|
||||
log.ErrorLevel: "⨯",
|
||||
log.FatalLevel: "⨯",
|
||||
}
|
||||
|
||||
// Handler implementation.
|
||||
type Handler struct {
|
||||
mu sync.Mutex
|
||||
Writer io.Writer
|
||||
Padding int
|
||||
}
|
||||
|
||||
// New handler.
|
||||
func New(w io.Writer) *Handler {
|
||||
if f, ok := w.(*os.File); ok {
|
||||
return &Handler{
|
||||
Writer: colorable.NewColorable(f),
|
||||
Padding: 3,
|
||||
}
|
||||
}
|
||||
|
||||
return &Handler{
|
||||
Writer: w,
|
||||
Padding: 3,
|
||||
}
|
||||
}
|
||||
|
||||
// HandleLog implements log.Handler.
|
||||
func (h *Handler) HandleLog(e *log.Entry) error {
|
||||
color := Colors[e.Level]
|
||||
level := Strings[e.Level]
|
||||
names := e.Fields.Names()
|
||||
|
||||
h.mu.Lock()
|
||||
defer h.mu.Unlock()
|
||||
|
||||
color.Fprintf(h.Writer, "%s %-25s", bold.Sprintf("%*s", h.Padding+1, level), e.Message)
|
||||
|
||||
for _, name := range names {
|
||||
if name == "source" {
|
||||
continue
|
||||
}
|
||||
fmt.Fprintf(h.Writer, " %s=%s", color.Sprint(name), e.Fields.Get(name))
|
||||
}
|
||||
|
||||
fmt.Fprintln(h.Writer)
|
||||
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user