Skip to content

Commit 0941cbc

Browse files
authored
Merge pull request #180 from optimizely/jae/loge
Add autoclosure to log message
2 parents cbea4b5 + b286219 commit 0941cbc

File tree

10 files changed

+99
-73
lines changed

10 files changed

+99
-73
lines changed

DemoSwiftApp/AppDelegate.swift

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import Optimizely
2020

2121
@UIApplicationMain
2222
class AppDelegate: UIResponder, UIApplicationDelegate {
23+
let logLevel = OptimizelyLogLevel.debug
24+
2325
let sdkKey = "FCnSegiEkRry9rhVMroit4"
2426
let datafileName = "demoTestDatafile"
2527
let experimentKey = "background_experiment"
@@ -54,7 +56,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
5456
// MARK: - Initialization Examples
5557

5658
func initializeOptimizelySDKAsynchronous() {
57-
optimizely = OptimizelyClient(sdkKey: sdkKey, defaultLogLevel: .debug)
59+
optimizely = OptimizelyClient(sdkKey: sdkKey, defaultLogLevel: logLevel)
5860

5961
optimizely.start { result in
6062
switch result {
@@ -72,8 +74,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
7274
guard let localDatafilePath = Bundle.main.path(forResource: datafileName, ofType: "json") else {
7375
fatalError("Local datafile cannot be found")
7476
}
75-
76-
optimizely = OptimizelyClient(sdkKey: sdkKey, defaultLogLevel: .debug)
77+
78+
optimizely = OptimizelyClient(sdkKey: sdkKey, defaultLogLevel: logLevel)
7779

7880
do {
7981
let datafileJSON = try String(contentsOfFile: localDatafilePath, encoding: .utf8)
@@ -97,7 +99,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
9799
optimizely = OptimizelyClient(sdkKey: sdkKey,
98100
logger: customLogger,
99101
periodicDownloadInterval: customDownloadIntervalInSecs,
100-
defaultLogLevel: .debug)
102+
defaultLogLevel: logLevel)
103+
101104
// notification listeners
102105

103106
_ = optimizely.notificationCenter.addDecisionNotificationListener(decisionListener: { (type, userId, attributes, decisionInfo) in

OptimizelySDK/Customization/DefaultEventDispatcher.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,8 @@ open class DefaultEventDispatcher : BackgroundingCallbacks, OPTEventDispatcher {
158158
self.logger?.e("Removed event different from sent event")
159159
}
160160
else {
161-
self.logger?.d("Successfully sent event " + event.body.debugDescription)
161+
// avoid event-log-message preparation overheads with closure-logging
162+
self.logger?.d({ "Successfully sent event: \(event)" })
162163
}
163164
}
164165
else {
@@ -179,7 +180,7 @@ open class DefaultEventDispatcher : BackgroundingCallbacks, OPTEventDispatcher {
179180
}
180181
}
181182
// our send is done.
182-
defer { self.notify.leave() }
183+
self.notify.leave()
183184

184185
}
185186
// wait for send

OptimizelySDK/Customization/DefaultLogger.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,11 @@ open class DefaultLogger : OPTLogger {
3434
}
3535

3636
open func log(level: OptimizelyLogLevel, message: String) {
37-
if level.rawValue > DefaultLogger.logLevel.rawValue {
37+
if level > DefaultLogger.logLevel {
3838
return
3939
}
4040
let message = "[OPTIMIZELY][" + level.name + "] " + message
41+
4142
NSLog(message)
4243
}
4344
}

OptimizelySDK/Customization/Protocols/OPTLogger.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ extension OPTLogger {
4747
func w(_ message: String) { log(level: .warning, message: message) }
4848
func i(_ message: String) { log(level: .info, message: message) }
4949
func d(_ message: String) { log(level: .debug, message: message) }
50+
// closure-based debug logging:
51+
// - we pay overhead for preparing large/complicated log messages only when it's debug level
52+
func d(_ message: () -> String) {
53+
guard Self.logLevel >= OptimizelyLogLevel.debug else { return }
54+
log(level: .debug, message: message())
55+
}
5056

5157
// MARK: - Utils for LogMessage
5258

OptimizelySDK/Data Model/DispatchEvents/EventForDispatch.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,9 @@ import Foundation
3333
return url == object.url && body == object.body
3434
}
3535
}
36+
37+
extension EventForDispatch {
38+
override public var description: String {
39+
return "[url] \(url) (" + (String(data: body, encoding: .utf8) ?? "UNKNOWN") + ")"
40+
}
41+
}

OptimizelySDK/Data Model/ProjectConfig.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,10 +277,12 @@ extension ProjectConfig {
277277
variationKey = variationKey.trimmingCharacters(in: NSCharacterSet.whitespaces)
278278

279279
guard !variationKey.isEmpty else {
280+
logger?.e(.variationKeyInvalid(experimentKey, variationKey))
280281
return false
281282
}
282283

283284
guard let variation = experiment.variations.filter({$0.key == variationKey }).first else {
285+
logger?.e(.variationKeyInvalid(experimentKey, variationKey))
284286
return false
285287
}
286288

OptimizelySDK/Implementation/DefaultDatafileHandler.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,8 @@ class DefaultDatafileHandler : OPTDatafileHandler {
126126

127127
completionHandler(result)
128128

129-
//self.logger?.d(response.debugDescription)
129+
// avoid event-log-message preparation overheads with closure-logging
130+
self.logger?.d({ response.debugDescription })
130131
}
131132

132133
task.resume()

OptimizelySDK/Optimizely/OptimizelyError.swift

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -92,26 +92,26 @@ extension OptimizelyError: CustomStringConvertible {
9292
switch self {
9393
case .generic: message = "Unknown reason"
9494
case .sdkNotReady: message = "Optimizely SDK not configured properly yet"
95-
case .experimentKeyInvalid(let key): message = "Experiment key \(key) is not in datafile. It is either invalid, paused, or archived."
96-
case .experimentIdInvalid(let id): message = "Experiment ID \(id) is not in datafile."
95+
case .experimentKeyInvalid(let key): message = "Experiment key (\(key)) is not in datafile. It is either invalid, paused, or archived."
96+
case .experimentIdInvalid(let id): message = "Experiment ID (\(id)) is not in datafile."
9797
case .experimentHasNoTrafficAllocation(let key): message = "No traffic allocation rules are defined for experiement (\(key))."
98-
case .featureKeyInvalid(let key): message = "Feature key \(key) is not in datafile."
99-
case .variationKeyInvalid(let expKey, let varKey): message = "No variation key \(varKey) defined in datafile for experiment \(expKey)."
100-
case .variationIdInvalid(let expKey, let varId): message = "No variation ID \(varId) defined in datafile for experiment \(expKey)."
101-
case .variationUnknown(let userId, let key): message = "User \(userId) does not meet conditions to be in experiment/feature \(key)."
102-
case .variableKeyInvalid(let varKey, let feature): message = "Variable with key \(varKey) associated with feature with key \(feature) is not in datafile."
103-
case .variableValueInvalid(let key): message = "Variable value for key \(key) is invalid or wrong type"
104-
case .eventKeyInvalid(let key): message = "Event key \(key) is not in datafile."
105-
case .eventBuildFailure(let key): message = "Failed to create a dispatch event \(key)"
98+
case .featureKeyInvalid(let key): message = "Feature key (\(key)) is not in datafile."
99+
case .variationKeyInvalid(let expKey, let varKey): message = "No variation key (\(varKey)) defined in datafile for experiment (\(expKey))."
100+
case .variationIdInvalid(let expKey, let varId): message = "No variation ID (\(varId)) defined in datafile for experiment (\(expKey))."
101+
case .variationUnknown(let userId, let key): message = "User (\(userId)) does not meet conditions to be in experiment/feature (\(key))."
102+
case .variableKeyInvalid(let varKey, let feature): message = "Variable with key (\(varKey)) associated with feature with key (\(feature)) is not in datafile."
103+
case .variableValueInvalid(let key): message = "Variable value for key (\(key)) is invalid or wrong type"
104+
case .eventKeyInvalid(let key): message = "Event key (\(key)) is not in datafile."
105+
case .eventBuildFailure(let key): message = "Failed to create a dispatch event (\(key))"
106106
case .eventTagsFormatInvalid: message = "Provided event tags are in an invalid format."
107-
case .attributesKeyInvalid(let key): message = "Attribute key \(key) is not in datafile."
108-
case .attributeValueInvalid(let key): message = "Attribute value for \(key) is invalid."
107+
case .attributesKeyInvalid(let key): message = "Attribute key (\(key)) is not in datafile."
108+
case .attributeValueInvalid(let key): message = "Attribute value for (\(key)) is invalid."
109109
case .attributeFormatInvalid: message = "Provided attributes are in an invalid format."
110-
case .groupIdInvalid(let id): message = "Group ID \(id) is not in datafile."
110+
case .groupIdInvalid(let id): message = "Group ID (\(id)) is not in datafile."
111111
case .groupHasNoTrafficAllocation(let id): message = "No traffic allocation rules are defined for group (\(id))"
112-
case .rolloutIdInvalid(let id, let feature): message = "Invalid rollout ID \(id) attached to feature \(feature)"
112+
case .rolloutIdInvalid(let id, let feature): message = "Invalid rollout ID (\(id)) attached to feature (\(feature))"
113113

114-
case .conditionNoMatchingAudience(let id): message = "Audience \(id) is not in datafile."
114+
case .conditionNoMatchingAudience(let id): message = "Audience (\(id)) is not in datafile."
115115
case .conditionInvalidFormat(let hint): message = "Condition has an invalid format (\(hint))"
116116
case .conditionCannotBeEvaluated(let hint): message = "Condition cannot be evaluated (\(hint))"
117117
case .evaluateAttributeInvalidType(let hint): message = "Evaluation attribute has an invalid value (\(hint))"
@@ -122,12 +122,12 @@ extension OptimizelyError: CustomStringConvertible {
122122
case .userAttributeInvalidFormat(let hint): message = "UserAttribute has an invalid format (\(hint))"
123123

124124
case .userIdInvalid: message = "Provided user ID is in an invalid format."
125-
case .bucketingIdInvalid (let id): message = "Invalid bucketing ID: \(id)"
125+
case .bucketingIdInvalid (let id): message = "Invalid bucketing ID (\(id))"
126126
case .userProfileInvalid: message = "Provided user profile object is invalid."
127127

128128
case .datafileDownloadFailed(let hint): message = "Datafile download failed (\(hint))"
129129
case .dataFileInvalid: message = "Provided datafile is in an invalid format."
130-
case .dataFileVersionInvalid (let version): message = "Provided datafile version \(version) is not supported."
130+
case .dataFileVersionInvalid (let version): message = "Provided datafile version (\(version)) is not supported."
131131
case .datafileSavingFailed(let hint): message = "Datafile save failed (\(hint))"
132132
case .datafileLoadingFailed(let hint): message = "Datafile load failed (\(hint))"
133133

OptimizelySDK/Optimizely/OptimizelyLogLevel.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,9 @@ import Foundation
4343
}
4444
}
4545
}
46+
47+
extension OptimizelyLogLevel: Comparable {
48+
public static func < (lhs: OptimizelyLogLevel, rhs: OptimizelyLogLevel) -> Bool {
49+
return lhs.rawValue < rhs.rawValue
50+
}
51+
}

0 commit comments

Comments
 (0)