1
0
mirror of https://github.com/rs/zerolog synced 2026-06-08 17:13:30 +00:00

Add forwarding close methods to several writer implementations (#636)

This commit is contained in:
Garret Buell
2024-01-13 10:08:26 -08:00
committed by GitHub
parent c1ab4ed9bf
commit 4d78dc5ffa
5 changed files with 27 additions and 2 deletions
+9
View File
@@ -155,6 +155,15 @@ func (w ConsoleWriter) Write(p []byte) (n int, err error) {
return len(p), err return len(p), err
} }
// Call the underlying writer's Close method if it is an io.Closer. Otherwise
// does nothing.
func (w ConsoleWriter) Close() error {
if closer, ok := w.Out.(io.Closer); ok {
return closer.Close()
}
return nil
}
// writeFields appends formatted key-value pairs to buf. // writeFields appends formatted key-value pairs to buf.
func (w ConsoleWriter) writeFields(evt map[string]interface{}, buf *bytes.Buffer) { func (w ConsoleWriter) writeFields(evt map[string]interface{}, buf *bytes.Buffer) {
var fields = make([]string, 0, len(evt)) var fields = make([]string, 0, len(evt))
+3 -1
View File
@@ -6,6 +6,8 @@ import (
"io" "io"
"reflect" "reflect"
"testing" "testing"
"github.com/rs/zerolog/internal/cbor"
) )
func TestCtx(t *testing.T) { func TestCtx(t *testing.T) {
@@ -93,7 +95,7 @@ func Test_InterfaceLogObjectMarshaler(t *testing.T) {
withLog.Info().Msg("test") withLog.Info().Msg("test")
if got, want := buf.String(), `{"level":"info","obj":{"name":"custom_value","age":29},"message":"test"}`+"\n"; got != want { if got, want := cbor.DecodeIfBinaryToString(buf.Bytes()), `{"level":"info","obj":{"name":"custom_value","age":29},"message":"test"}`+"\n"; got != want {
t.Errorf("got %q, want %q", got, want) t.Errorf("got %q, want %q", got, want)
} }
} }
+1 -1
View File
@@ -70,7 +70,7 @@ func TestFatal(t *testing.T) {
} }
want := "{\"level\":\"fatal\",\"message\":\"test\"}\n" want := "{\"level\":\"fatal\",\"message\":\"test\"}\n"
got := string(slurp) got := cbor.DecodeIfBinaryToString(slurp)
if got != want { if got != want {
t.Errorf("Diode Fatal Test failed. got:%s, want:%s!", got, want) t.Errorf("Diode Fatal Test failed. got:%s, want:%s!", got, want)
} }
+9
View File
@@ -78,3 +78,12 @@ func (sw syslogWriter) WriteLevel(level Level, p []byte) (n int, err error) {
n = len(p) n = len(p)
return return
} }
// Call the underlying writer's Close method if it is an io.Closer. Otherwise
// does nothing.
func (sw syslogWriter) Close() error {
if c, ok := sw.w.(io.Closer); ok {
return c.Close()
}
return nil
}
+5
View File
@@ -27,6 +27,8 @@ func (lw LevelWriterAdapter) WriteLevel(l Level, p []byte) (n int, err error) {
return lw.Write(p) return lw.Write(p)
} }
// Call the underlying writer's Close method if it is an io.Closer. Otherwise
// does nothing.
func (lw LevelWriterAdapter) Close() error { func (lw LevelWriterAdapter) Close() error {
if closer, ok := lw.Writer.(io.Closer); ok { if closer, ok := lw.Writer.(io.Closer); ok {
return closer.Close() return closer.Close()
@@ -105,6 +107,9 @@ func (t multiLevelWriter) WriteLevel(l Level, p []byte) (n int, err error) {
return n, err return n, err
} }
// Calls close on all the underlying writers that are io.Closers. If any of the
// Close methods return an error, the remainder of the closers are not closed
// and the error is returned.
func (t multiLevelWriter) Close() error { func (t multiLevelWriter) Close() error {
for _, w := range t.writers { for _, w := range t.writers {
if closer, ok := w.(io.Closer); ok { if closer, ok := w.(io.Closer); ok {