Skip to content

Commit d219098

Browse files
prestonvasquezqingyang-hu
authored andcommitted
GODRIVER-2881 Enable logging for ComponentAll (#1340)
1 parent afb5419 commit d219098

File tree

2 files changed

+194
-2
lines changed

2 files changed

+194
-2
lines changed

internal/logger/logger.go

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,25 @@ func (logger *Logger) Close() error {
7575
}
7676

7777
// LevelComponentEnabled will return true if the given LogLevel is enabled for
78-
// the given LogComponent.
78+
// the given LogComponent. If the ComponentLevels on the logger are enabled for
79+
// "ComponentAll", then this function will return true for any level bound by
80+
// the level assigned to "ComponentAll".
81+
//
82+
// If the level is not enabled (i.e. LevelOff), then false is returned. This is
83+
// to avoid false positives, such as returning "true" for a component that is
84+
// not enabled. For example, without this condition, an empty LevelComponent
85+
// would be considered "enabled" for "LevelOff".
7986
func (logger *Logger) LevelComponentEnabled(level Level, component Component) bool {
80-
return logger.ComponentLevels[component] >= level
87+
if level == LevelOff {
88+
return false
89+
}
90+
91+
if logger.ComponentLevels == nil {
92+
return false
93+
}
94+
95+
return logger.ComponentLevels[component] >= level ||
96+
logger.ComponentLevels[ComponentAll] >= level
8197
}
8298

8399
// Print will synchronously print the given message to the configured LogSink.

internal/logger/logger_test.go

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import (
1414
"reflect"
1515
"sync"
1616
"testing"
17+
18+
"go.mongodb.org/mongo-driver/internal/assert"
1719
)
1820

1921
type mockLogSink struct{}
@@ -334,3 +336,177 @@ func TestTruncate(t *testing.T) {
334336
}
335337

336338
}
339+
340+
func TestLogger_LevelComponentEnabled(t *testing.T) {
341+
t.Parallel()
342+
343+
tests := []struct {
344+
name string
345+
logger Logger
346+
level Level
347+
component Component
348+
want bool
349+
}{
350+
{
351+
name: "zero",
352+
logger: Logger{},
353+
level: LevelOff,
354+
component: ComponentCommand,
355+
want: false,
356+
},
357+
{
358+
name: "empty",
359+
logger: Logger{
360+
ComponentLevels: map[Component]Level{},
361+
},
362+
level: LevelOff,
363+
component: ComponentCommand,
364+
want: false, // LevelOff should never be considered enabled.
365+
},
366+
{
367+
name: "one level below",
368+
logger: Logger{
369+
ComponentLevels: map[Component]Level{
370+
ComponentCommand: LevelDebug,
371+
},
372+
},
373+
level: LevelInfo,
374+
component: ComponentCommand,
375+
want: true,
376+
},
377+
{
378+
name: "equal levels",
379+
logger: Logger{
380+
ComponentLevels: map[Component]Level{
381+
ComponentCommand: LevelDebug,
382+
},
383+
},
384+
level: LevelDebug,
385+
component: ComponentCommand,
386+
want: true,
387+
},
388+
{
389+
name: "one level above",
390+
logger: Logger{
391+
ComponentLevels: map[Component]Level{
392+
ComponentCommand: LevelInfo,
393+
},
394+
},
395+
level: LevelDebug,
396+
component: ComponentCommand,
397+
want: false,
398+
},
399+
{
400+
name: "component mismatch",
401+
logger: Logger{
402+
ComponentLevels: map[Component]Level{
403+
ComponentCommand: LevelDebug,
404+
},
405+
},
406+
level: LevelDebug,
407+
component: ComponentTopology,
408+
want: false,
409+
},
410+
{
411+
name: "component all enables with topology",
412+
logger: Logger{
413+
ComponentLevels: map[Component]Level{
414+
ComponentAll: LevelDebug,
415+
},
416+
},
417+
level: LevelDebug,
418+
component: ComponentTopology,
419+
want: true,
420+
},
421+
{
422+
name: "component all enables with server selection",
423+
logger: Logger{
424+
ComponentLevels: map[Component]Level{
425+
ComponentAll: LevelDebug,
426+
},
427+
},
428+
level: LevelDebug,
429+
component: ComponentServerSelection,
430+
want: true,
431+
},
432+
{
433+
name: "component all enables with connection",
434+
logger: Logger{
435+
ComponentLevels: map[Component]Level{
436+
ComponentAll: LevelDebug,
437+
},
438+
},
439+
level: LevelDebug,
440+
component: ComponentConnection,
441+
want: true,
442+
},
443+
{
444+
name: "component all enables with command",
445+
logger: Logger{
446+
ComponentLevels: map[Component]Level{
447+
ComponentAll: LevelDebug,
448+
},
449+
},
450+
level: LevelDebug,
451+
component: ComponentCommand,
452+
want: true,
453+
},
454+
{
455+
name: "component all enables with all",
456+
logger: Logger{
457+
ComponentLevels: map[Component]Level{
458+
ComponentAll: LevelDebug,
459+
},
460+
},
461+
level: LevelDebug,
462+
component: ComponentAll,
463+
want: true,
464+
},
465+
{
466+
name: "component all does not enable with lower level",
467+
logger: Logger{
468+
ComponentLevels: map[Component]Level{
469+
ComponentAll: LevelInfo,
470+
},
471+
},
472+
level: LevelDebug,
473+
component: ComponentCommand,
474+
want: false,
475+
},
476+
{
477+
name: "component all has a lower log level than command",
478+
logger: Logger{
479+
ComponentLevels: map[Component]Level{
480+
ComponentAll: LevelInfo,
481+
ComponentCommand: LevelDebug,
482+
},
483+
},
484+
level: LevelDebug,
485+
component: ComponentCommand,
486+
want: true,
487+
},
488+
{
489+
name: "component all has a higher log level than command",
490+
logger: Logger{
491+
ComponentLevels: map[Component]Level{
492+
ComponentAll: LevelDebug,
493+
ComponentCommand: LevelInfo,
494+
},
495+
},
496+
level: LevelDebug,
497+
component: ComponentCommand,
498+
want: true,
499+
},
500+
}
501+
502+
for _, tcase := range tests {
503+
tcase := tcase // Capture the range variable.
504+
505+
t.Run(tcase.name, func(t *testing.T) {
506+
t.Parallel()
507+
508+
got := tcase.logger.LevelComponentEnabled(tcase.level, tcase.component)
509+
assert.Equal(t, tcase.want, got, "unexpected result for LevelComponentEnabled")
510+
})
511+
}
512+
}

0 commit comments

Comments
 (0)