Re: [jetty-user] Usage of JUL-to-SLF4J

Joakim Erdfelt <[email protected]> Thu, 2 Aug 2012 08:47:43 -0700
Newsgroups gmane.comp.java.jetty.support
Message-ID <CAG4zZZBtB-ToTpXLWC9gQyKoF+xAOjUoDXDqLRXB_RK04=44Ew@mail.gmail.com>
--f46d042ef467063b2004c64a55c9
Content-Type: text/plain; charset=ISO-8859-1

There's 2 possible scenarios I'm aware of that cause this.

Scenario 1:

JUL initializes at a point of time earlier than Jetty.
This means the following process occurs ...

   1. JUL initializes
   2. JUL loads its logging.properties file
   3. JUL sees a handler reference to org.slf4j.bridge.SLF4JBridgeHandler
   4. Jetty Start begins
   5. Jetty discovers and loads up its classpath
   6. the jul-to-slf4j.jar is now loaded into the JVM

This means that the reference to the SLF4JBridgeHandler occurs before that
jar exists in the classpath.
To solve this, in jetty-7+ we support ${jetty.home}/lib/ext/ as a place to
put early load jars.

Scenario 2:

A reference to SLF4JBridgeHandler occurs within the context of the
WebAppClassloader and the jul-to-slf4j.jar exists not in the WAR file, but
the jetty server lib.
This requires modification of the WebAppContext + WebAppClassloader to
allow org.slf4j.* to be seen through this server lib -> WebAppClassloader
layer.

In jetty-7+, there's 2 possible ways to handle this scenario.

   1. Using a ${jetty.home}/contexts/myapp.xml context deployer and
   modifying the systemClasses and serverClasses values for the WebAppContext.
   2. Using the
jetty-webapp-logging<http://git.codehaus.org/gitweb.cgi?p=jetty-project.git;a=tree;f=jetty-webapp-logging;hb=HEAD>framework
(jetty-7+) initialize
   the DeploymentManager<http://git.codehaus.org/gitweb.cgi?p=jetty-project.git;a=blob;f=jetty-webapp-logging/src/main/config/etc/jetty-webapp-logging.xml;hb=HEAD>to
set
   the systemClasses to always use slf4j from the server
lib<http://git.codehaus.org/gitweb.cgi?p=jetty-project.git;a=blob;f=jetty-webapp-logging/src/main/java/org/mortbay/jetty/webapp/logging/CentralizedWebAppLoggingBinding.java;hb=HEAD>ignoring
whatever slf4j libs exist in the webapps (WAR files)


--
Joakim Erdfelt <[email protected]>
www.webtide.com
Developer advice, services and support
from the Jetty & CometD experts.



On Thu, Aug 2, 2012 at 8:30 AM, Gaim <[email protected]> wrote:

