BREAKING CHANGES:
* Custom appenders that rely on the :more argument will no longer function correctly.
* Stacktraces are no longer automatically generated at the `log`-macro level, but are
left as an appender implementation detail. A :throwable appender argument has been added
along with a `stacktrace` fn.
MIGRATION GUIDE:
* :message is now a string of all arguments as joined by `logp`/`logf`. Appenders that
need unjoined logging arguments (i.e. raw arguments as given to `logp`/`logf`) should
use the new :log-args vector.
MOTIVATION:
The :more argument was always kind of manky.
By joining logging arguments at the `log`-macro level, we simplify appender
implementations and allow the use of different joining strategies like `logp` and
`logf`.
This approach also fits better with the `tools.logging` API, allowing a cleaner
Logger implementation.
* Appenders are now decorated via 2 separate mechanisms: a per-appender
decorator (as before), and a new per-juxt (i.e. combined) decorator.
The per-juxt wrapping provides a performance-conscious hook for
higher-level facilities like the new middleware feature.
* Moved compile-time config wrapping from per-appender to per-juxt,
improving performance.
* Fixed appender wrapper ordering.
The `assert-valid-logging-level` macro had the unfortunate side effect of
preventing the use of runtime-evaluated logging-levels.
To get around this without impacting performance, `assert-valid-logging-level`
has been removed and the validty checking moved to the (memoized) level
comparator.
This is cleaner, more flexible, and no slower.