Skip to content

Commit d59dbd9

Browse files
authored
Merge pull request #183 from optimizely/loggerFactory
logger factory to use with anyone who wants access
2 parents b7a3eab + 79713a6 commit d59dbd9

File tree

8 files changed

+84
-73
lines changed

8 files changed

+84
-73
lines changed

OptimizelySDK/Customization/DefaultEventDispatcher.swift

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ open class DefaultEventDispatcher : BackgroundingCallbacks, OPTEventDispatcher {
3636
// TODO: implement
3737
var maxQueueSize:Int = 30000
3838

39-
lazy var logger = HandlerRegistryService.shared.injectLogger()
39+
lazy var logger = OPTLoggerFactory.getLogger()
4040
var backingStore:DataStoreType = .file
4141
var backingStoreName:String = "OPTEventQueue"
4242

@@ -130,15 +130,15 @@ open class DefaultEventDispatcher : BackgroundingCallbacks, OPTEventDispatcher {
130130
}
131131

132132
guard let event = eventToSend else {
133-
self.logger?.e(.eventBatchFailed)
133+
self.logger.e(.eventBatchFailed)
134134
resetBatch()
135135
break
136136
}
137137

138138
// we've exhuasted our failure count. Give up and try the next time a event
139139
// is queued or someone calls flush.
140140
if failureCount > DefaultEventDispatcher.MAX_FAILURE_COUNT {
141-
self.logger?.e(.eventSendRetyFailed(failureCount))
141+
self.logger.e(.eventSendRetyFailed(failureCount))
142142
failureCount = 0
143143
resetBatch()
144144
break;
@@ -149,21 +149,21 @@ open class DefaultEventDispatcher : BackgroundingCallbacks, OPTEventDispatcher {
149149
self.sendEvent(event: event) { (result) -> (Void) in
150150
switch result {
151151
case .failure(let error):
152-
self.logger?.e(error.reason)
152+
self.logger.e(error.reason)
153153
failureCount += 1
154154
case .success(_):
155155
// we succeeded. remove the batch size sent.
156156
if let removedItem:[EventForDispatch] = self.dataStore.removeFirstItems(count: self.batchSize) {
157157
if self.batchSize == 1 && removedItem.first != event {
158-
self.logger?.e("Removed event different from sent event")
158+
self.logger.e("Removed event different from sent event")
159159
}
160160
else {
161161
// avoid event-log-message preparation overheads with closure-logging
162-
self.logger?.d({ "Successfully sent event: \(event)" })
162+
self.logger.d({ "Successfully sent event: \(event)" })
163163
}
164164
}
165165
else {
166-
self.logger?.e("Removed event nil for sent item")
166+
self.logger.e("Removed event nil for sent item")
167167
}
168168
// reset failureCount
169169
failureCount = 0
@@ -199,13 +199,13 @@ open class DefaultEventDispatcher : BackgroundingCallbacks, OPTEventDispatcher {
199199
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
200200

201201
let task = session.uploadTask(with: request, from: event.body) { (data, response, error) in
202-
self.logger?.d(response.debugDescription)
202+
self.logger.d(response.debugDescription)
203203

204204
if let error = error {
205205
completionHandler(.failure(.eventDispatchFailed(error.localizedDescription)))
206206
}
207207
else {
208-
self.logger?.d("Event Sent")
208+
self.logger.d("Event Sent")
209209
completionHandler(.success(event.body))
210210
}
211211
}

OptimizelySDK/Customization/Protocols/OPTLogger.swift

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
import Foundation
1818

19-
2019
/**
2120
* Any logger must implement these following methods.
2221
*/
@@ -76,3 +75,15 @@ extension OPTLogger {
7675
return message
7776
}
7877
}
78+
79+
@objc public class OPTLoggerFactory:NSObject {
80+
class func getLogger() -> OPTLogger {
81+
if let logger = HandlerRegistryService.shared.injectLogger() {
82+
return logger
83+
}
84+
85+
return DefaultLogger()
86+
}
87+
}
88+
89+

OptimizelySDK/Data Model/ProjectConfig.swift

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class ProjectConfig {
2020

2121
var project: Project!
2222

23-
lazy var logger = HandlerRegistryService.shared.injectLogger()
23+
lazy var logger = OPTLoggerFactory.getLogger()
2424

2525
// local runtime forcedVariations [UserId: [ExperimentId: VariationId]]
2626
// NOTE: experiment.forcedVariations use [ExperimentKey: VariationKey] instead of ids
@@ -136,7 +136,7 @@ extension ProjectConfig {
136136
if var dic = whitelistUsers[userId] {
137137
return dic[experimentId]
138138
} else {
139-
logger?.d(.userHasNoForcedVariation(userId))
139+
logger.d(.userHasNoForcedVariation(userId))
140140
return nil
141141
}
142142
}
@@ -247,14 +247,14 @@ extension ProjectConfig {
247247

248248
if let id = getWhitelistedVariationId(userId: userId, experimentId: experiment.id) {
249249
if let variation = experiment.getVariation(id:id) {
250-
logger?.d(.userHasForcedVariation(userId, experiment.key, variation.key))
250+
logger.d(.userHasForcedVariation(userId, experiment.key, variation.key))
251251
return variation
252252
} else {
253-
logger?.d(.userHasForcedVariationButInvalid(userId, experiment.key))
253+
logger.d(.userHasForcedVariationButInvalid(userId, experiment.key))
254254
return nil
255255
}
256256
} else {
257-
logger?.d(.userHasNoForcedVariationForExperiment(userId, experiment.key))
257+
logger.d(.userHasNoForcedVariationForExperiment(userId, experiment.key))
258258
return nil
259259
}
260260
}
@@ -268,7 +268,7 @@ extension ProjectConfig {
268268
}
269269

270270
guard var variationKey = variationKey else {
271-
logger?.d(.variationRemovedForUser(userId, experimentKey))
271+
logger.d(.variationRemovedForUser(userId, experimentKey))
272272
self.removeFromWhitelist(userId: userId, experimentId: experiment.id)
273273
return true
274274
}
@@ -277,18 +277,18 @@ extension ProjectConfig {
277277
variationKey = variationKey.trimmingCharacters(in: NSCharacterSet.whitespaces)
278278

279279
guard !variationKey.isEmpty else {
280-
logger?.e(.variationKeyInvalid(experimentKey, variationKey))
280+
logger.e(.variationKeyInvalid(experimentKey, variationKey))
281281
return false
282282
}
283283

284284
guard let variation = experiment.variations.filter({$0.key == variationKey }).first else {
285-
logger?.e(.variationKeyInvalid(experimentKey, variationKey))
285+
logger.e(.variationKeyInvalid(experimentKey, variationKey))
286286
return false
287287
}
288288

289289
self.whitelistUser(userId: userId, experimentId: experiment.id, variationId: variation.id)
290290

291-
logger?.d(.userMappedToForcedVariation(userId, experiment.id, variation.id))
291+
logger.d(.userMappedToForcedVariation(userId, experiment.id, variation.id))
292292
return true
293293
}
294294

OptimizelySDK/Implementation/DefaultBucketer.swift

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class DefaultBucketer : OPTBucketer {
2222
let MAX_HASH_SEED:UInt64 = 1
2323
var MAX_HASH_VALUE:UInt64?
2424

25-
private lazy var logger = HandlerRegistryService.shared.injectLogger()
25+
private lazy var logger = OPTLoggerFactory.getLogger()
2626

2727
init() {
2828
MAX_HASH_VALUE = MAX_HASH_SEED << 32
@@ -44,14 +44,14 @@ class DefaultBucketer : OPTBucketer {
4444
if let mutexExperiment = mutexExperiment {
4545
if mutexExperiment.id == experiment.id {
4646
mutexAllowed = true
47-
logger?.i(.userBucketedIntoExperimentInGroup(bucketingId, experiment.key, group.id))
47+
logger.i(.userBucketedIntoExperimentInGroup(bucketingId, experiment.key, group.id))
4848
} else {
4949
mutexAllowed = false
50-
logger?.i(.userNotBucketedIntoExperimentInGroup(bucketingId, experiment.key, group.id))
50+
logger.i(.userNotBucketedIntoExperimentInGroup(bucketingId, experiment.key, group.id))
5151
}
5252
} else {
5353
mutexAllowed = false
54-
logger?.i(.userNotBucketedIntoAnyExperimentInGroup(bucketingId, group.id))
54+
logger.i(.userNotBucketedIntoAnyExperimentInGroup(bucketingId, group.id))
5555
}
5656
}
5757
}
@@ -61,21 +61,21 @@ class DefaultBucketer : OPTBucketer {
6161
// bucket to variation only if experiment passes Mutex check
6262

6363
if let variation = bucketToVariation(experiment:experiment, bucketingId:bucketingId) {
64-
logger?.i(.userBucketedIntoVariationInExperiment(bucketingId, experiment.key, variation.key))
64+
logger.i(.userBucketedIntoVariationInExperiment(bucketingId, experiment.key, variation.key))
6565
return variation
6666
} else {
67-
logger?.i(.userNotBucketedIntoVariationInExperiment(bucketingId, experiment.key))
67+
logger.i(.userNotBucketedIntoVariationInExperiment(bucketingId, experiment.key))
6868
return nil
6969
}
7070
}
7171

7272
func bucketToExperiment(config:ProjectConfig, group: Group, bucketingId: String) -> Experiment? {
7373
let hashId = makeHashIdFromBucketingId(bucketingId: bucketingId, entityId: group.id)
7474
let bucketValue = self.generateBucketValue(bucketingId: hashId)
75-
logger?.d(.userAssignedToExperimentBucketValue(bucketValue, bucketingId))
75+
logger.d(.userAssignedToExperimentBucketValue(bucketValue, bucketingId))
7676

7777
if group.trafficAllocation.count == 0 {
78-
logger?.e(.groupHasNoTrafficAllocation(group.id))
78+
logger.e(.groupHasNoTrafficAllocation(group.id))
7979
return nil;
8080
}
8181

@@ -87,7 +87,7 @@ class DefaultBucketer : OPTBucketer {
8787
if let experiment = config.getExperiment(id: experimentId) {
8888
return experiment
8989
} else {
90-
logger?.e(.userBucketedIntoInvalidExperiment(experimentId))
90+
logger.e(.userBucketedIntoInvalidExperiment(experimentId))
9191
return nil
9292
}
9393
}
@@ -99,10 +99,10 @@ class DefaultBucketer : OPTBucketer {
9999
func bucketToVariation(experiment:Experiment, bucketingId:String) -> Variation? {
100100
let hashId = makeHashIdFromBucketingId(bucketingId: bucketingId, entityId: experiment.id)
101101
let bucketValue = generateBucketValue(bucketingId: hashId)
102-
logger?.d(.userAssignedToVariationBucketValue(bucketValue, bucketingId))
102+
logger.d(.userAssignedToVariationBucketValue(bucketValue, bucketingId))
103103

104104
if experiment.trafficAllocation.count == 0 {
105-
logger?.e(.experimentHasNoTrafficAllocation(experiment.key))
105+
logger.e(.experimentHasNoTrafficAllocation(experiment.key))
106106
return nil
107107
}
108108

@@ -114,7 +114,7 @@ class DefaultBucketer : OPTBucketer {
114114
if let variation = experiment.getVariation(id: variationId) {
115115
return variation
116116
} else {
117-
logger?.e(.userBucketedIntoInvalidVariation(variationId))
117+
logger.e(.userBucketedIntoInvalidVariation(variationId))
118118
return nil
119119
}
120120
}

OptimizelySDK/Implementation/DefaultDatafileHandler.swift

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import Foundation
1818

1919
class DefaultDatafileHandler : OPTDatafileHandler {
2020
public var endPointStringFormat = "https://cdn.optimizely.com/datafiles/%@.json"
21-
lazy var logger = HandlerRegistryService.shared.injectLogger()
21+
lazy var logger = OPTLoggerFactory.getLogger()
2222
var timers:AtomicProperty<[String:(timer:Timer?, interval:Int)]> = AtomicProperty(property: [String:(Timer?,Int)]())
2323
let dataStore = DataStoreUserDefaults()
2424

@@ -49,7 +49,7 @@ class DefaultDatafileHandler : OPTDatafileHandler {
4949
case .success(let data):
5050
datafile = data
5151
case .failure(let error):
52-
self.logger?.e(error.reason)
52+
self.logger.e(error.reason)
5353
}
5454
group.leave()
5555
}
@@ -85,7 +85,7 @@ class DefaultDatafileHandler : OPTDatafileHandler {
8585
open func getResponseData(sdkKey:String, response:HTTPURLResponse, url:URL?) -> Data? {
8686
if let url = url, let data = try? Data(contentsOf: url) {
8787
if let str = String(data: data, encoding: .utf8) {
88-
self.logger?.d(str)
88+
self.logger.d(str)
8989
}
9090
self.saveDatafile(sdkKey: sdkKey, dataFile: data)
9191
if let lastModified = response.allHeaderFields["Last-Modified"] {
@@ -111,23 +111,23 @@ class DefaultDatafileHandler : OPTDatafileHandler {
111111
var result = OptimizelyResult<Data?>.failure(.datafileDownloadFailed("Failed to parse"))
112112

113113
if let _ = error {
114-
self.logger?.e(error.debugDescription)
114+
self.logger.e(error.debugDescription)
115115
result = .failure(.datafileDownloadFailed(error.debugDescription))
116116
} else if let response = response as? HTTPURLResponse {
117117
if response.statusCode == 200 {
118118
let data = self.getResponseData(sdkKey: sdkKey, response: response, url: url)
119119
result = .success(data)
120120
}
121121
else if response.statusCode == 304 {
122-
self.logger?.d("The datafile was not modified and won't be downloaded again")
122+
self.logger.d("The datafile was not modified and won't be downloaded again")
123123
result = .success(nil)
124124
}
125125
}
126126

127127
completionHandler(result)
128128

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

133133
task.resume()
@@ -219,7 +219,7 @@ class DefaultDatafileHandler : OPTDatafileHandler {
219219
datafileChangeNotification(data)
220220
}
221221
case .failure(let error):
222-
self.logger?.e(error.reason)
222+
self.logger.e(error.reason)
223223
}
224224

225225
if self.hasPeriodUpdates(sdkKey: sdkKey) {
@@ -230,7 +230,7 @@ class DefaultDatafileHandler : OPTDatafileHandler {
230230
nextInterval -= actualDiff
231231
}
232232

233-
self.logger?.d("next datafile download is \(nextInterval) seconds \(Date())")
233+
self.logger.d("next datafile download is \(nextInterval) seconds \(Date())")
234234
self.startPeriodicUpdates(sdkKey: sdkKey, updateInterval: nextInterval, datafileChangeNotification: datafileChangeNotification)
235235
}
236236
}
@@ -239,7 +239,7 @@ class DefaultDatafileHandler : OPTDatafileHandler {
239239
func stopPeriodicUpdates(sdkKey: String) {
240240
timers.performAtomic { (timers) in
241241
if let timer = timers[sdkKey] {
242-
logger?.i("Stopping timer for datafile updates sdkKey: \(sdkKey)")
242+
logger.i("Stopping timer for datafile updates sdkKey: \(sdkKey)")
243243

244244
timer.timer?.invalidate()
245245
timers.removeValue(forKey: sdkKey)
@@ -250,7 +250,7 @@ class DefaultDatafileHandler : OPTDatafileHandler {
250250

251251
func stopPeriodicUpdates() {
252252
for key in timers.property?.keys ?? Dictionary<String, (timer: Timer?, interval: Int)>().keys {
253-
logger?.i("Stopping timer for all datafile updates")
253+
logger.i("Stopping timer for all datafile updates")
254254
stopPeriodicUpdates(sdkKey: key)
255255
}
256256

@@ -283,7 +283,7 @@ class DefaultDatafileHandler : OPTDatafileHandler {
283283
try dataFile.write(to: fileURL, options: .atomic)
284284
}
285285
catch {/* error handling here */
286-
logger?.e("Problem saving datafile for key " + sdkKey)
286+
logger.e("Problem saving datafile for key " + sdkKey)
287287
}
288288
}
289289
}
@@ -299,7 +299,7 @@ class DefaultDatafileHandler : OPTDatafileHandler {
299299
return data
300300
}
301301
catch {/* error handling here */
302-
logger?.e("Problem loading datafile for key " + sdkKey)
302+
logger.e("Problem loading datafile for key " + sdkKey)
303303
}
304304
}
305305

0 commit comments

Comments
 (0)