diff --git a/Sources/XXMessengerClient/Utils/LogMessage.swift b/Sources/XXMessengerClient/Utils/LogMessage.swift
new file mode 100644
index 0000000000000000000000000000000000000000..5a2133594f33a29394f17caf736a831499bb1b8b
--- /dev/null
+++ b/Sources/XXMessengerClient/Utils/LogMessage.swift
@@ -0,0 +1,48 @@
+import Foundation
+import Logging
+
+struct LogMessage: Equatable {
+  var level: Logger.Level
+  var text: String
+}
+
+extension LogMessage {
+  static func parse(_ string: String) -> LogMessage? {
+    let level: Logger.Level
+    let text: String
+    let pattern = #"([A-Z]+) (.*)"#
+    let regex = try! NSRegularExpression(pattern: pattern)
+    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 = .fromString(groups[1])
+      text = groups[2] ?? string
+    } else {
+      level = .notice
+      text = string
+    }
+    return LogMessage(level: level, text: text)
+  }
+}
+
+private extension Logger.Level {
+  static func fromString(_ 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
+    }
+  }
+}
diff --git a/Tests/XXMessengerClientTests/Utils/LogMessageTests.swift b/Tests/XXMessengerClientTests/Utils/LogMessageTests.swift
new file mode 100644
index 0000000000000000000000000000000000000000..c955e3039a12188a963e32bcfbcf3163982ea6c0
--- /dev/null
+++ b/Tests/XXMessengerClientTests/Utils/LogMessageTests.swift
@@ -0,0 +1,43 @@
+import CustomDump
+import XCTest
+@testable import XXMessengerClient
+
+final class LogMessageTests: XCTestCase {
+  func testParsing() {
+    XCTAssertNoDifference(
+      LogMessage.parse("TRACE Tracing..."),
+      LogMessage(level: .trace, text: "Tracing...")
+    )
+    XCTAssertNoDifference(
+      LogMessage.parse("DEBUG Debugging..."),
+      LogMessage(level: .debug, text: "Debugging...")
+    )
+    XCTAssertNoDifference(
+      LogMessage.parse("INFO Informing..."),
+      LogMessage(level: .info, text: "Informing...")
+    )
+    XCTAssertNoDifference(
+      LogMessage.parse("WARN Warning!"),
+      LogMessage(level: .warning, text: "Warning!")
+    )
+    XCTAssertNoDifference(
+      LogMessage.parse("ERROR Failure!"),
+      LogMessage(level: .error, text: "Failure!")
+    )
+    XCTAssertNoDifference(
+      LogMessage.parse("CRITICAL Critical failure!"),
+      LogMessage(level: .critical, text: "Critical failure!")
+    )
+    XCTAssertNoDifference(
+      LogMessage.parse("FATAL Fatal failure!"),
+      LogMessage(level: .critical, text: "Fatal failure!")
+    )
+  }
+
+  func testParsingFallbacks() {
+    XCTAssertNoDifference(
+      LogMessage.parse("1234 Wrongly formatted"),
+      LogMessage(level: .notice, text: "1234 Wrongly formatted")
+    )
+  }
+}