parent
32b758725e
commit
b8d296346c
44
README.md
44
README.md
|
@ -1,5 +1,41 @@
|
||||||
# Logging with color and format string
|
# Logging with color and format string
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"kumoly.io/lib/klog"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
Lklog.EVEL = Lerror | Ldebug | Lwarn | Linfo
|
||||||
|
klog.PROD = false
|
||||||
|
klog.Info("Hello, world.")
|
||||||
|
klog.Error("Error, world.")
|
||||||
|
|
||||||
|
// create sub logger
|
||||||
|
log := klog.Sub("me")
|
||||||
|
log.Warn("log with me")
|
||||||
|
|
||||||
|
// print fields
|
||||||
|
log.InfoF(klog.H{"Key":"value"}, "other ", "stuffs.")
|
||||||
|
|
||||||
|
// intercepting logs
|
||||||
|
p := log.GetPrinter()
|
||||||
|
log.SetPrinter(func(w io.Writer, d *Ldata, l *Logger) {
|
||||||
|
d.Message += " intercepted"
|
||||||
|
|
||||||
|
// NOT IN HERE
|
||||||
|
// as it will cause infinate loop
|
||||||
|
// p := log.GetPrinter()
|
||||||
|
|
||||||
|
p(w, d, l)
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## Test
|
## Test
|
||||||
|
|
||||||
Mem: `go test -o tests/test.exe -memprofile tests/mem && go tool pprof -http : tests/mem`
|
Mem: `go test -o tests/test.exe -memprofile tests/mem && go tool pprof -http : tests/mem`
|
||||||
|
@ -21,4 +57,12 @@ BenchmarkDefault-8 12410 109143 ns/op
|
||||||
BenchmarkSub1-8 10000 113340 ns/op
|
BenchmarkSub1-8 10000 113340 ns/op
|
||||||
BenchmarkDefault-8 12186 112974 ns/op 21944 B/op 303 allocs/op
|
BenchmarkDefault-8 12186 112974 ns/op 21944 B/op 303 allocs/op
|
||||||
BenchmarkSub1-8 10000 114026 ns/op 22702 B/op 363 allocs/op
|
BenchmarkSub1-8 10000 114026 ns/op 22702 B/op 363 allocs/op
|
||||||
|
|
||||||
|
v0.0.4
|
||||||
|
goos: linux
|
||||||
|
goarch: amd64
|
||||||
|
pkg: kumoly.io/lib/klog
|
||||||
|
cpu: AMD Ryzen 9 5900X 12-Core Processor
|
||||||
|
BenchmarkDefault-12 24697 47673 ns/op 21337 B/op 291 allocs/op
|
||||||
|
BenchmarkSub1-12 22639 52841 ns/op 22103 B/op 351 allocs/op
|
||||||
```
|
```
|
68
color.go
68
color.go
|
@ -3,11 +3,9 @@ package klog
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"kumoly.io/lib/klog/color"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func (l *Logger) M(s interface{}, attrs ...color.Attribute) string {
|
func (l *Logger) M(s interface{}, attrs ...Attribute) string {
|
||||||
if !l.color {
|
if !l.color {
|
||||||
return fmt.Sprint(s)
|
return fmt.Sprint(s)
|
||||||
}
|
}
|
||||||
|
@ -23,3 +21,67 @@ func (l *Logger) M(s interface{}, attrs ...color.Attribute) string {
|
||||||
}
|
}
|
||||||
return fmt.Sprintf("\033[%sm%s\033[0m", styles, s)
|
return fmt.Sprintf("\033[%sm%s\033[0m", styles, s)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Attribute int
|
||||||
|
|
||||||
|
// Base attributes
|
||||||
|
const (
|
||||||
|
Reset Attribute = iota
|
||||||
|
Bold
|
||||||
|
Faint
|
||||||
|
Italic
|
||||||
|
Underline
|
||||||
|
BlinkSlow
|
||||||
|
BlinkRapid
|
||||||
|
ReverseVideo
|
||||||
|
Concealed
|
||||||
|
CrossedOut
|
||||||
|
)
|
||||||
|
|
||||||
|
// Foreground text colors
|
||||||
|
const (
|
||||||
|
FgBlack Attribute = iota + 30
|
||||||
|
FgRed
|
||||||
|
FgGreen
|
||||||
|
FgYellow
|
||||||
|
FgBlue
|
||||||
|
FgMagenta
|
||||||
|
FgCyan
|
||||||
|
FgWhite
|
||||||
|
)
|
||||||
|
|
||||||
|
// Foreground Hi-Intensity text colors
|
||||||
|
const (
|
||||||
|
FgHiBlack Attribute = iota + 90
|
||||||
|
FgHiRed
|
||||||
|
FgHiGreen
|
||||||
|
FgHiYellow
|
||||||
|
FgHiBlue
|
||||||
|
FgHiMagenta
|
||||||
|
FgHiCyan
|
||||||
|
FgHiWhite
|
||||||
|
)
|
||||||
|
|
||||||
|
// Background text colors
|
||||||
|
const (
|
||||||
|
BgBlack Attribute = iota + 40
|
||||||
|
BgRed
|
||||||
|
BgGreen
|
||||||
|
BgYellow
|
||||||
|
BgBlue
|
||||||
|
BgMagenta
|
||||||
|
BgCyan
|
||||||
|
BgWhite
|
||||||
|
)
|
||||||
|
|
||||||
|
// Background Hi-Intensity text colors
|
||||||
|
const (
|
||||||
|
BgHiBlack Attribute = iota + 100
|
||||||
|
BgHiRed
|
||||||
|
BgHiGreen
|
||||||
|
BgHiYellow
|
||||||
|
BgHiBlue
|
||||||
|
BgHiMagenta
|
||||||
|
BgHiCyan
|
||||||
|
BgHiWhite
|
||||||
|
)
|
||||||
|
|
|
@ -1,65 +0,0 @@
|
||||||
package color
|
|
||||||
|
|
||||||
type Attribute int
|
|
||||||
|
|
||||||
// Base attributes
|
|
||||||
const (
|
|
||||||
Reset Attribute = iota
|
|
||||||
Bold
|
|
||||||
Faint
|
|
||||||
Italic
|
|
||||||
Underline
|
|
||||||
BlinkSlow
|
|
||||||
BlinkRapid
|
|
||||||
ReverseVideo
|
|
||||||
Concealed
|
|
||||||
CrossedOut
|
|
||||||
)
|
|
||||||
|
|
||||||
// Foreground text colors
|
|
||||||
const (
|
|
||||||
FgBlack Attribute = iota + 30
|
|
||||||
FgRed
|
|
||||||
FgGreen
|
|
||||||
FgYellow
|
|
||||||
FgBlue
|
|
||||||
FgMagenta
|
|
||||||
FgCyan
|
|
||||||
FgWhite
|
|
||||||
)
|
|
||||||
|
|
||||||
// Foreground Hi-Intensity text colors
|
|
||||||
const (
|
|
||||||
FgHiBlack Attribute = iota + 90
|
|
||||||
FgHiRed
|
|
||||||
FgHiGreen
|
|
||||||
FgHiYellow
|
|
||||||
FgHiBlue
|
|
||||||
FgHiMagenta
|
|
||||||
FgHiCyan
|
|
||||||
FgHiWhite
|
|
||||||
)
|
|
||||||
|
|
||||||
// Background text colors
|
|
||||||
const (
|
|
||||||
BgBlack Attribute = iota + 40
|
|
||||||
BgRed
|
|
||||||
BgGreen
|
|
||||||
BgYellow
|
|
||||||
BgBlue
|
|
||||||
BgMagenta
|
|
||||||
BgCyan
|
|
||||||
BgWhite
|
|
||||||
)
|
|
||||||
|
|
||||||
// Background Hi-Intensity text colors
|
|
||||||
const (
|
|
||||||
BgHiBlack Attribute = iota + 100
|
|
||||||
BgHiRed
|
|
||||||
BgHiGreen
|
|
||||||
BgHiYellow
|
|
||||||
BgHiBlue
|
|
||||||
BgHiMagenta
|
|
||||||
BgHiCyan
|
|
||||||
BgHiWhite
|
|
||||||
)
|
|
19
log.go
19
log.go
|
@ -9,7 +9,6 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/mattn/go-isatty"
|
"github.com/mattn/go-isatty"
|
||||||
"kumoly.io/lib/klog/color"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Llevel int
|
type Llevel int
|
||||||
|
@ -76,21 +75,21 @@ func DefaultPrinter() Printer {
|
||||||
}
|
}
|
||||||
switch d.Level {
|
switch d.Level {
|
||||||
case Lerror:
|
case Lerror:
|
||||||
level = l.M("ERROR", color.FgHiRed)
|
level = l.M("ERROR", FgHiRed)
|
||||||
caller = d.Caller
|
caller = d.Caller
|
||||||
case Ldebug:
|
case Ldebug:
|
||||||
level = l.M("DEBUG", color.FgHiMagenta)
|
level = l.M("DEBUG", FgHiMagenta)
|
||||||
caller = d.Caller
|
caller = d.Caller
|
||||||
case Lwarn:
|
case Lwarn:
|
||||||
level = l.M("WARN ", color.FgHiYellow)
|
level = l.M("WARN ", FgHiYellow)
|
||||||
case Linfo:
|
case Linfo:
|
||||||
level = l.M("INFO ", color.FgHiBlue)
|
level = l.M("INFO ", FgHiBlue)
|
||||||
}
|
}
|
||||||
_, err := fmt.Fprintf(w, "%s [%s]%s%s %s%s\n%s",
|
_, err := fmt.Fprintf(w, "%s [%s]%s%s %s%s\n%s",
|
||||||
d.Time.Format("2006/01/02 15:04:05"),
|
d.Time.Format("2006/01/02 15:04:05"),
|
||||||
level, l.M(sys, color.FgHiCyan),
|
level, l.M(sys, FgHiCyan),
|
||||||
caller, l.M(d.Message, color.FgHiGreen), fields,
|
caller, l.M(d.Message, FgHiGreen), fields,
|
||||||
l.M(d.Stack, color.FgRed),
|
l.M(d.Stack, FgRed),
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
|
@ -201,6 +200,10 @@ func (l *Logger) SetOutputAll(out io.Writer) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (l *Logger) GetPrinter() Printer {
|
||||||
|
return l.printer
|
||||||
|
}
|
||||||
|
|
||||||
func (l *Logger) SetPrinter(p Printer) {
|
func (l *Logger) SetPrinter(p Printer) {
|
||||||
l.printer = p
|
l.printer = p
|
||||||
}
|
}
|
||||||
|
|
19
log_test.go
19
log_test.go
|
@ -4,8 +4,6 @@ import (
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
c "kumoly.io/lib/klog/color"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestDev(t *testing.T) {
|
func TestDev(t *testing.T) {
|
||||||
|
@ -63,9 +61,9 @@ func TestSubProd(t *testing.T) {
|
||||||
|
|
||||||
func TestColoring(t *testing.T) {
|
func TestColoring(t *testing.T) {
|
||||||
l := Sub("color")
|
l := Sub("color")
|
||||||
l.Error(l.M("Hello", c.BgHiGreen, c.Italic, c.FgWhite), ", ", l.M("world", c.FgBlue, c.BgHiYellow))
|
l.Error(l.M("Hello", BgHiGreen, Italic, FgWhite), ", ", l.M("world", FgBlue, BgHiYellow))
|
||||||
l.Error(l.M("Hello", c.FgHiGreen), ", ", l.M("world", c.Underline, c.FgMagenta))
|
l.Error(l.M("Hello", FgHiGreen), ", ", l.M("world", Underline, FgMagenta))
|
||||||
Error(M("Hello", c.FgHiGreen), ", ", M("world", c.Underline, c.FgMagenta))
|
Error(M("Hello", FgHiGreen), ", ", M("world", Underline, FgMagenta))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestToFile(t *testing.T) {
|
func TestToFile(t *testing.T) {
|
||||||
|
@ -173,3 +171,14 @@ func BenchmarkSub1(b *testing.B) {
|
||||||
l.WarnF(H{"test": "fields"}, "err in", "BenchmarkSub1: ", i)
|
l.WarnF(H{"test": "fields"}, "err in", "BenchmarkSub1: ", i)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestIntercept(t *testing.T) {
|
||||||
|
l := Sub("inter")
|
||||||
|
l.Info("original")
|
||||||
|
p := l.GetPrinter()
|
||||||
|
l.SetPrinter(func(w io.Writer, d *Ldata, l *Logger) {
|
||||||
|
d.Message += " intercepted"
|
||||||
|
p(w, d, l)
|
||||||
|
})
|
||||||
|
l.Info("original")
|
||||||
|
}
|
||||||
|
|
10
std.go
10
std.go
|
@ -2,8 +2,6 @@ package klog
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
"kumoly.io/lib/klog/color"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var std = New("")
|
var std = New("")
|
||||||
|
@ -13,7 +11,11 @@ func DefaultLogger() *Logger {
|
||||||
}
|
}
|
||||||
|
|
||||||
func SetPrinter(p Printer) {
|
func SetPrinter(p Printer) {
|
||||||
std.printer = p
|
std.SetPrinter(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetPrinter() Printer {
|
||||||
|
return std.GetPrinter()
|
||||||
}
|
}
|
||||||
|
|
||||||
func SetPrinterAll(p Printer) {
|
func SetPrinterAll(p Printer) {
|
||||||
|
@ -22,7 +24,7 @@ func SetPrinterAll(p Printer) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func M(s interface{}, attrs ...color.Attribute) string {
|
func M(s interface{}, attrs ...Attribute) string {
|
||||||
return std.M(s, attrs...)
|
return std.M(s, attrs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue