Skip to content

Commit

Permalink
Get rid of the old implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
suzaku committed Aug 14, 2020
1 parent 217c2a3 commit 0d84e03
Show file tree
Hide file tree
Showing 2 changed files with 0 additions and 288 deletions.
111 changes: 0 additions & 111 deletions multi.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package log

import (
"bytes"
"io"
)

Expand Down Expand Up @@ -44,16 +43,6 @@ type MultiWriter struct {
// StderrLevel specifies the minimal level logs it will be writes to stderr
StderrLevel Level

// ParseLevel specifies an optional callback for parse log level in output
// log.DebugLogger.Writer = &log.MultiWriter {
// InfoWriter: &log.FileWriter{Filename: "main-info.log"},
// ErrorWriter: &log.FileWriter{Filename: "main-error.log"},
// StderrWriter: &log.ConsoleWriter{ColorOutput: true},
// StderrLevel: log.ErrorLevel,
// ParseLevel: func([]byte) log.Level { return log.ParseLevel(string(p[49])) },
// }
ParseLevel func([]byte) Level

// One writer slot for each of the 8 levels
levelWriters []io.Writer
}
Expand Down Expand Up @@ -85,103 +74,3 @@ func (w *MultiWriter) GetWriterByLevel(level Level) io.Writer {
}
return CombinedWriter(w.levelWriters[:int(level)+2])
}

// Close implements io.Closer, and closes the underlying leveledWriterRouter.
func (w *MultiWriter) Close() (err error) {
for _, writer := range []io.Writer{
w.InfoWriter,
w.WarnWriter,
w.ErrorWriter,
w.StderrWriter,
} {
if writer == nil {
continue
}
Flush(writer)
if closer, ok := writer.(io.Closer); ok {
if err1 := closer.Close(); err1 != nil {
err = err1
}
}
}
return
}

var levelBegin = []byte(`"level":"`)

// Write implements io.Writer.
func (w *MultiWriter) Write(p []byte) (n int, err error) {
var level = noLevel
if w.ParseLevel != nil {
level = w.ParseLevel(p)
} else {
var l byte
// guess level by fixed offset
lp := len(p)
if lp > 49 {
_ = p[49]
switch {
case p[32] == 'Z' && p[42] == ':' && p[43] == '"':
l = p[44]
case p[32] == '+' && p[47] == ':' && p[48] == '"':
l = p[49]
}
}
// guess level by "level":" beginning
if l == 0 {
if i := bytes.Index(p, levelBegin); i > 0 && i+len(levelBegin)+1 < lp {
l = p[i+len(levelBegin)]
}
}
// convert byte to Level
switch l {
case 't':
level = TraceLevel
case 'd':
level = DebugLevel
case 'i':
level = InfoLevel
case 'w':
level = WarnLevel
case 'e':
level = ErrorLevel
case 'f':
level = FatalLevel
case 'p':
level = PanicLevel
}
}

var err1 error
switch level {
case noLevel, PanicLevel, FatalLevel, ErrorLevel:
if w.ErrorWriter != nil {
n, err1 = w.ErrorWriter.Write(p)
if err1 != nil && err == nil {
err = err1
}
}
fallthrough
case WarnLevel:
if w.WarnWriter != nil {
n, err1 = w.WarnWriter.Write(p)
if err1 != nil && err == nil {
err = err1
}
}
fallthrough
default:
if w.InfoWriter != nil {
n, err1 = w.InfoWriter.Write(p)
if err1 != nil && err == nil {
err = err1
}
}
}

if w.StderrWriter != nil && level >= w.StderrLevel {
w.StderrWriter.Write(p)
}

return
}
177 changes: 0 additions & 177 deletions multi_test.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package log

import (
"encoding/json"
"errors"
"fmt"
"io"
"os"
"path/filepath"
Expand Down Expand Up @@ -53,57 +51,6 @@ func TestNewMultiWriters(t *testing.T) {
}
}

func TestMultiWriter(t *testing.T) {
w := &MultiWriter{
InfoWriter: &FileWriter{
Filename: "file-info.log",
},
WarnWriter: &FileWriter{
Filename: "file-warn.log",
},
ErrorWriter: &FileWriter{
Filename: "file-error.log",
},
StderrWriter: &ConsoleWriter{
ColorOutput: true,
},
StderrLevel: ErrorLevel,
}

var err error
for _, level := range []string{"trace", "debug", "info", "warning", "error", "fatal", "panic", "hahaha"} {
_, err = fmt.Fprintf(w, `{"ts":1234567890,"level":"%s","caller":"test.go:42","error":"i am test error","foo":"bar","n":42,"message":"hello json mutli writer"}`+"\n", level)
if err != nil {
t.Errorf("test json mutli writer error: %+v", err)
}
_, err = fmt.Fprintf(w, `{"time":"2019-07-10T05:35:54.277Z","level":"%s","caller":"test.go:42","error":"i am test error","foo":"bar","n":42,"message":"hello json mutli writer"}`+"\n", level)
if err != nil {
t.Errorf("test json mutli writer error: %+v", err)
}
_, err = fmt.Fprintf(w, `{"time":"2019-07-10T05:35:54.277+08:00","level":"%s","caller":"test.go:42","error":"i am test error","foo":"bar","n":42,"message":"hello json mutli writer"}`+"\n", level)
if err != nil {
t.Errorf("test json mutli writer error: %+v", err)
}
}

if err := w.Close(); err != nil {
t.Errorf("test close mutli writer error: %+v", err)
}

matches, _ := filepath.Glob("file-*.*.log")
want := 3
if len(matches) != want {
t.Fatalf("filepath glob return %+v number mismatch, got %+v want %+v", matches, len(matches), want)
}

for i := range matches {
err := os.Remove(matches[i])
if err != nil {
t.Fatalf("os remove %s error: %+v", matches[i], err)
}
}
}

