Skip to content

Commit 2a2006a

Browse files
committed
Added backend formatter
Makes it possible to have different formatters for different backends. Fixes #25 and #31.
1 parent ba35e95 commit 2a2006a

File tree

4 files changed

+50
-0
lines changed

4 files changed

+50
-0
lines changed

format.go

+21
Original file line numberDiff line numberDiff line change
@@ -345,3 +345,24 @@ func formatFuncName(v fmtVerb, f string) string {
345345
}
346346
panic("unexpected func formatter")
347347
}
348+
349+
// backendFormatter combines a backend with a specific formatter making it
350+
// possible to have different log formats for different backends.
351+
type backendFormatter struct {
352+
b Backend
353+
f Formatter
354+
}
355+
356+
// NewBackendFormatter creates a new backend which makes all records that
357+
// passes through it beeing formatted by the specific formatter.
358+
func NewBackendFormatter(b Backend, f Formatter) *backendFormatter {
359+
return &backendFormatter{b, f}
360+
}
361+
362+
// Log implements the Log function required by the Backend interface.
363+
func (bf *backendFormatter) Log(level Level, calldepth int, r *Record) error {
364+
// Make a shallow copy of the record and replace any formatter
365+
r2 := *r
366+
r2.formatter = bf.f
367+
return bf.b.Log(level, calldepth+1, &r2)
368+
}

format_test.go

+26
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ func logAndGetLine(backend *MemoryBackend) string {
3232
return MemoryRecordN(backend, 0).Formatted(1)
3333
}
3434

35+
func getLastLine(backend *MemoryBackend) string {
36+
return MemoryRecordN(backend, 0).Formatted(1)
37+
}
38+
3539
func realFunc(backend *MemoryBackend) string {
3640
return logAndGetLine(backend)
3741
}
@@ -138,6 +142,28 @@ func TestFormatFuncName(t *testing.T) {
138142
}
139143
}
140144

145+
func TestBackendFormatter(t *testing.T) {
146+
InitForTesting(DEBUG)
147+
148+
// Create two backends and wrap one of the with a backend formatter
149+
b1 := NewMemoryBackend(1)
150+
b2 := NewMemoryBackend(1)
151+
152+
f := MustStringFormatter("%{level} %{message}")
153+
bf := NewBackendFormatter(b2, f)
154+
155+
SetBackend(b1, bf)
156+
157+
log := MustGetLogger("module")
158+
log.Info("foo")
159+
if "foo" != getLastLine(b1) {
160+
t.Errorf("Unexpected line: %s", getLastLine(b1))
161+
}
162+
if "INFO foo" != getLastLine(b2) {
163+
t.Errorf("Unexpected line: %s", getLastLine(b2))
164+
}
165+
}
166+
141167
func BenchmarkStringFormatter(b *testing.B) {
142168
fmt := "%{time:2006-01-02T15:04:05} %{level:.1s} %{id:04d} %{module} %{message}"
143169
f := MustStringFormatter(fmt)

level.go

+1
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ func (l *moduleLeveled) IsEnabledFor(level Level, module string) bool {
107107

108108
func (l *moduleLeveled) Log(level Level, calldepth int, rec *Record) (err error) {
109109
if l.IsEnabledFor(level, rec.Module) {
110+
// TODO get rid of traces of formatter here. BackendFormatter should be used.
110111
rec.formatter = l.getFormatterAndCacheCurrent()
111112
err = l.backend.Log(level, calldepth+1, rec)
112113
}

multi.go

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
package logging
66

7+
// TODO remove Level stuff from the multi logger. Do one thing.
8+
79
// multiLogger is a log multiplexer which can be used to utilize multiple log
810
// backends at once.
911
type multiLogger struct {

0 commit comments

Comments
 (0)