On Friday, March 16, 2012 11:59:02 PM Willem Jiang wrote:
> Sorry, I didn't realized the change has so many side effects.
> I will revert the back port patches and find a better solutioni on the
> trunk.

Can you try the patch below?
That should keep the detection in place but adds the j.u.l detection, but 
fall back to slf4j if detection fails.   On the back ported branch, remove 
the final "else".

This works in OSGi as well as it removes the "impl" forName and checks for 
the pax.logging stuff.


Dan



diff --git a/api/src/main/java/org/apache/cxf/common/logging/LogUtils.java 
b/api/src/main/java/org/apache/cxf/common/logging/LogUtils.java
index 1842ad4..b04b857 100644
--- a/api/src/main/java/org/apache/cxf/common/logging/LogUtils.java
+++ b/api/src/main/java/org/apache/cxf/common/logging/LogUtils.java
@@ -35,7 +35,6 @@ import java.util.logging.Logger;
 
 import org.apache.cxf.common.i18n.BundleUtils;
 import org.apache.cxf.common.util.StringUtils;
-import org.apache.log4j.spi.LoggerFactory;
 
 
 /**
@@ -97,9 +96,31 @@ public final class LogUtils {
                 }
             }
             if (StringUtils.isEmpty(cname)) {
-                Class.forName("org.slf4j.impl.StaticLoggerBinder");
-                // using the Slf4jLogger directly
-                cname = "org.apache.cxf.common.logging.Slf4jLogger";
+                try {
+                    Class<?> cls = 
Class.forName("org.slf4j.LoggerFactory");
+                    Class<?> fcls = 
cls.getMethod("getILoggerFactory").invoke(null).getClass();
+                    String clsName = fcls.getName();
+                    if (clsName.contains("Log4j")) {
+                        cname = 
"org.apache.cxf.common.logging.Log4jLogger";
+                    } else if (clsName.contains("JCL")) {
+                        cls = 
Class.forName("org.apache.commons.logging.LogFactory");
+                        fcls = 
cls.getMethod("getFactory").invoke(null).getClass();
+                        if (fcls.getName().contains("Log4j")) {
+                            cname = 
"org.apache.cxf.common.logging.Log4jLogger";
+                        }
+                    } else if (clsName.contains("JDK14")
+                        || clsName.contains("pax.logging")) {
+                        //both of these we can use the appropriate j.u.l 
API's 
+                        //directly and have it work properly
+                        cname = null;
+                    } else {
+                        // Cannot really detect where it's logging so we'll
+                        // go ahead and use the Slf4jLogger directly
+                        cname = 
"org.apache.cxf.common.logging.Slf4jLogger";
+                    }
+                } catch (Throwable t) {
+                    //ignore - Slf4j not available
+                }
             }
             if (!StringUtils.isEmpty(cname)) {
                 try {



> 
> On Fri Mar 16 22:48:26 2012, Daniel Kulp wrote:
> > I'm -1 for this change for 2 reasons:
> > 
> > 1) This breaks existing logging configuration and thus cannot be pulled
> > back onto the other branches.   Users may already have j.u.l configs
> > that would no longer work.
> > 
> > 2) Performance issues - the Slf4jLogger does a LOT more work than the
> > j.u.l loggers and thus we should only use this as a last resort, not
> > the default which this change pretty much entails.
> > 
> > Dan
> > 
> > On Friday, March 16, 2012 02:38:18 PM ningji...@apache.org wrote:
> >> Author: ningjiang
> >> Date: Fri Mar 16 14:38:18 2012
> >> New Revision: 1301549
> >> 
> >> URL: http://svn.apache.org/viewvc?rev=1301549&view=rev
> >> Log:
> >> Merged revisions 1301539 via svnmerge from
> >> https://svn.apache.org/repos/asf/cxf/trunk
> >> 
> >> ........
> >> 
> >>    r1301539 | ningjiang | 2012-03-16 22:18:01 +0800 (Fri, 16 Mar 2012)
> >>    | 1
> >> 
> >> line
> >> 
> >>    CXF-4180 LogUtils should default to CXF's Slf4jLogger if it can't
> >>    find
> >> 
> >> Log4J or JCL driver ........
> >> 
> >> Modified:
> >>      cxf/branches/2.5.x-fixes/   (props changed)
> >> 
> >> cxf/branches/2.5.x-fixes/common/common/src/main/java/org/apache/cxf/com
> >> mo
> >> n/logging/LogUtils.java
> >> 
> >> Propchange: cxf/branches/2.5.x-fixes/
> >> -----------------------------------------------------------------------
> >> --- ---- svn:mergeinfo = /cxf/trunk:1301539
> >> 
> >> Propchange: cxf/branches/2.5.x-fixes/
> >> -----------------------------------------------------------------------
> >> --- ---- Binary property 'svnmerge-integrated' - no diff available.
> >> 
> >> Modified:
> >> cxf/branches/2.5.x-fixes/common/common/src/main/java/org/apache/cxf/com
> >> mo
> >> n/logging/LogUtils.java URL:
> >> http://svn.apache.org/viewvc/cxf/branches/2.5.x-fixes/common/common/src
> >> /m
> >> ain/java/org/apache/cxf/common/logging/LogUtils.java?rev=1301549&r1=130
> >> 154 8&r2=1301549&view=diff
> >> =======================================================================
> >> ==
> >> ===== ---
> >> cxf/branches/2.5.x-fixes/common/common/src/main/java/org/apache/cxf/com
> >> mo
> >> n/logging/LogUtils.java (original) +++
> >> cxf/branches/2.5.x-fixes/common/common/src/main/java/org/apache/cxf/com
> >> mo
> >> n/logging/LogUtils.java Fri Mar 16 14:38:18 2012 @@ -97,17 +97,8 @@
> >> public final class LogUtils {
> >> 
> >>               }
> >>               if (StringUtils.isEmpty(cname)) {
> >>               
> >>                   Class.forName("org.slf4j.impl.StaticLoggerBinder");
> >> 
> >> -                Class<?>  cls =
> >> Class.forName("org.slf4j.LoggerFactory"); -                Class<?> 
> >> fcls =
> >> cls.getMethod("getILoggerFactory").invoke(null).getClass(); -
> >> 
> >>     if (fcls.getName().contains("Log4j")) {
> >> 
> >> -                    cname =
> >> "org.apache.cxf.common.logging.Log4jLogger";
> >> -                } else if (fcls.getName().contains("JCL")) {
> >> -                    cls =
> >> Class.forName("org.apache.commons.logging.LogFactory"); -
> >> 
> >>     fcls = cls.getMethod("getFactory").invoke(null).getClass(); -
> >>     
> >>            if (fcls.getName().contains("Log4j")) {
> >> 
> >> -                        cname =
> >> "org.apache.cxf.common.logging.Log4jLogger"; -                    }
> >> -                }
> >> +                // using the Slf4jLogger directly
> >> +                cname = "org.apache.cxf.common.logging.Slf4jLogger";
> >> 
> >>               }
> >>               if (!StringUtils.isEmpty(cname)) {
> >>               
> >>                   try {
-- 
Daniel Kulp
dk...@apache.org - http://dankulp.com/blog
Talend Community Coder - http://coders.talend.com

Reply via email to