Skip to content

Commit 643defc

Browse files
add loglevel and logDelegate to IterableConfig.
1 parent 2d7070b commit 643defc

File tree

3 files changed

+74
-24
lines changed

3 files changed

+74
-24
lines changed

swift-sdk.xcodeproj/project.pbxproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1088,7 +1088,6 @@
10881088
);
10891089
MACH_O_TYPE = mh_dylib;
10901090
OTHER_SWIFT_FLAGS = "";
1091-
"OTHER_SWIFT_FLAGS[arch=*]" = "-D LOG";
10921091
PRODUCT_BUNDLE_IDENTIFIER = "iterable.swift-sdk";
10931092
PRODUCT_NAME = IterableSDK;
10941093
PROVISIONING_PROFILE_SPECIFIER = "";

swift-sdk/IterableConfig.swift

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,26 @@ import Foundation
3434
@objc(handleIterableCustomAction:context:) func handle(iterableCustomAction action:IterableAction, inContext context: IterableActionContext) -> Bool
3535
}
3636

37+
/**
38+
* Lowest level that will be logged. By default the LogLevel is set to LogLevel.info.
39+
*/
40+
@objc public enum LogLevel : Int {
41+
case debug = 1
42+
case info
43+
case error
44+
}
45+
46+
/**
47+
* Logging Delegate.
48+
*/
49+
@objc public protocol IterableLogDelegate: class {
50+
/**
51+
* Log a message.
52+
* - parameter level: The log level.
53+
* - parameter message: The message to log. The message will include file, method and line of the call.
54+
*/
55+
@objc(log:Message:) func log(level: LogLevel, message: String)
56+
}
3757

3858
/**
3959
Iterable Configuration Object. Use this when initializing the API.
@@ -72,4 +92,17 @@ public class IterableConfig : NSObject {
7292
/// When set to true, it will check for deferred deeplinks on first time app launch
7393
/// after installation from the App Store.
7494
public var checkForDeferredDeeplink = false
95+
96+
/// The lowest level that will be logged. The levels go from
97+
/// debug < (less than) info < (less than) error.
98+
/// The default level is `.info`.
99+
public var logLevel = LogLevel.info
100+
101+
/// Implement the protocol IterableLogDelegate and set it here to change logging.
102+
/// Out of the box you have the following
103+
/// 1. DefaultLogDelegate. It will use OsLog for .error, cosole for .info and no logging for debug.
104+
/// 2. NoneLogDelegate. No logging messages will be output.
105+
/// 3. AllLogDelegate. It will log everything to console.
106+
/// The default value is `DefaultLogDelegate`.
107+
public var logDelegate: IterableLogDelegate = DefaultLogDelegate()
75108
}

swift-sdk/IterableUtil.swift

Lines changed: 41 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -51,40 +51,58 @@ import os
5151
}
5252
}
5353

54-
public func ITBError(_ message: String? = nil, file: String = #file, method: String = #function, line: Int = #line) {
55-
let logMessage = formatLogMessage(message: message, file: file, method: method, line: line)
56-
if #available(iOS 10.0, *) {
57-
os_log("%@", log: OSLog.default, type: .error, logMessage)
58-
} else {
59-
print(logMessage)
54+
public class DefaultLogDelegate: IterableLogDelegate {
55+
public func log(level: LogLevel = .info, message: String) {
56+
guard let configLogLevel = IterableAPIInternal.sharedInstance?.config.logLevel, level.rawValue >= configLogLevel.rawValue else {
57+
return
58+
}
59+
60+
switch level {
61+
case .error:
62+
// Error goes to os_log, if available
63+
if #available(iOS 10.0, *) {
64+
os_log("%@", log: OSLog.default, type: .error, message)
65+
} else {
66+
print(message)
67+
}
68+
case .info:
69+
let markerStr = "💛"
70+
print("\(markerStr) \(message)")
71+
case .debug:
72+
// no logging
73+
break
74+
}
6075
}
6176
}
6277

63-
private func formatLogMessage(message: String?, file: String, method: String, line: Int) -> String {
78+
public func ITBError(_ message: String? = nil, file: String = #file, method: String = #function, line: Int = #line) {
79+
let date = IterableAPIInternal.sharedInstance?.dateProvider.currentDate ?? Date()
80+
let logMessage = formatLogMessage(message: message, file: file, method: method, line: line, date: date)
81+
IterableAPIInternal.sharedInstance?.config.logDelegate.log(level: .error, message: logMessage)
82+
}
83+
84+
private func formatLogMessage(message: String?, file: String, method: String, line: Int, date: Date) -> String {
6485
let fileUrl = NSURL(fileURLWithPath: file)
6586
let fileToDisplay = fileUrl.deletingPathExtension!.lastPathComponent
87+
88+
let formattedDate = formatDate(date: date)
6689

6790
if let zeeMessage = message {
68-
return "\(fileToDisplay):\(method):\(line): \(zeeMessage)"
91+
return "\(formattedDate):\(fileToDisplay):\(method):\(line): \(zeeMessage)"
6992
} else {
70-
return "\(fileToDisplay):\(method):\(line)"
93+
return "\(formattedDate):\(fileToDisplay):\(method):\(line)"
7194
}
7295
}
7396

74-
/// It will print the output only if 'LOG' is defined in the project via -D LOG as 'Other Swift Flags'
75-
public func ITBInfo(_ message: String? = nil, file: String = #file, method: String = #function, line: Int = #line) {
76-
#if LOG
77-
let fileUrl = NSURL(fileURLWithPath: file)
78-
let fileToDisplay = fileUrl.deletingPathExtension!.lastPathComponent
79-
97+
private func formatDate(date: Date) -> String {
8098
let formatter = DateFormatter()
8199
formatter.dateFormat = "HH:mm:ss.SSSS"
82-
let time = formatter.string(from: Date())
83-
84-
if let zeeMessage = message {
85-
print("===> \(time):\(fileToDisplay):\(method):\(line): \(zeeMessage)")
86-
} else {
87-
print("===> \(time):\(fileToDisplay):\(method):\(line)")
88-
}
89-
#endif
100+
return formatter.string(from: date)
101+
}
102+
103+
/// It will print the output only if 'LOG' is defined in the project via -D LOG as 'Other Swift Flags'
104+
public func ITBInfo(_ message: String? = nil, file: String = #file, method: String = #function, line: Int = #line) {
105+
let date = IterableAPIInternal.sharedInstance?.dateProvider.currentDate ?? Date()
106+
let logMessage = formatLogMessage(message: message, file: file, method: method, line: line, date: date)
107+
IterableAPIInternal.sharedInstance?.config.logDelegate.log(level: .info, message: logMessage)
90108
}

0 commit comments

Comments
 (0)