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

Add MessengerLogger

parent 6bb4946a
No related branches found
No related tags found
2 merge requests!117Logging improvements,!102Release 1.0.0
This commit is part of merge request !102. Comments created here will be created in the context of that merge request.
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
}
}
}
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