> Hi,
>
> I would like to jetty log using SLF4J. It works for direct logging through
> SLF4J and for logging using apache logging commons but it doesn't work for
> java.util.logging. I am starting jetty from maven plugin and I use the
> plugin version 6.1.26. I have jul-to-slf4j in dependencies in a version
> 1.6.6. The JUL logging properties contains only definition of
> org.slf4j.bridge.SLF4JBridgeHandler to be a handler.
>
> My problem is, that the Jetty still says, that
>
> Can't load log handler "org.slf4j.bridge.SLF4JBridgeHandler"
> java.lang.ClassNotFoundException: org.slf4j.bridge.SLF4JBridgeHandler
> java.lang.ClassNotFoundException: org.slf4j.bridge.SLF4JBridgeHandler
>         at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
>         at java.security.AccessController.doPrivileged(Native Method)
>         at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
>         at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
>         at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
>         at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
>         at java.util.logging.LogManager$7.run(LogManager.java:910)
>         at java.security.AccessController.doPrivileged(Native Method)
>         at
> java.util.logging.LogManager.initializeGlobalHandlers(LogManager.java:903)
>         at java.util.logging.LogManager.access$900(LogManager.java:129)
>         at
> java.util.logging.LogManager$RootLogger.getHandlers(LogManager.java:1010)
>         at java.util.logging.Logger.log(Logger.java:454)
>         at java.util.logging.Logger.doLog(Logger.java:480)
>         at java.util.logging.Logger.logp(Logger.java:596)
>         at org.zkoss.util.logging.Log.log(Log.java:379)
>         at org.zkoss.util.logging.Log.debug(Log.java:711)
>         at org.zkoss.zk.ui.http.WebManager.<init>(WebManager.java:108)
>         at
>
> org.zkoss.zk.ui.http.HttpSessionListener23.contextInitialized(HttpSessionListener23.java:140)
>         at
>
> org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:549)
>         at org.mortbay.jetty.servlet.Context.startContext(Context.java:136)
>         at
>
> org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1282)
>         at
> org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:518)
>         at
> org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:499)
>         at
>
> org.mortbay.jetty.plugin.Jetty6PluginWebAppContext.doStart(Jetty6PluginWebAppContext.java:115)
>         at
> org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
>         at
>
> org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:152)
>         at
>
> org.mortbay.jetty.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:156)
>         at
> org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
>         at
>
> org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:152)
>         at
> org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
>         at
> org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
>         at org.mortbay.jetty.Server.doStart(Server.java:224)
>         at
> org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
>         at
>
> org.mortbay.jetty.plugin.Jetty6PluginServer.start(Jetty6PluginServer.java:132)
>         at
>
> org.mortbay.jetty.plugin.AbstractJettyMojo.startJetty(AbstractJettyMojo.java:454)
>         at
>
> org.mortbay.jetty.plugin.AbstractJettyMojo.execute(AbstractJettyMojo.java:396)
>         at
>
> org.mortbay.jetty.plugin.AbstractJettyRunMojo.execute(AbstractJettyRunMojo.java:210)
>         at
> org.mortbay.jetty.plugin.Jetty6RunMojo.execute(Jetty6RunMojo.java:184)
>         at
>
> org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:490)
>         at
>
> org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:694)
>         at
>
> org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandaloneGoal(DefaultLifecycleExecutor.java:569)
>         at
>
> org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:539)
>         at
>
> org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:387)
>         at
>
> org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:348)
>         at
>
> org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:180)
>         at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:328)
>         at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:138)
>         at org.apache.maven.cli.MavenCli.main(MavenCli.java:362)
>         at
> org.apache.maven.cli.compat.CompatibleMain.main(CompatibleMain.java:60)
>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>         at
>
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>         at
>
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>         at java.lang.reflect.Method.invoke(Method.java:597)
>         at
> org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
>         at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
>         at
> org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)
>         at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
>
>
>
>
>
>
> and I don't know why, because all necessary slf4j modules are defined in
> dependencies.
>
> I would like ask for any help that bring me to working bridged logging from
> JUL to SLF4J. It seems to be a classloader problem.
>
> Thanks a lot,
> Karel
>
>
>
> --
> View this message in context:
> http://jetty.4.n6.nabble.com/Usage-of-JUL-to-SLF4J-tp4958903.html
> Sent from the Jetty Support mailing list archive at Nabble.com.
>
> ---------------------------------------------------------------------
> To unsubscribe from this list, please visit:
>
>     http://xircles.codehaus.org/manage_email
>
>
>

--f46d042ef467063b2004c64a55c9
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