type errorWriter struct {
io.WriteCloser
}
Expand All @@ -126,96 +73,6 @@ func (ew errorWriter) Close() (err error) {
return
}

func TestMultiWriterError(t *testing.T) {
w := &MultiWriter{
InfoWriter: errorWriter{&FileWriter{
Filename: "file-info.log",
}},
WarnWriter: errorWriter{&FileWriter{
Filename: "file-warn.log",
}},
ErrorWriter: errorWriter{&FileWriter{
Filename: "file-error.log",
}},
StderrWriter: &ConsoleWriter{
ColorOutput: true,
},
StderrLevel: ErrorLevel,
}

for _, level := range []string{"trace", "debug", "info", "warning", "error", "fatal", "panic", "hahaha"} {
_, err := fmt.Fprintf(w, `{"time":"2019-07-10T05:35:54.277Z","level":"%s","caller":"test.go:42","error":"i am test error","foo":"bar","n":42,"message":"hello json mutli writer"}`+"\n", level)
if err != errorWriterOK {
t.Errorf("test json mutli writer error: %+v", err)
}
}

if err := w.Close(); err != errorWriterOK {
t.Errorf("test close mutli writer error: %+v", err)
}

matches, _ := filepath.Glob("file-*.*.log")
want := 3
if len(matches) != want {
t.Fatalf("filepath glob return %+v number mismatch, got %+v want %+v", matches, len(matches), want)
}

matches, _ = filepath.Glob("file-*.log")
for i := range matches {
err := os.Remove(matches[i])
if err != nil {
t.Fatalf("os remove %s error: %+v", matches[i], err)
}
}
}

func TestMultiWriterLevel(t *testing.T) {
w := &MultiWriter{
StderrWriter: &ConsoleWriter{
ColorOutput: true,
},
StderrLevel: InfoLevel,
ParseLevel: func(data []byte) (level Level) {
v := struct {
Level string `json:"level"`
}{}
if err := json.Unmarshal(data, &v); err == nil {
level = ParseLevel(v.Level)
}
return
},
}

var err error
for _, level := range []string{"trace", "debug", "info", "warning", "error", "fatal", "panic", "hahaha"} {
_, err = fmt.Fprintf(w, `{"time":1234567890,"level":"%s","caller":"test.go:42","error":"i am test error","foo":"bar","n":42,"message":"hello json mutli writer"}`+"\n", level)
if err != nil {
t.Errorf("test json mutli writer error: %+v", err)
}
_, err = fmt.Fprintf(w, `{"time":"2019-07-10T05:35:54.277Z","level":"%s","caller":"test.go:42","error":"i am test error","foo":"bar","n":42,"message":"hello json mutli writer"}`+"\n", level)
if err != nil {
t.Errorf("test json mutli writer error: %+v", err)
}
_, err = fmt.Fprintf(w, `{"time":"2019-07-10T05:35:54.277+08:00","level":"%s","caller":"test.go:42","error":"i am test error","foo":"bar","n":42,"message":"hello json mutli writer"}`+"\n", level)
if err != nil {
t.Errorf("test json mutli writer error: %+v", err)
}
}

w.ParseLevel = func(p []byte) Level { return ParseLevel(string(p[49])) }
w.StderrLevel = ErrorLevel
for _, level := range []string{"trace", "debug", "info", "warning", "error", "fatal", "panic", "hahaha"} {
_, err = fmt.Fprintf(w, `{"time":"2019-07-10T05:35:54.277+08:00","level":"%s","foo":"bar","n":42,"message":"hello user-defined parse level mutli writer"}`+"\n", level)
if err != nil {
t.Errorf("test json mutli writer error: %+v", err)
}
}

if err := w.Close(); err != nil {
t.Errorf("test close mutli writer error: %+v", err)
}
}

func BenchmarkNewMultiWriter(b *testing.B) {
w := &MultiWriter{
InfoWriter: &FileWriter{
Expand Down Expand Up @@ -249,37 +106,3 @@ func BenchmarkNewMultiWriter(b *testing.B) {
}
}
}

func BenchmarkOldMultiWriter(b *testing.B) {
w := &MultiWriter{
InfoWriter: &FileWriter{
Filename: "file-info.log",
},
WarnWriter: &FileWriter{
Filename: "file-warn.log",
},
ErrorWriter: &FileWriter{
Filename: "file-error.log",
},
}
logger := Logger{
Level: InfoLevel,
Caller: 1,
Writer: w,
}
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
logger.Info().Int("id", 42).Strs("names", []string{"apple", "orange"}).Msg("I'm loving it.")
logger.Warn().Int("id", 43).Msg("I double dare you.")
logger.Error().Str("action", "cleanup").Msg("World")
}
b.StopTimer()
matches, _ := filepath.Glob("file-*.log")
for i := range matches {
err := os.Remove(matches[i])
if err != nil {
b.Fatalf("os remove %s error: %+v", matches[i], err)
}
}
}

0 comments on commit 0d84e03

Please sign in to comment.