mirror of https://github.com/dapr/kit.git
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:
parent
5a284d0d92
commit
c213121f0b
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Reference in New Issue