diff --git a/mailbox-android/src/debug/assets/logback.xml b/mailbox-android/src/debug/assets/logback.xml
index 58a3a18c919a95f1a72e1a9c9d8f6052832d74a1..5718450855c50eeef26a28ae52a668d1c1ffcf5d 100644
--- a/mailbox-android/src/debug/assets/logback.xml
+++ b/mailbox-android/src/debug/assets/logback.xml
@@ -4,7 +4,7 @@
             <pattern>%logger{12}</pattern>
         </tagEncoder>
         <encoder>
-            <pattern>%msg</pattern>
+            <pattern>[%thread] %msg%n</pattern>
         </encoder>
     </appender>
     <root level="ALL">
diff --git a/mailbox-android/src/main/java/org/briarproject/mailbox/core/tor/AndroidNetworkManager.java b/mailbox-android/src/main/java/org/briarproject/mailbox/core/tor/AndroidNetworkManager.java
index 290a62ab63983177a38e2c02cde8e047874df88f..e457fc9e2b75277fa3c107793145b0e8a749b16b 100644
--- a/mailbox-android/src/main/java/org/briarproject/mailbox/core/tor/AndroidNetworkManager.java
+++ b/mailbox-android/src/main/java/org/briarproject/mailbox/core/tor/AndroidNetworkManager.java
@@ -183,7 +183,7 @@ public class AndroidNetworkManager implements NetworkManager, Service {
 			}
 			return hasIpv6Unicast;
 		} catch (SocketException e) {
-			logException(LOG, e);
+			logException(LOG, e, "Error while checking for IPv6 only status");
 			return false;
 		}
 	}
diff --git a/mailbox-android/src/release/assets/logback.xml b/mailbox-android/src/release/assets/logback.xml
index 895de00dd5512b6a7827b25c9745a9a890bd7bb1..603aa5dcb296ce1b536dc95a557e6c5e7867f885 100644
--- a/mailbox-android/src/release/assets/logback.xml
+++ b/mailbox-android/src/release/assets/logback.xml
@@ -4,7 +4,7 @@
             <pattern>%logger{12}</pattern>
         </tagEncoder>
         <encoder>
-            <pattern>%msg</pattern>
+            <pattern>[%thread] %msg%n</pattern>
         </encoder>
     </appender>
     <root level="DEBUG">
diff --git a/mailbox-cli/src/main/java/org/briarproject/mailbox/core/tor/JavaCliNetworkManager.java b/mailbox-cli/src/main/java/org/briarproject/mailbox/core/tor/JavaCliNetworkManager.java
index eed4dcddaa065eeb69f58d2756bccbee8a8a8376..bb32ed6ccbeb5975d23bfbf29d72a01048c820cb 100644
--- a/mailbox-cli/src/main/java/org/briarproject/mailbox/core/tor/JavaCliNetworkManager.java
+++ b/mailbox-cli/src/main/java/org/briarproject/mailbox/core/tor/JavaCliNetworkManager.java
@@ -57,7 +57,7 @@ class JavaCliNetworkManager implements NetworkManager {
 				}
 			}
 		} catch (SocketException e) {
-			logException(LOG, e);
+			logException(LOG, e, "Error while getting network status");
 		}
 		return new NetworkStatus(connected, false, !hasIpv4 && hasIpv6Unicast);
 	}