<div>There&#39;s 2 possible scenarios I&#39;m aware of that cause this.</di=
v><div><br></div><div>Scenario 1:</div><div><br></div>JUL initializes at a =
point of time earlier than Jetty.<div>This means the following process occu=
rs ...</div>
<div><ol><li>JUL initializes</li><li>JUL loads its logging.properties file<=
/li><li>JUL sees a handler reference to=A0org.slf4j.bridge.SLF4JBridgeHandl=
er</li><li>Jetty Start begins</li><li>Jetty discovers and loads up its clas=
spath</li>
<li>the jul-to-slf4j.jar is now loaded into the JVM</li></ol><div>This mean=
s that the reference to the SLF4JBridgeHandler occurs before that jar exist=
s in the classpath.</div></div><div>To solve this, in jetty-7+ we support $=
{jetty.home}/lib/ext/ as a place to put early load jars.</div>
<div><br></div><div>Scenario 2:</div><div><br></div><div>A reference to SLF=
4JBridgeHandler occurs within the context of the WebAppClassloader and the =
jul-to-slf4j.jar exists not in the WAR file, but the jetty server lib.</div=
>
<div>This requires modification of the WebAppContext + WebAppClassloader to=
 allow org.slf4j.* to be seen through this server lib -&gt; WebAppClassload=
er layer.</div><div><br></div><div>In jetty-7+, there&#39;s 2 possible ways=
 to handle this scenario.</div>
<div><ol><li>Using a ${jetty.home}/contexts/myapp.xml context deployer and =
modifying the systemClasses and serverClasses values for the WebAppContext.=
</li><li>Using the <a href=3D"http://git.codehaus.org/gitweb.cgi?p=3Djetty-=
project.git;a=3Dtree;f=3Djetty-webapp-logging;hb=3DHEAD">jetty-webapp-loggi=
ng</a> framework (jetty-7+) <a href=3D"http://git.codehaus.org/gitweb.cgi?p=
=3Djetty-project.git;a=3Dblob;f=3Djetty-webapp-logging/src/main/config/etc/=
jetty-webapp-logging.xml;hb=3DHEAD">initialize the DeploymentManager</a> to=
 <a href=3D"http://git.codehaus.org/gitweb.cgi?p=3Djetty-project.git;a=3Dbl=
