Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add ReportCallerLevel to control getCaller level #1324

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 2 additions & 1 deletion entry.go
Expand Up @@ -232,10 +232,11 @@ func (entry *Entry) log(level Level, msg string) {

newEntry.Logger.mu.Lock()
reportCaller := newEntry.Logger.ReportCaller
reportCallerLevel := newEntry.Logger.ReportCallerLevel
bufPool := newEntry.getBufferPool()
newEntry.Logger.mu.Unlock()

if reportCaller {
if reportCaller && level <= reportCallerLevel {
newEntry.Caller = getCaller()
}

Expand Down
23 changes: 16 additions & 7 deletions logger.go
Expand Up @@ -33,7 +33,9 @@ type Logger struct {

// Flag for whether to log caller info (off by default)
ReportCaller bool

// The level reportCaller work at. Like Level if ReportCaller is true and ReportCallerLevel is logrus.Error,
// Error() and Fatal() will log caller info (Debug by default)
ReportCallerLevel Level
// The logging level the logger should log at. This is typically (and defaults
// to) `logrus.Info`, which allows Info(), Warn(), Error() and Fatal() to be
// logged.
Expand Down Expand Up @@ -86,12 +88,13 @@ func (mw *MutexWrap) Disable() {
// It's recommended to make this a global instance called `log`.
func New() *Logger {
return &Logger{
Out: os.Stderr,
Formatter: new(TextFormatter),
Hooks: make(LevelHooks),
Level: InfoLevel,
ExitFunc: os.Exit,
ReportCaller: false,
Out: os.Stderr,
Formatter: new(TextFormatter),
Hooks: make(LevelHooks),
Level: InfoLevel,
ExitFunc: os.Exit,
ReportCaller: false,
ReportCallerLevel: DebugLevel,
}
}

Expand Down Expand Up @@ -400,6 +403,12 @@ func (logger *Logger) SetReportCaller(reportCaller bool) {
logger.ReportCaller = reportCaller
}

func (logger *Logger) SetReportCallerLevel(level Level) {
logger.mu.Lock()
defer logger.mu.Unlock()
logger.ReportCallerLevel = level
}

// ReplaceHooks replaces the logger hooks and returns the old ones
func (logger *Logger) ReplaceHooks(hooks LevelHooks) LevelHooks {
logger.mu.Lock()
Expand Down
21 changes: 21 additions & 0 deletions logrus_test.go
Expand Up @@ -43,6 +43,27 @@ func TestReportCallerWhenConfigured(t *testing.T) {
"github.com/sirupsen/logrus_test.TestReportCallerWhenConfigured.func3", fields[FieldKeyFunc])
})

LogAndAssertJSON(t, func(log *Logger) {
log.ReportCaller = true
log.ReportCallerLevel = InfoLevel
log.Print("testWithCallerAndCallerLevel")
}, func(fields Fields) {
assert.Equal(t, "testWithCallerAndCallerLevel", fields[FieldKeyMsg])
assert.Equal(t, "info", fields[FieldKeyLevel])
assert.Equal(t,
"github.com/sirupsen/logrus_test.TestReportCallerWhenConfigured.func5", fields[FieldKeyFunc])
})

LogAndAssertJSON(t, func(log *Logger) {
log.ReportCaller = true
log.ReportCallerLevel = ErrorLevel
log.Print("testWithCallerAndCallerLevelNotMatch")
}, func(fields Fields) {
assert.Equal(t, "testWithCallerAndCallerLevelNotMatch", fields[FieldKeyMsg])
assert.Equal(t, "info", fields[FieldKeyLevel])
assert.Equal(t, nil, fields[FieldKeyFunc])
})

LogAndAssertJSON(t, func(log *Logger) {
log.ReportCaller = true
log.Formatter.(*JSONFormatter).CallerPrettyfier = func(f *runtime.Frame) (string, string) {
Expand Down