diff --git a/mailbox-core/src/main/java/org/briarproject/mailbox/core/contacts/ContactsManager.kt b/mailbox-core/src/main/java/org/briarproject/mailbox/core/contacts/ContactsManager.kt
index 619d66deca435b3b7062fb84562792ec3bd78994..2435f9676a099cd27ba3bb827b408a75afa62cda 100644
--- a/mailbox-core/src/main/java/org/briarproject/mailbox/core/contacts/ContactsManager.kt
+++ b/mailbox-core/src/main/java/org/briarproject/mailbox/core/contacts/ContactsManager.kt
@@ -78,10 +78,10 @@ class ContactsManager @Inject constructor(
         val c: Contact = try {
             call.receive()
         } catch (e: JacksonException) {
-            logException(LOG, e)
+            logException(LOG, e) { "Error while receiving contact" }
             throw BadRequestException("Unable to deserialise Contact: ${e.message}", e)
         } catch (e: UnsupportedMediaTypeException) {
-            logException(LOG, e)
+            logException(LOG, e) { "Error while receiving contact" }
             throw BadRequestException("Unable to deserialise Contact: ${e.message}", e)
         }
 
diff --git a/mailbox-core/src/main/java/org/briarproject/mailbox/core/db/JdbcDatabase.kt b/mailbox-core/src/main/java/org/briarproject/mailbox/core/db/JdbcDatabase.kt
index 208d5f2f8e3289bf49a8c0fe4530125957e8b669..bb01002a46ef1623a52cff876a4040ff233e6bd8 100644
--- a/mailbox-core/src/main/java/org/briarproject/mailbox/core/db/JdbcDatabase.kt
+++ b/mailbox-core/src/main/java/org/briarproject/mailbox/core/db/JdbcDatabase.kt
@@ -265,7 +265,7 @@ abstract class JdbcDatabase(private val dbTypes: DatabaseTypes, private val cloc
             }
         } catch (e: SQLException) {
             // Try to close the connection
-            logException(LOG, e)
+            logException(LOG, e) { "Error while aborting transaction" }
             tryToClose(connection, LOG)
             // Whatever happens, allow the database to close
             connectionsLock.lock()
diff --git a/mailbox-core/src/main/java/org/briarproject/mailbox/core/db/JdbcUtils.kt b/mailbox-core/src/main/java/org/briarproject/mailbox/core/db/JdbcUtils.kt
index ac9e1b7d7b2f6ceef9f8b1670604f97ae84a2c8f..d776c5cd4b1102c4984bff81f73398a262dfdeaf 100644
--- a/mailbox-core/src/main/java/org/briarproject/mailbox/core/db/JdbcUtils.kt
+++ b/mailbox-core/src/main/java/org/briarproject/mailbox/core/db/JdbcUtils.kt
@@ -32,7 +32,7 @@ object JdbcUtils {
         try {
             rs?.close()
         } catch (e: SQLException) {
-            logException(logger, e)
+            logException(logger, e) { "Error while closing result set" }
         }
     }
 
@@ -40,7 +40,7 @@ object JdbcUtils {
         try {
             s?.close()
         } catch (e: SQLException) {
-            logException(logger, e)
+            logException(logger, e) { "Error while closing statement" }
         }
     }
 
@@ -48,7 +48,7 @@ object JdbcUtils {
         try {
             c?.close()
         } catch (e: SQLException) {
-            logException(logger, e)
+            logException(logger, e) { "Error while closing connection" }
         }
     }
 
diff --git a/mailbox-core/src/main/java/org/briarproject/mailbox/core/lifecycle/LifecycleManagerImpl.kt b/mailbox-core/src/main/java/org/briarproject/mailbox/core/lifecycle/LifecycleManagerImpl.kt
index e3c5e18ae7d4e8f100cf2b285b5f71468cd790c9..02a42b93c5ce4a8a6f886d6018a19920088a8e4b 100644
--- a/mailbox-core/src/main/java/org/briarproject/mailbox/core/lifecycle/LifecycleManagerImpl.kt
+++ b/mailbox-core/src/main/java/org/briarproject/mailbox/core/lifecycle/LifecycleManagerImpl.kt
@@ -133,7 +133,7 @@ internal class LifecycleManagerImpl @Inject constructor(
             startupLatch.countDown()
             SUCCESS
         } catch (e: ServiceException) {
-            logException(LOG, e)
+            logException(LOG, e) { "Error while starting services" }
             SERVICE_ERROR
         } finally {
             startStopWipeSemaphore.release()
diff --git a/mailbox-core/src/main/java/org/briarproject/mailbox/core/setup/QrCodeEncoder.kt b/mailbox-core/src/main/java/org/briarproject/mailbox/core/setup/QrCodeEncoder.kt
index b56acdd44501285db58925613f371c605769f1ff..719e137a074c4fa090316703cfbe7dc690daf6d9 100644
--- a/mailbox-core/src/main/java/org/briarproject/mailbox/core/setup/QrCodeEncoder.kt
+++ b/mailbox-core/src/main/java/org/briarproject/mailbox/core/setup/QrCodeEncoder.kt
@@ -66,7 +66,7 @@ class QrCodeEncoder @Inject constructor(
         val addressString = try {
             torPlugin.hiddenServiceAddress
         } catch (e: DbException) {
-            logException(LOG, e)
+            logException(LOG, e) { "Error while getting hidden service address" }
             return null
         }
         if (addressString == null) {
@@ -85,7 +85,7 @@ class QrCodeEncoder @Inject constructor(
                 setupManager.getSetupToken(txn)
             }
         } catch (e: DbException) {
-            logException(LOG, e)
+            logException(LOG, e) { "Error while getting setup token" }
             return null
         }
         if (tokenString == null) {
diff --git a/mailbox-core/src/main/java/org/briarproject/mailbox/core/tor/TorPlugin.java b/mailbox-core/src/main/java/org/briarproject/mailbox/core/tor/TorPlugin.java
index 73f881b47dfd9e931d5fc0b0db9809e0c6d0a59e..489f57d7262badf944729d9d09873aa6d08f486e 100644
--- a/mailbox-core/src/main/java/org/briarproject/mailbox/core/tor/TorPlugin.java
+++ b/mailbox-core/src/main/java/org/briarproject/mailbox/core/tor/TorPlugin.java
@@ -363,7 +363,7 @@ public abstract class TorPlugin
 		try {
 			s = settingsManager.getSettings(SETTINGS_NAMESPACE);
 		} catch (DbException e) {
-			logException(LOG, e);
+			logException(LOG, e, "Error while retrieving settings");
 			s = new Settings();
 		}
 		String privateKey3 = s.get(HS_PRIVATE_KEY_V3);
@@ -384,7 +384,7 @@ public abstract class TorPlugin
 				response = controlConnection.addOnion(privKey, portLines);
 			}
 		} catch (IOException e) {
-			logException(LOG, e);
+			logException(LOG, e, "Error while add onion service");
 			return;
 		}
 		if (!response.containsKey(HS_ADDRESS)) {
@@ -408,7 +408,7 @@ public abstract class TorPlugin
 			try {
 				settingsManager.mergeSettings(s, SETTINGS_NAMESPACE);
 			} catch (DbException e) {
-				logException(LOG, e);
+				logException(LOG, e, "Error while merging settings");
 			}
 		}
 		state.setServicePublished();
@@ -456,7 +456,8 @@ public abstract class TorPlugin
 				controlConnection.shutdownTor("TERM");
 				controlSocket.close();
 			} catch (IOException e) {
-				logException(LOG, e);
+				logException(LOG, e,
+						"Error while sending tor shutdown instructions");
 			}
 		}
 	}
