Skip to content

Commit 68e41f6

Browse files
committed
Add WithContext
1 parent d7b6bf5 commit 68e41f6

File tree

4 files changed

+40
-2
lines changed

4 files changed

+40
-2
lines changed

entry.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package logrus
22

33
import (
44
"bytes"
5+
"context"
56
"fmt"
67
"os"
78
"reflect"
@@ -69,6 +70,9 @@ type Entry struct {
6970
// When formatter is called in entry.log(), a Buffer may be set to entry
7071
Buffer *bytes.Buffer
7172

73+
// Contains the context set by the user. Useful for hook processing etc.
74+
Context context.Context
75+
7276
// err may contain a field formatting error
7377
err string
7478
}
@@ -97,6 +101,12 @@ func (entry *Entry) WithError(err error) *Entry {
97101
return entry.WithField(ErrorKey, err)
98102
}
99103

104+
// Add a context to the Entry.
105+
func (entry *Entry) WithContext(ctx context.Context) *Entry {
106+
entry.Context = ctx
107+
return entry
108+
}
109+
100110
// Add a single field to the Entry.
101111
func (entry *Entry) WithField(key string, value interface{}) *Entry {
102112
return entry.WithFields(Fields{key: value})
@@ -130,12 +140,12 @@ func (entry *Entry) WithFields(fields Fields) *Entry {
130140
data[k] = v
131141
}
132142
}
133-
return &Entry{Logger: entry.Logger, Data: data, Time: entry.Time, err: fieldErr}
143+
return &Entry{Logger: entry.Logger, Data: data, Time: entry.Time, err: fieldErr, Context: entry.Context}
134144
}
135145

136146
// Overrides the time of the Entry.
137147
func (entry *Entry) WithTime(t time.Time) *Entry {
138-
return &Entry{Logger: entry.Logger, Data: entry.Data, Time: t, err: entry.err}
148+
return &Entry{Logger: entry.Logger, Data: entry.Data, Time: t, err: entry.err, Context: entry.Context}
139149
}
140150

141151
// getPackageName reduces a fully qualified function name to the package name

entry_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package logrus
22

33
import (
44
"bytes"
5+
"context"
56
"fmt"
67
"testing"
78
"time"
@@ -33,6 +34,19 @@ func TestEntryWithError(t *testing.T) {
3334

3435
}
3536

37+
func TestEntryWithContext(t *testing.T) {
38+
assert := assert.New(t)
39+
ctx := context.WithValue(context.Background(), "foo", "bar")
40+
41+
assert.Equal(ctx, WithContext(ctx).Context)
42+
43+
logger := New()
44+
logger.Out = &bytes.Buffer{}
45+
entry := NewEntry(logger)
46+
47+
assert.Equal(ctx, entry.WithContext(ctx).Context)
48+
}
49+
3650
func TestEntryPanicln(t *testing.T) {
3751
errBoom := fmt.Errorf("boom time")
3852

exported.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package logrus
22

33
import (
4+
"context"
45
"io"
56
"time"
67
)
@@ -55,6 +56,11 @@ func WithError(err error) *Entry {
5556
return std.WithField(ErrorKey, err)
5657
}
5758

59+
// WithContext creates an entry from the standard logger and adds a context to it.
60+
func WithContext(ctx context.Context) *Entry {
61+
return std.WithContext(ctx)
62+
}
63+
5864
// WithField creates an entry from the standard logger and adds a field to
5965
// it. If you want multiple fields, use `WithFields`.
6066
//

logger.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package logrus
22

33
import (
4+
"context"
45
"io"
56
"os"
67
"sync"
@@ -124,6 +125,13 @@ func (logger *Logger) WithError(err error) *Entry {
124125
return entry.WithError(err)
125126
}
126127

128+
// Add a context to the log entry.
129+
func (logger *Logger) WithContext(ctx context.Context) *Entry {
130+
entry := logger.newEntry()
131+
defer logger.releaseEntry(entry)
132+
return entry.WithContext(ctx)
133+
}
134+
127135
// Overrides the time of the log entry.
128136
func (logger *Logger) WithTime(t time.Time) *Entry {
129137
entry := logger.newEntry()

0 commit comments

Comments
 (0)