Skip to content
Snippets Groups Projects
Commit 7b37618b authored by Dariusz Rybicki's avatar Dariusz Rybicki
Browse files

Merge branch 'feature/logging-improvements' into 'development'

Logging improvements

See merge request elixxir/elixxir-dapps-sdk-swift!117
parents 6bb4946a d7d7369d
No related branches found
No related tags found
2 merge requests!117Logging improvements,!102Release 1.0.0
...@@ -15,8 +15,7 @@ extension MessengerStartLogging { ...@@ -15,8 +15,7 @@ extension MessengerStartLogging {
public static func live(_ env: MessengerEnvironment) -> MessengerStartLogging { public static func live(_ env: MessengerEnvironment) -> MessengerStartLogging {
return MessengerStartLogging { return MessengerStartLogging {
env.registerLogWriter(.init { messageString in env.registerLogWriter(.init { messageString in
let message = LogMessage.parse(messageString) env.logger(.parse(messageString))
env.log(message)
}) })
} }
} }
......
import Foundation import Foundation
import Logging
import XXClient import XXClient
import XCTestDynamicOverlay import XCTestDynamicOverlay
...@@ -19,7 +18,7 @@ public struct MessengerEnvironment { ...@@ -19,7 +18,7 @@ public struct MessengerEnvironment {
public var isListeningForMessages: Stored<Bool> public var isListeningForMessages: Stored<Bool>
public var isRegisteredWithUD: IsRegisteredWithUD public var isRegisteredWithUD: IsRegisteredWithUD
public var loadCMix: LoadCMix public var loadCMix: LoadCMix
public var log: (LogMessage) -> Void public var logger: MessengerLogger
public var login: Login public var login: Login
public var lookupUD: LookupUD public var lookupUD: LookupUD
public var messageListeners: ListenersRegistry public var messageListeners: ListenersRegistry
...@@ -51,9 +50,7 @@ extension MessengerEnvironment { ...@@ -51,9 +50,7 @@ extension MessengerEnvironment {
.path .path
public static func live() -> MessengerEnvironment { public static func live() -> MessengerEnvironment {
let logger = Logger(label: "xx.network.client") MessengerEnvironment(
return MessengerEnvironment(
authCallbacks: .live(), authCallbacks: .live(),
backup: .inMemory(), backup: .inMemory(),
backupCallbacks: .live(), backupCallbacks: .live(),
...@@ -69,7 +66,7 @@ extension MessengerEnvironment { ...@@ -69,7 +66,7 @@ extension MessengerEnvironment {
isListeningForMessages: .inMemory(false), isListeningForMessages: .inMemory(false),
isRegisteredWithUD: .live, isRegisteredWithUD: .live,
loadCMix: .live, loadCMix: .live,
log: { logger.log(level: $0.level, .init(stringLiteral: $0.text)) }, logger: .live(),
login: .live, login: .live,
lookupUD: .live, lookupUD: .live,
messageListeners: .live(), messageListeners: .live(),
...@@ -112,7 +109,7 @@ extension MessengerEnvironment { ...@@ -112,7 +109,7 @@ extension MessengerEnvironment {
isListeningForMessages: .unimplemented(placeholder: false), isListeningForMessages: .unimplemented(placeholder: false),
isRegisteredWithUD: .unimplemented, isRegisteredWithUD: .unimplemented,
loadCMix: .unimplemented, loadCMix: .unimplemented,
log: XCTUnimplemented("\(Self.self).log"), logger: .unimplemented,
login: .unimplemented, login: .unimplemented,
lookupUD: .unimplemented, lookupUD: .unimplemented,
messageListeners: .unimplemented, messageListeners: .unimplemented,
......
import Foundation
import Logging
import XCTestDynamicOverlay
public struct MessengerLogger {
public struct Log: Equatable {
public init(level: Logger.Level, message: String) {
self.level = level
self.message = message
}
public var level: Logger.Level
public var message: String
}
public var run: (Log, String, String, UInt) -> Void
public func callAsFunction(
_ item: Log,
file: String = #fileID,
function: String = #function,
line: UInt = #line
) {
run(item, file, function, line)
}
}
extension MessengerLogger {
public static func live(
logger: Logger = Logger(label: "xx.network.MessengerClient")
) -> MessengerLogger {
MessengerLogger { item, file, function, line in
logger.log(
level: item.level,
.init(stringLiteral: item.message),
file: file,
function: function,
line: line
)
}
}
}
extension MessengerLogger {
public static let unimplemented = MessengerLogger(
run: XCTUnimplemented("\(Self.self)")
)
}
extension MessengerLogger.Log {
static func parse(_ string: String) -> MessengerLogger.Log {
let level: Logger.Level
let message: String
let pattern = #"^([A-Z]+)( \d{4}/\d{2}/\d{2})?( \d{1,2}:\d{2}:\d{2}\.\d+)? (.*)"#
let regex = try! NSRegularExpression(
pattern: pattern,
options: .dotMatchesLineSeparators
)
let stringRange = NSRange(location: 0, length: string.utf16.count)
if let match = regex.firstMatch(in: string, range: stringRange) {
var groups: [Int: String] = [:]
for rangeIndex in 1..<match.numberOfRanges {
let nsRange = match.range(at: rangeIndex)
if !NSEqualRanges(nsRange, NSMakeRange(NSNotFound, 0)) {
let group = (string as NSString).substring(with: nsRange)
groups[rangeIndex] = group
}
}
level = MessengerLogger.Log.level(form: groups[1])
message = groups[4] ?? string
} else {
level = .notice
message = string
}
return MessengerLogger.Log(level: level, message: message)
}
static func level(form string: String?) -> Logger.Level {
switch string {
case "TRACE": return .trace
case "DEBUG": return .debug
case "INFO": return .info
case "WARN": return .warning
case "ERROR": return .error
case "CRITICAL": return .critical
case "FATAL": return .critical
default: return .notice
}
}
}
...@@ -6,14 +6,14 @@ import XXClient ...@@ -6,14 +6,14 @@ import XXClient
final class MessengerStartLoggingTests: XCTestCase { final class MessengerStartLoggingTests: XCTestCase {
func testStartLogging() { func testStartLogging() {
var registeredLogWriters: [LogWriter] = [] var registeredLogWriters: [LogWriter] = []
var logMessages: [LogMessage] = [] var logs: [MessengerLogger.Log] = []
var env: MessengerEnvironment = .unimplemented var env: MessengerEnvironment = .unimplemented
env.registerLogWriter.run = { writer in env.registerLogWriter.run = { writer in
registeredLogWriters.append(writer) registeredLogWriters.append(writer)
} }
env.log = { message in env.logger.run = { log, _, _, _ in
logMessages.append(message) logs.append(log)
} }
let start: MessengerStartLogging = .live(env) let start: MessengerStartLogging = .live(env)
...@@ -23,8 +23,8 @@ final class MessengerStartLoggingTests: XCTestCase { ...@@ -23,8 +23,8 @@ final class MessengerStartLoggingTests: XCTestCase {
registeredLogWriters.first?.handle("DEBUG Hello, World!") registeredLogWriters.first?.handle("DEBUG Hello, World!")
XCTAssertNoDifference(logMessages, [ XCTAssertNoDifference(logs, [
.init(level: .debug, text: "Hello, World!"), .init(level: .debug, message: "Hello, World!"),
]) ])
} }
} }
import CustomDump
import XCTest
@testable import XXMessengerClient
final class MessengerLoggerTests: XCTestCase {
func testParsingLog() {
XCTAssertNoDifference(
MessengerLogger.Log.parse("TRACE Tracing..."),
MessengerLogger.Log(level: .trace, message: "Tracing...")
)
XCTAssertNoDifference(
MessengerLogger.Log.parse("DEBUG Debugging..."),
MessengerLogger.Log(level: .debug, message: "Debugging...")
)
XCTAssertNoDifference(
MessengerLogger.Log.parse("INFO Informing..."),
MessengerLogger.Log(level: .info, message: "Informing...")
)
XCTAssertNoDifference(
MessengerLogger.Log.parse("WARN Warning!"),
MessengerLogger.Log(level: .warning, message: "Warning!")
)
XCTAssertNoDifference(
MessengerLogger.Log.parse("ERROR Failure!"),
MessengerLogger.Log(level: .error, message: "Failure!")
)
XCTAssertNoDifference(
MessengerLogger.Log.parse("CRITICAL Critical failure!"),
MessengerLogger.Log(level: .critical, message: "Critical failure!")
)
XCTAssertNoDifference(
MessengerLogger.Log.parse("FATAL Fatal failure!"),
MessengerLogger.Log(level: .critical, message: "Fatal failure!")
)
}
func testParsingFallbacks() {
XCTAssertNoDifference(
MessengerLogger.Log.parse("1234 Wrongly formatted"),
MessengerLogger.Log(level: .notice, message: "1234 Wrongly formatted")
)
}
func testParsingStripsDateTime() {
XCTAssertNoDifference(
MessengerLogger.Log.parse("INFO 2022/10/04 Informing..."),
MessengerLogger.Log(level: .info, message: "Informing...")
)
XCTAssertNoDifference(
MessengerLogger.Log.parse("INFO 23:36:55.755390 Informing..."),
MessengerLogger.Log(level: .info, message: "Informing...")
)
XCTAssertNoDifference(
MessengerLogger.Log.parse("INFO 2022/10/04 23:36:55.755390 Informing..."),
MessengerLogger.Log(level: .info, message: "Informing...")
)
}
func testParsingMultilineMessage() {
XCTAssertNoDifference(
MessengerLogger.Log.parse("""
ERROR 2022/10/04 23:51:15.021658 First line
Second line
"""),
MessengerLogger.Log(level: .error, message: """
First line
Second line
""")
)
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment