diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerStartLogging.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerStartLogging.swift
new file mode 100644
index 0000000000000000000000000000000000000000..d073ee41cd1c954b41395d2c0de4760d94ed4b5a
--- /dev/null
+++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerStartLogging.swift
@@ -0,0 +1,29 @@
+import Foundation
+import Logging
+import XCTestDynamicOverlay
+import XXClient
+
+public struct MessengerStartLogging {
+  public var run: () -> Void
+
+  public func callAsFunction() -> Void {
+    run()
+  }
+}
+
+extension MessengerStartLogging {
+  public static func live(_ env: MessengerEnvironment) -> MessengerStartLogging {
+    return MessengerStartLogging {
+      env.registerLogWriter(.init { messageString in
+        let message = LogMessage.parse(messageString)
+        env.log(message)
+      })
+    }
+  }
+}
+
+extension MessengerStartLogging {
+  public static let unimplemented = MessengerStartLogging(
+    run: XCTUnimplemented("\(Self.self)")
+  )
+}
diff --git a/Sources/XXMessengerClient/Messenger/Messenger.swift b/Sources/XXMessengerClient/Messenger/Messenger.swift
index 168cd84af606b70c37549b8a524e26f306dca8ec..22f110303674337006b77b2f1de436a09d0392b1 100644
--- a/Sources/XXMessengerClient/Messenger/Messenger.swift
+++ b/Sources/XXMessengerClient/Messenger/Messenger.swift
@@ -39,6 +39,7 @@ public struct Messenger {
   public var backupParams: MessengerBackupParams
   public var stopBackup: MessengerStopBackup
   public var setLogLevel: MessengerSetLogLevel
+  public var startLogging: MessengerStartLogging
 }
 
 extension Messenger {
@@ -81,7 +82,8 @@ extension Messenger {
       resumeBackup: .live(env),
       backupParams: .live(env),
       stopBackup: .live(env),
-      setLogLevel: .live(env)
+      setLogLevel: .live(env),
+      startLogging: .live(env)
     )
   }
 }
@@ -125,6 +127,7 @@ extension Messenger {
     resumeBackup: .unimplemented,
     backupParams: .unimplemented,
     stopBackup: .unimplemented,
-    setLogLevel: .unimplemented
+    setLogLevel: .unimplemented,
+    startLogging: .unimplemented
   )
 }
diff --git a/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift b/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
index bb26093a24d97792904b9a8f5ca974d0c9853d66..a98e76f042b5e53a6e8556d3bee32d7ebb946162 100644
--- a/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
+++ b/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
@@ -1,4 +1,5 @@
 import Foundation
+import Logging
 import XXClient
 import XCTestDynamicOverlay
 
@@ -18,6 +19,7 @@ public struct MessengerEnvironment {
   public var isListeningForMessages: Stored<Bool>
   public var isRegisteredWithUD: IsRegisteredWithUD
   public var loadCMix: LoadCMix
+  public var log: (LogMessage) -> Void
   public var login: Login
   public var lookupUD: LookupUD
   public var messageListeners: ListenersRegistry
@@ -29,6 +31,7 @@ public struct MessengerEnvironment {
   public var newUdManagerFromBackup: NewUdManagerFromBackup
   public var passwordStorage: PasswordStorage
   public var registerForNotifications: RegisterForNotifications
+  public var registerLogWriter: RegisterLogWriter
   public var resumeBackup: ResumeBackup
   public var searchUD: SearchUD
   public var setLogLevel: SetLogLevel
@@ -48,7 +51,9 @@ extension MessengerEnvironment {
     .path
 
   public static func live() -> MessengerEnvironment {
-    MessengerEnvironment(
+    let logger = Logger(label: "xx.network.client")
+
+    return MessengerEnvironment(
       authCallbacks: .live(),
       backup: .inMemory(),
       backupCallbacks: .live(),
@@ -64,6 +69,7 @@ extension MessengerEnvironment {
       isListeningForMessages: .inMemory(false),
       isRegisteredWithUD: .live,
       loadCMix: .live,
+      log: { logger.log(level: $0.level, .init(stringLiteral: $0.text)) },
       login: .live,
       lookupUD: .live,
       messageListeners: .live(),
@@ -75,6 +81,7 @@ extension MessengerEnvironment {
       newUdManagerFromBackup: .live,
       passwordStorage: .keychain,
       registerForNotifications: .live,
+      registerLogWriter: .live,
       resumeBackup: .live,
       searchUD: .live,
       setLogLevel: .live,
@@ -105,6 +112,7 @@ extension MessengerEnvironment {
     isListeningForMessages: .unimplemented(placeholder: false),
     isRegisteredWithUD: .unimplemented,
     loadCMix: .unimplemented,
+    log: XCTUnimplemented("\(Self.self).log"),
     login: .unimplemented,
     lookupUD: .unimplemented,
     messageListeners: .unimplemented,
@@ -116,6 +124,7 @@ extension MessengerEnvironment {
     newUdManagerFromBackup: .unimplemented,
     passwordStorage: .unimplemented,
     registerForNotifications: .unimplemented,
+    registerLogWriter: .unimplemented,
     resumeBackup: .unimplemented,
     searchUD: .unimplemented,
     setLogLevel: .unimplemented,
diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartLoggingTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartLoggingTests.swift
new file mode 100644
index 0000000000000000000000000000000000000000..b0d0a7c35453348c2f56b4e5e13c973c6fbc639a
--- /dev/null
+++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerStartLoggingTests.swift
@@ -0,0 +1,30 @@
+import CustomDump
+import XCTest
+import XXClient
+@testable import XXMessengerClient
+
+final class MessengerStartLoggingTests: XCTestCase {
+  func testStartLogging() {
+    var registeredLogWriters: [LogWriter] = []
+    var logMessages: [LogMessage] = []
+
+    var env: MessengerEnvironment = .unimplemented
+    env.registerLogWriter.run = { writer in
+      registeredLogWriters.append(writer)
+    }
+    env.log = { message in
+      logMessages.append(message)
+    }
+    let start: MessengerStartLogging = .live(env)
+
+    start()
+
+    XCTAssertNoDifference(registeredLogWriters.count, 1)
+
+    registeredLogWriters.first?.handle("DEBUG Hello, World!")
+
+    XCTAssertNoDifference(logMessages, [
+      .init(level: .debug, text: "Hello, World!"),
+    ])
+  }
+}