@@ -519,7 +520,7 @@ public abstract class TorPlugin
 			try {
 				if (state.isTorRunning()) enableNetwork(false);
 			} catch (IOException ex) {
-				logException(LOG, ex);
+				logException(LOG, ex, "Error while disabling network");
 			}
 		});
 	}
@@ -572,7 +573,7 @@ public abstract class TorPlugin
 				}
 				enableNetwork(enableNetwork);
 			} catch (IOException e) {
-				logException(LOG, e);
+				logException(LOG, e, "Error while updating connetion status");
 			}
 		});
 	}
diff --git a/mailbox-core/src/main/java/org/briarproject/mailbox/core/util/IoUtils.java b/mailbox-core/src/main/java/org/briarproject/mailbox/core/util/IoUtils.java
index 27b35f45aa597ea4e7ea6f29d272d76a9197100b..04a4b483182e9352194606d3b09734a871ef703e 100644
--- a/mailbox-core/src/main/java/org/briarproject/mailbox/core/util/IoUtils.java
+++ b/mailbox-core/src/main/java/org/briarproject/mailbox/core/util/IoUtils.java
@@ -81,7 +81,8 @@ public class IoUtils {
 		try {
 			if (c != null) c.close();
 		} catch (IOException e) {
-			logException(logger, e);
+			logException(logger, e, () -> "Error while closing " +
+					c.getClass().getSimpleName());
 		}
 	}
 
@@ -89,7 +90,7 @@ public class IoUtils {
 		try {
 			if (s != null) s.close();
 		} catch (IOException e) {
-			logException(logger, e);
+			logException(logger, e, "Error while closing socket");
 		}
 	}
 
@@ -97,7 +98,7 @@ public class IoUtils {
 		try {
 			if (ss != null) ss.close();
 		} catch (IOException e) {
-			logException(logger, e);
+			logException(logger, e, "Error while closing server socket");
 		}
 	}
 
diff --git a/mailbox-core/src/main/java/org/briarproject/mailbox/core/util/LogUtils.kt b/mailbox-core/src/main/java/org/briarproject/mailbox/core/util/LogUtils.kt
index a0ae2f033abc2a1a5e54c76ad9bc72e241ffacf6..70170eade67d115887fde31e3e75e05164cd5737 100644
--- a/mailbox-core/src/main/java/org/briarproject/mailbox/core/util/LogUtils.kt
+++ b/mailbox-core/src/main/java/org/briarproject/mailbox/core/util/LogUtils.kt
@@ -76,13 +76,13 @@ object LogUtils {
     }
 
     @JvmStatic
-    fun logException(logger: Logger, t: Throwable, message: () -> String) {
-        if (logger.isWarnEnabled) logger.warn(message(), t)
+    fun logException(logger: Logger, t: Throwable, message: String) {
+        if (logger.isWarnEnabled) logger.warn(message, t)
     }
 
     @JvmStatic
-    fun logException(logger: Logger, t: Throwable) {
-        if (logger.isWarnEnabled) logger.warn(t.toString(), t)
+    fun logException(logger: Logger, t: Throwable, message: () -> String) {
+        if (logger.isWarnEnabled) logger.warn(message(), t)
     }
 
     fun logFileOrDir(logger: Logger, f: File) {
diff --git a/mailbox-core/src/main/java/org/briarproject/mailbox/core/util/NetworkUtils.java b/mailbox-core/src/main/java/org/briarproject/mailbox/core/util/NetworkUtils.java
index 1fdaf259e54d2574f3135787333445a23122b905..bac22af9a72f5377b5e8e30b3757d42971d3f0cc 100644
--- a/mailbox-core/src/main/java/org/briarproject/mailbox/core/util/NetworkUtils.java
+++ b/mailbox-core/src/main/java/org/briarproject/mailbox/core/util/NetworkUtils.java
@@ -43,7 +43,8 @@ public class NetworkUtils {
 			//noinspection ConstantConditions
 			return ifaces == null ? emptyList() : list(ifaces);
 		} catch (SocketException e) {
-			logException(LOG, e);
+			logException(LOG, e,
+					"Error while retrieving list of network interfaces");
 			return emptyList();
 		}
 	}