[jboss-jira] [JBoss JIRA] (JBLOGGING-111) LoggerProvider configured with new ServiceLoader crash
Steven Sharp (Jira)
issues at jboss.org
Fri Oct 5 23:06:00 EDT 2018
[ https://issues.jboss.org/browse/JBLOGGING-111?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13644222#comment-13644222 ]
Steven Sharp commented on JBLOGGING-111:
----------------------------------------
[~jamezp], you mentioned that "The SPI is really meant to enable users to provide their own provider." To do this, you have to write your provider from scratch as all the abstract implementations are package private as well. The only documentation I could find for this feature, other than the code, was the [hibernate documentation|http://docs.jboss.org/hibernate/orm/current/topical/html_single/logging/Logging.html] which is incorrect. In the code, the exception ({{ServiceConfigurationError}}) is silently eaten leaving developers wondering why their logging implementation of choice doesn't work.
When we deploy our application, adding a system property is not possible. An ugly workaround is to create a delegate class in the org.jboss.logging package, but that is unmaintainable. The implementation classes should be public so the logging implementation can be chosen via the ServiceLoader. At least expose the result of the {{ServiceLoader.load()}} method so developers will know that it failed. Either this issue should be reopened or a new one should be created.
> LoggerProvider configured with new ServiceLoader crash
> ------------------------------------------------------
>
> Key: JBLOGGING-111
> URL: https://issues.jboss.org/browse/JBLOGGING-111
> Project: JBoss Logging
> Issue Type: Bug
> Affects Versions: 3.2.0.Beta1
> Environment: Weblogic 10.3.2.0
> Configured in ejb jar, deployed by an ear file
> Reporter: Frederic Allard
> Assignee: James Perkins
> Priority: Major
> Fix For: 3.2.0.Final
>
>
> There is a new feature in the beta which uses the ServiceLoader to specify a LoggerProvider to be used by JBoss Logging.
> org.jboss.logging.LoggerProviders snippet :
> {code}
> // Next try for a service provider
> try {
> final ServiceLoader<LoggerProvider> loader = ServiceLoader.load(LoggerProvider.class, cl);
> if (loader.iterator().hasNext()) {
> return loader.iterator().next();
> }
> } catch (Throwable ignore) {
> // TODO consider printing the stack trace as it should only happen once
> }
> {code}
> When you try to configure a provider (ex. org.jboss.logging.Slf4jLoggerProvider), the ServiceLoader crash silently and ignore the provider.
> {code}
> java.util.ServiceConfigurationError: org.jboss.logging.LoggerProvider: Provider org.jboss.logging.Slf4jLoggerProvider could not be instantiated: java.lang.IllegalAccessException: Class java.util.ServiceLoader$LazyIterator can not access a member of class org.jboss.logging.Slf4jLoggerProvider with modifiers ""
> at java.util.ServiceLoader.fail(ServiceLoader.java:207)
> at java.util.ServiceLoader.access$100(ServiceLoader.java:164)
> at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:353)
> at java.util.ServiceLoader$1.next(ServiceLoader.java:421)
> at org.jboss.logging.LoggerProviders.findProvider(LoggerProviders.java:70)
> at org.jboss.logging.LoggerProviders.find(LoggerProviders.java:32)
> at org.jboss.logging.LoggerProviders.<clinit>(LoggerProviders.java:29)
> at org.jboss.logging.Logger.getLogger(Logger.java:2177)
> at org.jboss.logging.Logger$1.run(Logger.java:2277)
> at java.security.AccessController.doPrivileged(Native Method)
> at org.jboss.logging.Logger.getMessageLogger(Logger.java:2241)
> at org.jboss.logging.Logger.getMessageLogger(Logger.java:2228)
> at org.hibernate.cfg.Configuration.<clinit>(Configuration.java:176)
> ...
> {code}
> This is caused by the fact that all JBoss providers are not public classes and are instead package classes.
--
This message was sent by Atlassian Jira
(v7.12.1#712002)
More information about the jboss-jira
mailing list