Skip to content

Commit c036899

Browse files
authored
Merge pull request #66 from cdr/rewrite-5
Rewrite V5
2 parents 646b5aa + 8e070d3 commit c036899

File tree

15 files changed

+281
-375
lines changed

15 files changed

+281
-375
lines changed

example_test.go

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,22 @@ func Example_tracing() {
6464
// 2019-12-09 21:59:48.110 [INFO] <example_test.go:62> my msg {"trace": "f143d018d00de835688453d8dc55c9fd", "span": "f214167bf550afc3", "hello": "hi"}
6565
}
6666

67+
func Example_multiple() {
68+
ctx := context.Background()
69+
l := sloghuman.Make(os.Stdout)
70+
71+
f, err := os.OpenFile("stackdriver", os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644)
72+
if err != nil {
73+
l.Fatal(ctx, "failed to open stackdriver log file", slog.Error(err))
74+
}
75+
76+
l = slog.Make(l, slogstackdriver.Make(f))
77+
78+
l.Info(ctx, "log to stdout and stackdriver")
79+
80+
// 2019-12-07 20:59:55.790 [INFO] <example_test.go:46> log to stdout and stackdriver
81+
}
82+
6783
func ExampleWith() {
6884
ctx := slog.With(context.Background(), slog.F("field", 1))
6985

@@ -82,22 +98,6 @@ func ExampleStdlib() {
8298
// 2019-12-07 20:54:23.986 [INFO] (stdlib) <example_test.go:29> msg {"field": 1}
8399
}
84100

85-
func ExampleTee() {
86-
ctx := context.Background()
87-
l := sloghuman.Make(os.Stdout)
88-
89-
f, err := os.OpenFile("stackdriver", os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644)
90-
if err != nil {
91-
l.Fatal(ctx, "failed to open stackdriver log file", slog.Error(err))
92-
}
93-
94-
l = slog.Tee(l, slogstackdriver.Make(f, nil))
95-
96-
l.Info(ctx, "log to stdout and stackdriver")
97-
98-
// 2019-12-07 20:59:55.790 [INFO] <example_test.go:46> log to stdout and stackdriver
99-
}
100-
101101
func ExampleLogger_Named() {
102102
ctx := context.Background()
103103

@@ -108,14 +108,14 @@ func ExampleLogger_Named() {
108108
// 2019-12-07 21:20:56.974 [INFO] (http) <example_test.go:85> received request {"remote address": "127.0.0.1"}
109109
}
110110

111-
func ExampleLogger_SetLevel() {
111+
func ExampleLogger_Leveled() {
112112
ctx := context.Background()
113113

114114
l := sloghuman.Make(os.Stdout)
115115
l.Debug(ctx, "testing1")
116116
l.Info(ctx, "received request")
117117

118-
l.SetLevel(slog.LevelDebug)
118+
l = l.Leveled(slog.LevelDebug)
119119

120120
l.Debug(ctx, "testing2")
121121

export_test.go

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,5 @@
11
package slog
22

3-
var Exits = 0
4-
var Errors = 0
5-
6-
func init() {
7-
exit = func(code int) {
8-
Exits++
9-
}
10-
errorf = func(string, ...interface{}) {
11-
Errors++
12-
}
3+
func (l *Logger) SetExit(fn func(int)) {
4+
l.exit = fn
135
}

internal/entryhuman/json.go

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,24 +30,13 @@ func formatJSON(w io.Writer, buf []byte) []byte {
3030
return buf
3131
}
3232

33-
highlighted, err := colorizeJSON(buf)
34-
if err != nil {
35-
println("humanfmt: failed to colorize fields JSON: " + err.Error())
36-
return buf
37-
}
33+
highlighted, _ := colorizeJSON(buf)
3834
return highlighted
3935
}
4036

4137
func colorizeJSON(buf []byte) ([]byte, error) {
42-
it, err := jsonLexer.Tokenise(nil, string(buf))
43-
if err != nil {
44-
return nil, err
45-
}
46-
38+
it, _ := jsonLexer.Tokenise(nil, string(buf))
4739
b := &bytes.Buffer{}
48-
err = formatters.TTY8.Format(b, style, it)
49-
if err != nil {
50-
return nil, err
51-
}
40+
formatters.TTY8.Format(b, style, it)
5241
return b.Bytes(), nil
5342
}

internal/syncwriter/syncwriter.go

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package syncwriter
33

44
import (
55
"errors"
6+
"fmt"
67
"io"
78
"os"
89
"sync"
@@ -13,20 +14,28 @@ import (
1314
type Writer struct {
1415
mu sync.Mutex
1516
w io.Writer
17+
18+
errorf func(f string, v ...interface{})
1619
}
1720

1821
// New returns a new Writer that writes to w.
1922
func New(w io.Writer) *Writer {
2023
return &Writer{
2124
w: w,
25+
26+
errorf: func(f string, v ...interface{}) {
27+
println(fmt.Sprintf(f, v...))
28+
},
2229
}
2330
}
2431

25-
// Write implements io.Writer.
26-
func (w *Writer) Write(p []byte) (int, error) {
32+
func (w *Writer) Write(name string, p []byte) {
2733
w.mu.Lock()
2834
defer w.mu.Unlock()
29-
return w.w.Write(p)
35+
_, err := w.w.Write(p)
36+
if err != nil {
37+
w.errorf("%v: failed to write entry: %+v", name, err)
38+
}
3039
}
3140

3241
type syncer interface {
@@ -37,13 +46,13 @@ var _ syncer = &os.File{}
3746

3847
// Sync calls Sync on the underlying writer
3948
// if possible.
40-
func (w *Writer) Sync() error {
49+
func (w *Writer) Sync(sinkName string) {
4150
w.mu.Lock()
4251
defer w.mu.Unlock()
4352

4453
s, ok := w.w.(syncer)
4554
if !ok {
46-
return nil
55+
return
4756
}
4857
err := s.Sync()
4958
if _, ok := w.w.(*os.File); ok {
@@ -53,10 +62,11 @@ func (w *Writer) Sync() error {
5362
// See https://github.com/uber-go/zap/issues/370
5463
// See https://github.com/cdr/slog/pull/43
5564
if errorsIsAny(err, syscall.EINVAL, syscall.ENOTTY, syscall.EBADF) {
56-
return nil
65+
return
5766
}
5867
}
59-
return err
68+
69+
w.errorf("failed to sync %v: %+v", sinkName, err)
6070
}
6171

6272
func errorsIsAny(err error, errs ...error) bool {

internal/syncwriter/syncwriter_test.go

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,36 +9,50 @@ import (
99
"cdr.dev/slog/internal/assert"
1010
)
1111

12+
type testWriter struct {
13+
w *Writer
14+
errors int
15+
}
16+
1217
func TestWriter_Sync(t *testing.T) {
1318
t.Parallel()
1419

20+
newWriter := func(w io.Writer) *testWriter {
21+
tw := &testWriter{
22+
w: New(w),
23+
}
24+
tw.w.errorf = func(f string, v ...interface{}) {
25+
tw.errors++
26+
}
27+
return tw
28+
}
29+
1530
t.Run("nonSyncWriter", func(t *testing.T) {
1631
t.Parallel()
1732

18-
w := &Writer{}
19-
assert.Nil(t, w.Sync(), "syncErr")
33+
tw := newWriter(nil)
34+
tw.w.Sync("test")
35+
assert.Equal(t, 0, tw.errors, "errors")
2036
})
2137

2238
t.Run("syncWriter", func(t *testing.T) {
2339
t.Parallel()
2440

25-
w := &Writer{
26-
w: syncWriter{
27-
sw: func() error {
28-
return io.EOF
29-
},
41+
tw := newWriter(syncWriter{
42+
sw: func() error {
43+
return io.EOF
3044
},
31-
}
32-
assert.Equal(t, io.EOF, w.Sync(), "syncErr")
45+
})
46+
tw.w.Sync("test")
47+
assert.Equal(t, 1, tw.errors, "errors")
3348
})
3449

3550
t.Run("stdout", func(t *testing.T) {
3651
t.Parallel()
3752

38-
w := &Writer{
39-
w: os.Stdout,
40-
}
41-
assert.Success(t, w.Sync(), "syncErr")
53+
tw := newWriter(os.Stdout)
54+
tw.w.Sync("test")
55+
assert.Equal(t, 0, tw.errors, "errors")
4256
})
4357
}
4458

s_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ func TestStdlib(t *testing.T) {
1414
t.Parallel()
1515

1616
b := &bytes.Buffer{}
17-
l := sloghuman.Make(b).With(
17+
l := slog.Make(sloghuman.Make(b)).With(
1818
slog.F("hi", "we"),
1919
)
2020
stdlibLog := slog.Stdlib(bg, l)

0 commit comments

Comments
 (0)