[
https://jira.qos.ch/browse/SLF4J-396?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18365#comment-18365
]
Joern Huxhorn commented on SLF4J-396:
-------------------------------------
A bit of extra context:
I had my own bridge implementation in Lilith that was predating this one. Yours
is the better implementation because it handles the resource bundles
appropriately so I decided to drop my own implementation altogether in favor of
the {{SLF4JBridgeHandler}}/{{LevelChangePropagator}} combination.
The only downside is the lack of the info mentioned above which my
implementation was previously already putting into the {{MDC}}.
> Support jul sourceClassName and sourceMethodName in slf4j-bridge.
> -----------------------------------------------------------------
>
> Key: SLF4J-396
> URL: https://jira.qos.ch/browse/SLF4J-396
> Project: SLF4J
> Issue Type: Improvement
> Components: jul-to-slf4j
> Affects Versions: 1.7.24
> Environment: any
> Reporter: Joern Huxhorn
> Assignee: SLF4J developers list
>
> The {{SLF4JBridgeHandler}} is currently dropping some log record info while
> bridging to slf4j.
> The reason for this is that {{java.util.logging}} logger names are different
> beasts than slf4j ones. While it is a very common convention that an slf4j
> logger name equals the class name it's responsible for, this isn't
> necessarily the case for {{java.util.logging}}.
> That's why {{LogRecord}} contains {{sourceClassName}} and
> {{sourceMethodName}} fields that are populated by {{Logger.entering}},
> {{Logger.exiting}}, {{Logger.throwing}} and the general {{logp/logrb}}
> methods.
> That info is crucial to the point where the log records are relatively
> useless without it.
> Example:
> {{Logger.entering("SourceClass","sourceMethod")}} will result in an event
> that simply says {{ENTRY}}.
> Furthermore, {{jul}} allows for custom {{Level}} instances with a name and an
> arbitrary {{intValue()}}. While losing those is way less critical since they
> are already mapped to slf4j levels in a reasonable way, I think it would
> still be worthwhile to keep that info around.
> I'd suggest to add the following to {{SLF4JBridgeHandler}}:
> {code:java}
> private static final String LEVEL_MDC_KEY = "JUL-Level";
> private static final String LEVEL_VALUE_MDC_KEY = "JUL-Level-Value";
> private static final String SOURCE_CLASS_NAME_MDC_KEY = "JUL-SourceClassName";
> private static final String SOURCE_METHOD_NAME_MDC_KEY =
> "JUL-SourceMethodName";
> private static void initMDC(LogRecord record) {
> Level julLevel = record.getLevel();
> MDC.put(LEVEL_MDC_KEY, julLevel.getName());
> MDC.put(LEVEL_VALUE_MDC_KEY, Integer.toString(julLevel.intValue()));
> String sourceClassName = record.getSourceClassName();
> if(sourceClassName != null) {
> MDC.put(SOURCE_CLASS_NAME_MDC_KEY, sourceClassName);
> }
> String sourceMethodName = record.getSourceMethodName();
> if(sourceMethodName != null) {
> MDC.put(SOURCE_METHOD_NAME_MDC_KEY, sourceMethodName);
> }
> }
> private static void clearMDC() {
> MDC.remove(LEVEL_MDC_KEY);
> MDC.remove(LEVEL_VALUE_MDC_KEY);
> MDC.remove(SOURCE_CLASS_NAME_MDC_KEY);
> MDC.remove(SOURCE_METHOD_NAME_MDC_KEY);
> }
> {code}
> Those methods would then be used in {{publish(LogRecord record)}}:
> {code:java}
> initMDC(record);
> try {
> if (slf4jLogger instanceof LocationAwareLogger) {
> callLocationAwareLogger((LocationAwareLogger) slf4jLogger, record);
> } else {
> callPlainSLF4JLogger(slf4jLogger, record);
> }
> }
> finally {
> clearMDC();
> }
> {code}
--
This message was sent by Atlassian JIRA
(v7.3.1#73012)
_______________________________________________
slf4j-dev mailing list
[email protected]
http://mailman.qos.ch/mailman/listinfo/slf4j-dev