3 @objc public enum LogLevel: Int {
10 var shortcut: String {
12 case .error: return "E"
13 case .warning: return "W"
14 case .info: return "I"
15 case .debug: return "D"
16 case .verbose: return "V"
21 /// The Logger protocol defines a common interface that is used to log every message from the sdk.
22 /// You can easily writer your own to perform custom logging.
23 @objc public protocol Logger {
24 /// This method should perform the logging. It can be called from every thread. The implementation has
25 /// to handle synchronizing different threads.
28 /// - message: A closure that produces the message itself.
29 /// - level: The loglevel of the message.
30 /// - file: The filename where the log was created.
31 /// - function: The funciton where the log was created.
32 /// - line: Then line where the log was created.
33 func log(_ message: @autoclosure () -> String, with level: LogLevel, file: String, function: String, line: Int)
37 func verbose(_ message: @autoclosure () -> String, file: String = #file, function: String = #function, line: Int = #line) {
38 log(message, with: .verbose, file: file, function: function, line: line)
40 func debug(_ message: @autoclosure () -> String, file: String = #file, function: String = #function, line: Int = #line) {
41 log(message, with: .debug, file: file, function: function, line: line)
43 func info(_ message: @autoclosure () -> String, file: String = #file, function: String = #function, line: Int = #line) {
44 log(message, with: .info, file: file, function: function, line: line)
46 func warning(_ message: @autoclosure () -> String, file: String = #file, function: String = #function, line: Int = #line) {
47 log(message, with: .warning, file: file, function: function, line: line)
49 func error(_ message: @autoclosure () -> String, file: String = #file, function: String = #function, line: Int = #line) {
50 log(message, with: .error, file: file, function: function, line: line)
54 /// This Logger does nothing and skips every logging.
55 public final class DisabledLogger: Logger {
56 public func log(_ message: @autoclosure () -> String, with level: LogLevel, file: String = #file, function: String = #function, line: Int = #line) { }
59 /// This Logger loggs every message to the console with a `print` statement.
60 @objc public final class DefaultLogger: NSObject, Logger {
61 private let dispatchQueue = DispatchQueue(label: "DefaultLogger", qos: .background)
62 private let minLevel: LogLevel
64 @objc public init(minLevel: LogLevel) {
65 self.minLevel = minLevel
69 public func log(_ message: @autoclosure () -> String, with level: LogLevel, file: String = #file, function: String = #function, line: Int = #line) {
70 guard level.rawValue >= minLevel.rawValue else { return }
71 let messageToPrint = message()
73 print("MatomoTracker [\(level.shortcut)] \(messageToPrint)")