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

fix(logger): Use exportable field names in log output. #246

Merged
merged 1 commit into from
Mar 26, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 18 additions & 13 deletions pkg/logging/logger.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,37 +73,42 @@ func SetLogLevel(logLevel LogLevel) {

// GetLogger returns a log producer with the given name
func GetLogger(sdkKey, name string) OptimizelyLogProducer {

fields := map[string]interface{}{
"instance": GetSdkKeyLogMapping(sdkKey),
"name": name,
}

if shouldIncludeSDKKey {
fields["sdkKey"] = sdkKey
}

return NamedLogProducer{
fields: map[string]interface{}{"aSdkKeyLogMapping":GetSdkKeyLogMapping(sdkKey), "name": name},
fields: fields,
}
}

// GetSdkKeyLogMapping returns a string that maps to the sdk key that is used for logging (hiding the sdk key)
func GetSdkKeyLogMapping(sdkKey string) string {
if logMapping, _ := sdkKeyMappings.Load(sdkKey); logMapping != nil {
if lm, ok := logMapping.(string);ok {
if lm, ok := logMapping.(string); ok {
return lm
}
} else if sdkKey != "" {
mapping := "optimizely-" + strconv.Itoa(int(atomic.AddInt32(&count, 1)))
mapping := "Instance-" + strconv.Itoa(int(atomic.AddInt32(&count, 1)))
sdkKeyMappings.Store(sdkKey, mapping)
return mapping
}

return ""
}

// UseSdkKeyForLogging by default the sdk key is masked for logging.
// This sets it to use the SDK Key and should be set before the creating your client factory.
func UseSdkKeyForLogging(sdkKey string) {
SetSdkKeyLogMapping(sdkKey, sdkKey)
}
// Default to NOT include the SDK in log fields
var shouldIncludeSDKKey = false

// SetSdkKeyLogMapping sets the logging key to use for the Optimizely sdk key.
// By default, the sdk key has masking. This can override the default of optimizely-1,2,3,4,etc..
// This should be set before creating your Optimizely client factory.
func SetSdkKeyLogMapping(sdkKey, logMapping string) {
sdkKeyMappings.Store(sdkKey, logMapping)
// IncludeSDKKeyInLogFields to set whether or not the SDK key is included in the logging output.
func IncludeSDKKeyInLogFields(include bool) {
shouldIncludeSDKKey = include
}

// NamedLogProducer produces logs prefixed with its name
Expand Down
37 changes: 18 additions & 19 deletions pkg/logging/logger_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,57 +103,56 @@ func TestNamedLoggerFields(t *testing.T) {

SetLogger(newLogger)

logger := GetLogger("TestNamedLoggerFields-sdkKey", "TestNamedLoggerFields")
sdkKey := "TestNamedLoggerFields-sdkKey"
logger := GetLogger(sdkKey, "TestNamedLoggerFields")
logger.Debug("test message")

key := GetSdkKeyLogMapping("TestNamedLoggerFields-sdkKey")
assert.Contains(t, out.String(), "test message")
assert.Contains(t, out.String(), "[Debug]")
assert.Contains(t, out.String(), "[TestNamedLoggerFields]")
assert.Contains(t, out.String(), key)
assert.Contains(t, out.String(), GetSdkKeyLogMapping(sdkKey))
assert.NotContains(t, out.String(), "TestNamedLoggerFields-sdkKey")
assert.Contains(t, out.String(), "[Optimizely]")

}

func TestLogSdkKeyOverride(t *testing.T) {
func TestLogSdkKey(t *testing.T) {
out := &bytes.Buffer{}
newLogger := NewFilteredLevelLogConsumer(LogLevelDebug, out)

SetLogger(newLogger)

key := "test-test-test"
SetSdkKeyLogMapping("TestLogOverride-sdkKey", key)

logger := GetLogger("TestLogOverride-sdkKey", "TestLogSdkKeyOverride")
sdkKey := "TestLogSdkKey-sdkKey"
logger := GetLogger(sdkKey, "TestLogSdkKeyOverride")
logger.Debug("test message")

assert.Contains(t, out.String(), "test message")
assert.Contains(t, out.String(), "[Debug]")
assert.Contains(t, out.String(), "[TestLogSdkKeyOverride]")
assert.Contains(t, out.String(), key)
assert.NotContains(t, out.String(), "TestNamedLoggerFields-sdkKey")
assert.Contains(t, out.String(), GetSdkKeyLogMapping(sdkKey))
assert.Contains(t, out.String(), "[Optimizely]")
assert.NotContains(t, out.String(), sdkKey)
}

func TestLogSdkKey(t *testing.T) {
func TestLogWithSdkKey(t *testing.T) {
out := &bytes.Buffer{}
newLogger := NewFilteredLevelLogConsumer(LogLevelDebug, out)

SetLogger(newLogger)

key := "TestLogSdkKey-sdkKey"

UseSdkKeyForLogging(key)

logger := GetLogger(key, "TestLogSdkKeyOverride")
IncludeSDKKeyInLogFields(true)
sdkKey := "TestLogSdkKey-sdkKey"
logger := GetLogger(sdkKey, "TestLogSdkKeyOverride")
logger.Debug("test message")

assert.Contains(t, out.String(), "test message")
assert.Contains(t, out.String(), "[Debug]")
assert.Contains(t, out.String(), "[TestLogSdkKeyOverride]")
assert.Contains(t, out.String(), key)
assert.Contains(t, out.String(), GetSdkKeyLogMapping(sdkKey))
assert.Contains(t, out.String(), "[Optimizely]")
assert.Contains(t, out.String(), sdkKey)

IncludeSDKKeyInLogFields(false)
}

func TestLoggingOrder(t *testing.T) {
Expand All @@ -172,7 +171,7 @@ func TestLoggingOrder(t *testing.T) {
response := out.String()

assert.Contains(t, response, "test message")
assert.Contains(t, response, "[Debug][" + key +"][TestLoggingOrder] test message" )
assert.Contains(t, response, "[Debug]["+key+"][TestLoggingOrder] test message")
assert.True(t, strings.HasPrefix(response, "[Optimizely]"))

}
Expand All @@ -193,7 +192,7 @@ func TestLoggingOrderEmpty(t *testing.T) {
response := out.String()

assert.Contains(t, response, "test message")
assert.Contains(t, response, "[Debug][TestLoggingOrder] test message" )
assert.Contains(t, response, "[Debug][TestLoggingOrder] test message")
assert.True(t, strings.HasPrefix(response, "[Optimizely]"))

}
Expand Down