Skip to content

Commit f23bae7

Browse files
joeybloggsjoeybloggs
authored andcommitted
Add WithFields(...) to Entry and StackTrace() functions.
1 parent 4d75a4e commit f23bae7

File tree

6 files changed

+65
-7
lines changed

6 files changed

+65
-7
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## log
22
<img align="right" src="https://raw.githubusercontent.com/go-playground/log/master/logo.png">
3-
![Project status](https://img.shields.io/badge/version-2.1-green.svg)
3+
![Project status](https://img.shields.io/badge/version-2.2-green.svg)
44
[![Build Status](https://semaphoreci.com/api/v1/joeybloggs/log/branches/master/badge.svg)](https://semaphoreci.com/joeybloggs/log)
55
[![Coverage Status](https://coveralls.io/repos/github/go-playground/log/badge.svg?branch=master)](https://coveralls.io/github/go-playground/log?branch=master)
66
[![Go Report Card](https://goreportcard.com/badge/github.com/go-playground/log)](https://goreportcard.com/report/github.com/go-playground/log)

entry.go

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

33
import (
44
"fmt"
5+
"runtime"
56
"strings"
67
"sync"
78
"time"
@@ -195,6 +196,20 @@ func (e *Entry) Fatalf(msg string, v ...interface{}) {
195196
exitFunc(1)
196197
}
197198

199+
// WithFields adds the provided fieldsto the current entry
200+
func (e *Entry) WithFields(fields ...Field) LeveledLogger {
201+
e.Fields = append(e.Fields, fields...)
202+
return e
203+
}
204+
205+
// StackTrace adds a field with stack trace to the current log Entry.
206+
func (e *Entry) StackTrace() LeveledLogger {
207+
trace := make([]byte, 1<<16)
208+
n := runtime.Stack(trace, true)
209+
e.Fields = append(e.Fields, F("stack trace", string(trace[:n])+"\n"))
210+
return e
211+
}
212+
198213
// Consumed lets the Entry and subsequently the Logger
199214
// instance know that it has been used by a handler
200215
func (e *Entry) Consumed() {

log.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -105,15 +105,11 @@ type LeveledLogger interface {
105105
Panicf(msg string, v ...interface{})
106106
Alertf(msg string, v ...interface{})
107107
Fatalf(msg string, v ...interface{})
108-
}
109-
110-
// FieldLeveledLogger interface for logging by level and WithFields
111-
type FieldLeveledLogger interface {
112-
LeveledLogger
113108
WithFields(...Field) LeveledLogger
109+
StackTrace() LeveledLogger
114110
}
115111

116-
var _ FieldLeveledLogger = Logger
112+
var _ LeveledLogger = Logger
117113

118114
// Debug level formatted message.
119115
func (l *logger) Debug(v ...interface{}) {
@@ -255,6 +251,13 @@ func (l *logger) WithFields(fields ...Field) LeveledLogger {
255251
return newEntry(InfoLevel, "", fields, skipLevel)
256252
}
257253

254+
// StackTrace creates a new log Entry with pre-populated field with stack trace.
255+
func (l *logger) StackTrace() LeveledLogger {
256+
trace := make([]byte, 1<<16)
257+
n := runtime.Stack(trace, true)
258+
return newEntry(DebugLevel, "", []Field{F("stack trace", string(trace[:n])+"\n")}, skipLevel)
259+
}
260+
258261
func (l *logger) HandleEntry(e *Entry) {
259262

260263
// gather info if WarnLevel, ErrorLevel, PanicLevel, AlertLevel, FatalLevel or

log_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,22 @@ func TestConsoleLoggerCaller1(t *testing.T) {
260260
if buff.String() != "INFO log_test.go:256 Test Message\n" {
261261
t.Errorf("test Custom Entry: Expected '%s' Got '%s'", "INFO log_test.go:256 Test Message\n", buff.String())
262262
}
263+
264+
buff.Reset()
265+
Logger.StackTrace().Debug()
266+
267+
expected := "DEBUG log_test.go:265 stack trace="
268+
if !strings.HasPrefix(buff.String(), expected) {
269+
t.Errorf("Expected Prefix '%s' Got '%s'", expected, buff.String())
270+
}
271+
272+
buff.Reset()
273+
Logger.WithFields(Logger.F("key", "value")).StackTrace().Debug()
274+
275+
expected = "DEBUG log_test.go:273 key=value stack trace="
276+
if !strings.HasPrefix(buff.String(), expected) {
277+
t.Errorf("Expected Prefix '%s' Got '%s'", expected, buff.String())
278+
}
263279
}
264280

265281
func TestLevel(t *testing.T) {

pkg.go

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

33
import (
44
"fmt"
5+
"runtime"
56
"time"
67
)
78

@@ -177,6 +178,13 @@ func WithFields(fields ...Field) LeveledLogger {
177178
return newEntry(InfoLevel, "", fields, skipLevel)
178179
}
179180

181+
// StackTrace creates a new log Entry with pre-populated field with stack trace.
182+
func StackTrace() LeveledLogger {
183+
trace := make([]byte, 1<<16)
184+
n := runtime.Stack(trace, true)
185+
return newEntry(DebugLevel, "", []Field{F("stack trace", string(trace[:n])+"\n")}, skipLevel)
186+
}
187+
180188
// HandleEntry send the logs entry out to all the registered handlers
181189
func HandleEntry(e *Entry) {
182190
Logger.HandleEntry(e)

pkg_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,22 @@ func TestConsoleLoggerCaller2(t *testing.T) {
401401
if buff.String() != "INFO pkg_test.go:399 Test Message\n" {
402402
t.Errorf("test Custom Entry: Expected '%s' Got '%s'", "INFO pkg_test.go:399 Test Message\n", buff.String())
403403
}
404+
405+
buff.Reset()
406+
StackTrace().Debug()
407+
408+
expected := "DEBUG pkg_test.go:406 stack trace="
409+
if !strings.HasPrefix(buff.String(), expected) {
410+
t.Errorf("Expected Prefix '%s' Got '%s'", expected, buff.String())
411+
}
412+
413+
buff.Reset()
414+
StackTrace().WithFields(F("key", "value")).Debug()
415+
416+
expected = "DEBUG pkg_test.go:414 stack trace="
417+
if !strings.HasPrefix(buff.String(), expected) {
418+
t.Errorf("Expected Prefix '%s' Got '%s'", expected, buff.String())
419+
}
404420
}
405421

406422
func TestFatal2(t *testing.T) {

0 commit comments

Comments
 (0)