Adds IsOutputLevelEnabled to allow wasm to opt-out of generating strings (#24)

* Adds IsOutputLevelEnabled to allow wasm to opt-out of generating strings

Allocation of log messages is expensive in WebAssembly. This exposes the
underlying IsLevelEnabled as IsOutputLevelEnabled. This will allow
request-scoped caching of this and help wasm filters avoid overhead
created for no reason.

Signed-off-by: Adrian Cole <adrian@tetrate.io>

* lint

Signed-off-by: Adrian Cole <adrian@tetrate.io>

Signed-off-by: Adrian Cole <adrian@tetrate.io>
This commit is contained in:
Crypt Keeper 2022-11-02 12:50:11 +08:00 committed by GitHub
parent 5a284d0d92
commit c213121f0b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 113 additions and 4 deletions

View File

@ -89,7 +89,7 @@ func (l *daprLogger) SetAppID(id string) {
}
func toLogrusLevel(lvl LogLevel) logrus.Level {
// ignore error because it will never happens
// ignore error because it will never happen
l, _ := logrus.ParseLevel(string(lvl))
return l
}
@ -99,6 +99,11 @@ func (l *daprLogger) SetOutputLevel(outputLevel LogLevel) {
l.logger.Logger.SetLevel(toLogrusLevel(outputLevel))
}
// IsOutputLevelEnabled returns true if the logger will output this LogLevel.
func (l *daprLogger) IsOutputLevelEnabled(level LogLevel) bool {
return l.logger.Logger.IsLevelEnabled(toLogrusLevel(level))
}
// SetOutput sets the destination for the logs.
func (l *daprLogger) SetOutput(dst io.Writer) {
l.logger.Logger.SetOutput(dst)

View File

@ -33,6 +33,7 @@ const fakeLoggerName = "fakeLogger"
func getTestLogger(buf io.Writer) *daprLogger {
l := newDaprLogger(fakeLoggerName)
l.SetOutput(buf)
l.logger.Logger.ExitFunc = func(i int) {} // don't quit the test
return l
}
@ -164,6 +165,105 @@ func TestJSONLoggerFields(t *testing.T) {
}
}
func TestOutputLevel(t *testing.T) {
tests := []struct {
outputLevel LogLevel
expectedOutputLevels map[LogLevel]bool
}{
{
outputLevel: DebugLevel,
expectedOutputLevels: map[LogLevel]bool{
DebugLevel: true,
InfoLevel: true,
WarnLevel: true,
ErrorLevel: true,
FatalLevel: true,
},
},
{
outputLevel: InfoLevel,
expectedOutputLevels: map[LogLevel]bool{
DebugLevel: false,
InfoLevel: true,
WarnLevel: true,
ErrorLevel: true,
FatalLevel: true,
},
},
{
outputLevel: WarnLevel,
expectedOutputLevels: map[LogLevel]bool{
DebugLevel: false,
InfoLevel: false,
WarnLevel: true,
ErrorLevel: true,
FatalLevel: true,
},
},
{
outputLevel: ErrorLevel,
expectedOutputLevels: map[LogLevel]bool{
DebugLevel: false,
InfoLevel: false,
WarnLevel: false,
ErrorLevel: true,
FatalLevel: true,
},
},
{
outputLevel: FatalLevel,
expectedOutputLevels: map[LogLevel]bool{
DebugLevel: false,
InfoLevel: false,
WarnLevel: false,
ErrorLevel: false,
FatalLevel: true,
},
},
{
outputLevel: UndefinedLevel,
expectedOutputLevels: map[LogLevel]bool{
DebugLevel: false,
InfoLevel: false,
WarnLevel: false,
ErrorLevel: false,
FatalLevel: false,
},
},
}
for _, tt := range tests {
t.Run(string(tt.outputLevel), func(t *testing.T) {
for l, want := range tt.expectedOutputLevels {
var buf bytes.Buffer
testLogger := getTestLogger(&buf)
testLogger.SetOutputLevel(tt.outputLevel)
assert.Equal(t, want, testLogger.IsOutputLevelEnabled(l))
switch l {
case DebugLevel:
testLogger.Debug("")
case InfoLevel:
testLogger.Info("")
case WarnLevel:
testLogger.Warn("")
case ErrorLevel:
testLogger.Error("")
case FatalLevel:
testLogger.Fatal("")
}
if want {
assert.NotEmptyf(t, buf.Bytes(), "expected to log %v", l)
} else {
assert.Emptyf(t, buf.Bytes(), "expected to not log %v", l)
}
}
})
}
}
func TestWithTypeFields(t *testing.T) {
var buf bytes.Buffer
testLogger := getTestLogger(&buf)

View File

@ -63,18 +63,22 @@ var (
)
// Logger includes the logging api sets.
type Logger interface {
type Logger interface { //nolint: interfacebloat
// EnableJSONOutput enables JSON formatted output log
EnableJSONOutput(enabled bool)
// SetAppID sets dapr_id field in the log. Default value is empty string
SetAppID(id string)
// SetOutputLevel sets log output level
// SetOutputLevel sets the log output level
SetOutputLevel(outputLevel LogLevel)
// SetOutput sets the destination for the logs
SetOutput(dst io.Writer)
// WithLogType specify the log_type field in log. Default value is LogTypeLog
// IsOutputLevelEnabled returns true if the logger will output this LogLevel.
IsOutputLevelEnabled(level LogLevel) bool
// WithLogType specifies the log_type field in log. Default value is LogTypeLog
WithLogType(logType string) Logger
// WithFields returns a logger with the added structured fields.