ob;f=3Djetty-webapp-logging/src/main/java/org/mortbay/jetty/webapp/logging/=
CentralizedWebAppLoggingBinding.java;hb=3DHEAD">set the systemClasses to al=
ways use slf4j from the server lib</a> ignoring whatever slf4j libs exist i=
n the webapps (WAR files)</li>
</ol></div><div><br clear=3D"all"><div>--</div><div>Joakim Erdfelt &lt;<a h=
ref=3D"mailto:[email protected]" target=3D"_blank">[email protected]</a>&=
gt;</div><div><a href=3D"http://www.webtide.com/" target=3D"_blank">www.web=
tide.com</a></div>
<div><span>Developer advice, services and support</span><br><span>from the =
Jetty &amp; CometD experts.</span></div><br>
<br><br><div class=3D"gmail_quote">On Thu, Aug 2, 2012 at 8:30 AM, Gaim <sp=
an dir=3D"ltr">&lt;<a href=3D"mailto:[email protected]" target=3D"_blan=
k">[email protected]</a>&gt;</span> wrote:<br><blockquote class=3D"gmai=
l_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left=
:1ex">
Hi,<br>
<br>
I would like to jetty log using SLF4J. It works for direct logging through<=
br>
SLF4J and for logging using apache logging commons but it doesn&#39;t work =
for<br>
java.util.logging. I am starting jetty from maven plugin and I use the<br>
plugin version 6.1.26. I have jul-to-slf4j in dependencies in a version<br>
1.6.6. The JUL logging properties contains only definition of<br>
org.slf4j.bridge.SLF4JBridgeHandler to be a handler.<br>
<br>
My problem is, that the Jetty still says, that<br>
<br>
Can&#39;t load log handler &quot;org.slf4j.bridge.SLF4JBridgeHandler&quot;<=
br>
java.lang.ClassNotFoundException: org.slf4j.bridge.SLF4JBridgeHandler<br>
java.lang.ClassNotFoundException: org.slf4j.bridge.SLF4JBridgeHandler<br>
=A0 =A0 =A0 =A0 at java.net.URLClassLoader$1.run(URLClassLoader.java:200)<b=
r>
=A0 =A0 =A0 =A0 at java.security.AccessController.doPrivileged(Native Metho=
d)<br>
=A0 =A0 =A0 =A0 at java.net.URLClassLoader.findClass(URLClassLoader.java:18=
8)<br>
=A0 =A0 =A0 =A0 at java.lang.ClassLoader.loadClass(ClassLoader.java:307)<br=
>
=A0 =A0 =A0 =A0 at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java=
:301)<br>
=A0 =A0 =A0 =A0 at java.lang.ClassLoader.loadClass(ClassLoader.java:252)<br=
>
=A0 =A0 =A0 =A0 at java.util.logging.LogManager$7.run(LogManager.java:910)<=
br>
=A0 =A0 =A0 =A0 at java.security.AccessController.doPrivileged(Native Metho=
d)<br>
=A0 =A0 =A0 =A0 at<br>
java.util.logging.LogManager.initializeGlobalHandlers(LogManager.java:903)<=
br>
=A0 =A0 =A0 =A0 at java.util.logging.LogManager.access$900(LogManager.java:=
129)<br>
=A0 =A0 =A0 =A0 at<br>
java.util.logging.LogManager$RootLogger.getHandlers(LogManager.java:1010)<b=
r>
=A0 =A0 =A0 =A0 at java.util.logging.Logger.log(Logger.java:454)<br>
=A0 =A0 =A0 =A0 at java.util.logging.Logger.doLog(Logger.java:480)<br>
=A0 =A0 =A0 =A0 at java.util.logging.Logger.logp(Logger.java:596)<br>
=A0 =A0 =A0 =A0 at org.zkoss.util.logging.Log.log(Log.java:379)<br>
=A0 =A0 =A0 =A0 at org.zkoss.util.logging.Log.debug(Log.java:711)<br>
=A0 =A0 =A0 =A0 at org.zkoss.zk.ui.http.WebManager.&lt;init&gt;(WebManager.=
java:108)<br>
=A0 =A0 =A0 =A0 at<br>
org.zkoss.zk.ui.http.HttpSessionListener23.contextInitialized(HttpSessionLi=
stener23.java:140)<br>
=A0 =A0 =A0 =A0 at<br>
org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:5=
49)<br>
=A0 =A0 =A0 =A0 at org.mortbay.jetty.servlet.Context.startContext(Context.j=
ava:136)<br>
=A0 =A0 =A0 =A0 at<br>
org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1282=
)<br>
=A0 =A0 =A0 =A0 at<br>
org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:518)<b=
r>
=A0 =A0 =A0 =A0 at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppCon=
text.java:499)<br>
=A0 =A0 =A0 =A0 at<br>
org.mortbay.jetty.plugin.Jetty6PluginWebAppContext.doStart(Jetty6PluginWebA=
ppContext.java:115)<br>
=A0 =A0 =A0 =A0 at org.mortbay.component.AbstractLifeCycle.start(AbstractLi=
feCycle.java:50)<br>
=A0 =A0 =A0 =A0 at<br>
org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:=
152)<br>
=A0 =A0 =A0 =A0 at<br>
org.mortbay.jetty.handler.ContextHandlerCollection.doStart(ContextHandlerCo=
llection.java:156)<br>
=A0 =A0 =A0 =A0 at org.mortbay.component.AbstractLifeCycle.start(AbstractLi=
feCycle.java:50)<br>
=A0 =A0 =A0 =A0 at<br>
org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:=
152)<br>
=A0 =A0 =A0 =A0 at org.mortbay.component.AbstractLifeCycle.start(AbstractLi=
feCycle.java:50)<br>
=A0 =A0 =A0 =A0 at<br>
org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)<b=
r>
=A0 =A0 =A0 =A0 at org.mortbay.jetty.Server.doStart(Server.java:224)<br>
=A0 =A0 =A0 =A0 at org.mortbay.component.AbstractLifeCycle.start(AbstractLi=
feCycle.java:50)<br>
=A0 =A0 =A0 =A0 at<br>
org.mortbay.jetty.plugin.Jetty6PluginServer.start(Jetty6PluginServer.java:1=
32)<br>
=A0 =A0 =A0 =A0 at<br>
org.mortbay.jetty.plugin.AbstractJettyMojo.startJetty(AbstractJettyMojo.jav=
a:454)<br>
=A0 =A0 =A0 =A0 at<br>
org.mortbay.jetty.plugin.AbstractJettyMojo.execute(AbstractJettyMojo.java:3=
96)<br>
=A0 =A0 =A0 =A0 at<br>
org.mortbay.jetty.plugin.AbstractJettyRunMojo.execute(AbstractJettyRunMojo.=
java:210)<br>
=A0 =A0 =A0 =A0 at org.mortbay.jetty.plugin.Jetty6RunMojo.execute(Jetty6Run=
Mojo.java:184)<br>
=A0 =A0 =A0 =A0 at<br>
org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManag=
er.java:490)<br>
=A0 =A0 =A0 =A0 at<br>
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLif=
ecycleExecutor.java:694)<br>
=A0 =A0 =A0 =A0 at<br>
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandaloneGoal(D=
efaultLifecycleExecutor.java:569)<br>
=A0 =A0 =A0 =A0 at<br>
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLife=
cycleExecutor.java:539)<br>
=A0 =A0 =A0 =A0 at<br>
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFai=
lures(DefaultLifecycleExecutor.java:387)<br>
=A0 =A0 =A0 =A0 at<br>
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(Def=
aultLifecycleExecutor.java:348)<br>
=A0 =A0 =A0 =A0 at<br>
org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycl=
eExecutor.java:180)<br>
=A0 =A0 =A0 =A0 at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.jav=
a:328)<br>
=A0 =A0 =A0 =A0 at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:=
138)<br>
=A0 =A0 =A0 =A0 at org.apache.maven.cli.MavenCli.main(MavenCli.java:362)<br=
>
=A0 =A0 =A0 =A0 at org.apache.maven.cli.compat.CompatibleMain.main(Compatib=
leMain.java:60)<br>
=A0 =A0 =A0 =A0 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Meth=
od)<br>
=A0 =A0 =A0 =A0 at<br>
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:3=
9)<br>
=A0 =A0 =A0 =A0 at<br>
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImp=
l.java:25)<br>
=A0 =A0 =A0 =A0 at java.lang.reflect.Method.invoke(Method.java:597)<br>
=A0 =A0 =A0 =A0 at org.codehaus.classworlds.Launcher.launchEnhanced(Launche=
r.java:315)<br>
=A0 =A0 =A0 =A0 at org.codehaus.classworlds.Launcher.launch(Launcher.java:2=
55)<br>
=A0 =A0 =A0 =A0 at org.codehaus.classworlds.Launcher.mainWithExitCode(Launc=
her.java:430)<br>
=A0 =A0 =A0 =A0 at org.codehaus.classworlds.Launcher.main(Launcher.java:375=
)<br>
<br>
<br>
<br>
<br>
<br>
<br>
and I don&#39;t know why, because all necessary slf4j modules are defined i=
n<br>
dependencies.<br>
<br>
I would like ask for any help that bring me to working bridged logging from=
<br>
JUL to SLF4J. It seems to be a classloader problem.<br>
<br>
Thanks a lot,<br>
Karel<br>
<br>
<br>
<br>
--<br>
View this message in context: <a href=3D"http://jetty.4.n6.nabble.com/Usage=
-of-JUL-to-SLF4J-tp4958903.html" target=3D"_blank">http://jetty.4.n6.nabble=
.com/Usage-of-JUL-to-SLF4J-tp4958903.html</a><br>
Sent from the Jetty Support mailing list archive at Nabble.com.<br>
<br>
---------------------------------------------------------------------<br>
To unsubscribe from this list, please visit:<br>
<br>
=A0 =A0 <a href=3D"http://xircles.codehaus.org/manage_email" target=3D"_bla=
nk">http://xircles.codehaus.org/manage_email</a><br>
<br>
<br>
</blockquote></div><br></div>

--f46d042ef467063b2004c64a55c9--