Hi,

Profiting from release 3.x we could slightly change the interpretation
of throwable parameters used in logging methods.

IIRC in one of our online meetings, we raised the issue of logging
statements like this:

logger.info("Error nr {}: {}", nr, throwable);

which is not considered best practice and is probably not what the
user intended:

logger.info("Error nr {}: {}", nr, throwable.getMessage(), throwable);

A similar problem was reported in PR #1050[2].

Regarding this kind of statements, the OSGi Log[1] Service provides a
very nice alternative interpretation on how to deal with throwable
parameters:

"If the last argument is a Throwable or a ServiceReference, it is
added to the generated LogEntry and then, if the next to last argument
is a ServiceReference or Throwable and not the same type as the last
argument, it is also added to the generated LogEntry. These arguments
will not be used as message arguments."

Should we adopt a similar interpretation in 3.x? The advantages I see are:

1. We fix some inconsistencies in the API:
 * we have a pair `info(String, Throwable)/info(String, Object)`
methods that prevents users from mistakenly pass a `Throwable` as a
log message argument,
 * we only have `info(Object)`,
 * we only have `info(String, Object, Object)`.
2. We simplify our logic: right now we need logic to deal with
throwables in `Message`. On the other hand throwables are not
considered part of a message by any layout and are also included
separately in LogEvent. If we don't need to chase throwables in
parameterized messages, we don't need to parse the format string until
it is required.
3. There might be some cases when including throwables in a log
message leads to information disclosure (e.g. when a user sees a log
message, but not the attached throwable). This way we'll have an API
which is easy to use and hard to misuse.

Piotr

[1] 
https://docs.osgi.org/javadoc/osgi.core/8.0.0/org/osgi/service/log/Logger.html
[2] https://github.com/apache/logging-log4j2/pull/1050

Reply via email to