 ;;;; Internal
 
 (s/fdef build-log-entry
-        :args (s/cat :label ::label
-                     :lamport ::lamport
-                     :level ::level
-                     :message ::message))
+        :args (s/or :with-msg (s/cat :label ::label
+                                     :lamport ::lamport
+                                     :level ::level
+                                     :message ::message)
+                    :sans-msg (s/cat :label ::label
+                                     :lamport ::lamport
+                                     :level ::level)))
 (defn build-log-entry
-  [label lamport level message]
-  {::current-thread (utils/get-current-thread)
-   ::label label
-   ::lamport lamport
-   ::level level
-   ::time (System/currentTimeMillis)
-   ::message message})
+  ([label lamport level]
+   {::current-thread (utils/get-current-thread)
+    ::label label
+    ::lamport lamport
+    ::level level
+    ::time (System/currentTimeMillis)})
+  ([label lamport level message]
+   (assoc (build-log-entry label lamport level)
+          ::message message)))
 
 (s/fdef add-log-entry
         :args (s/cat :log-state ::state

       ([log-state#
         label#
         message#]
        (add-log-entry log-state# ~tag label# message#)))))

(defn exception-details
  [ex]

(deflogger error)

(defn exception
  ([log-state ex label]
   (add-log-entry log-state ::exception label))
  ([log-state ex label message]
   (add-log-entry log-state ::exception label message))
  ([log-state ex label message original-details]
   (let [details {::original-details original-details
                  ::problem (exception-details ex)}]
