 
 (defmacro logf
   "Logs a message using a format string and args. Can optionally take a
-  throwable as its second arg. See level-specific macros, e.g., debugf."
+  throwable as its second arg. See level-specific macros, e.g., debugf.
+  Use the 'logging.readable' namespace to avoid wrapping args in pr-str."
   {:arglists '([level fmt & fmt-args] [level throwable fmt & fmt-args])}
   [level x & more]
   (if (or (instance? String x) (nil? more)) ; optimize for common case


(defmacro logp
  "Logs a message using print style args. Can optionally take a throwable as its
  second arg. See level-specific macros, e.g., debug."
  {:arglists '([level message & more] [level throwable message & more])}
  [level x & more]
  (if (or (instance? String x) (nil? more)) ; optimize for common case


(defmacro spyf
  "Evaluates expr and may write (format fmt result) to the log. Returns the
  result of expr. Defaults to :debug log level.
  Use the 'logging.readable' namespace to avoid wrapping args in pr-str."
  ([fmt expr]
    `(spyf :debug ~fmt ~expr))
  ([level fmt expr]
