[
https://issues.jboss.org/browse/JBLOGGING-111?page=com.atlassian.jira.plu...
]
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_si...]
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)