You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2012/03/19 18:56:40 UTC
svn commit: r1302574 - in
/cxf/trunk/api/src/main/java/org/apache/cxf/common/logging:
AbstractDelegatingLogger.java LogUtils.java Slf4jLogger.java
Author: dkulp
Date: Mon Mar 19 17:56:40 2012
New Revision: 1302574
URL: http://svn.apache.org/viewvc?rev=1302574&view=rev
Log:
[CXF-4180] Some work on the SLF4J loggers to help the performance a
little bit and allow it to be used in more cases.
Modified:
cxf/trunk/api/src/main/java/org/apache/cxf/common/logging/AbstractDelegatingLogger.java
cxf/trunk/api/src/main/java/org/apache/cxf/common/logging/LogUtils.java
cxf/trunk/api/src/main/java/org/apache/cxf/common/logging/Slf4jLogger.java
Modified: cxf/trunk/api/src/main/java/org/apache/cxf/common/logging/AbstractDelegatingLogger.java
URL: http://svn.apache.org/viewvc/cxf/trunk/api/src/main/java/org/apache/cxf/common/logging/AbstractDelegatingLogger.java?rev=1302574&r1=1302573&r2=1302574&view=diff
==============================================================================
--- cxf/trunk/api/src/main/java/org/apache/cxf/common/logging/AbstractDelegatingLogger.java (original)
+++ cxf/trunk/api/src/main/java/org/apache/cxf/common/logging/AbstractDelegatingLogger.java Mon Mar 19 17:56:40 2012
@@ -277,23 +277,45 @@ public abstract class AbstractDelegating
return level.intValue() >= l.intValue() && l != Level.OFF;
}
+ protected boolean supportsHandlers() {
+ return false;
+ }
+
public synchronized void addHandler(Handler handler) throws SecurityException {
+ if (supportsHandlers()) {
+ super.addHandler(handler);
+ return;
+ }
throw new UnsupportedOperationException();
}
public synchronized void removeHandler(Handler handler) throws SecurityException {
+ if (supportsHandlers()) {
+ super.removeHandler(handler);
+ return;
+ }
throw new UnsupportedOperationException();
}
public synchronized Handler[] getHandlers() {
+ if (supportsHandlers()) {
+ return super.getHandlers();
+ }
throw new UnsupportedOperationException();
}
public synchronized void setUseParentHandlers(boolean useParentHandlers) {
+ if (supportsHandlers()) {
+ super.setUseParentHandlers(useParentHandlers);
+ return;
+ }
throw new UnsupportedOperationException();
}
public synchronized boolean getUseParentHandlers() {
+ if (supportsHandlers()) {
+ return super.getUseParentHandlers();
+ }
throw new UnsupportedOperationException();
}
Modified: cxf/trunk/api/src/main/java/org/apache/cxf/common/logging/LogUtils.java
URL: http://svn.apache.org/viewvc/cxf/trunk/api/src/main/java/org/apache/cxf/common/logging/LogUtils.java?rev=1302574&r1=1302573&r2=1302574&view=diff
==============================================================================
--- cxf/trunk/api/src/main/java/org/apache/cxf/common/logging/LogUtils.java (original)
+++ cxf/trunk/api/src/main/java/org/apache/cxf/common/logging/LogUtils.java Mon Mar 19 17:56:40 2012
@@ -96,17 +96,38 @@ 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")) {
+ try {
+ // This Class.forName likely will barf in OSGi, but it's OK
+ // as we'll just use j.u.l and pax-logging will pick it up fine
+ // If we don't call this and there isn't a slf4j impl avail,
+ // you get warnings printed to stderr about NOPLoggers and such
+ Class.forName("org.slf4j.impl.StaticLoggerBinder");
+ Class<?> cls = Class.forName("org.slf4j.LoggerFactory");
+ Class<?> fcls = cls.getMethod("getILoggerFactory").invoke(null).getClass();
+ String clsName = fcls.getName();
+ if (clsName.contains("NOPLogger")) {
+ //no real slf4j implementation, use j.u.l
+ cname = null;
+ } else 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)) {
Modified: cxf/trunk/api/src/main/java/org/apache/cxf/common/logging/Slf4jLogger.java
URL: http://svn.apache.org/viewvc/cxf/trunk/api/src/main/java/org/apache/cxf/common/logging/Slf4jLogger.java?rev=1302574&r1=1302573&r2=1302574&view=diff
==============================================================================
--- cxf/trunk/api/src/main/java/org/apache/cxf/common/logging/Slf4jLogger.java (original)
+++ cxf/trunk/api/src/main/java/org/apache/cxf/common/logging/Slf4jLogger.java Mon Mar 19 17:56:40 2012
@@ -18,6 +18,7 @@
*/
package org.apache.cxf.common.logging;
+import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
@@ -52,6 +53,7 @@ public class Slf4jLogger extends Abstrac
private final org.slf4j.Logger logger;
private LocationAwareLogger locationAwareLogger;
+
public Slf4jLogger(String name, String resourceBundleName) {
super(name, resourceBundleName);
@@ -60,6 +62,10 @@ public class Slf4jLogger extends Abstrac
locationAwareLogger = (LocationAwareLogger) logger;
}
}
+ @Override
+ protected boolean supportsHandlers() {
+ return true;
+ }
@Override
public Level getLevel() {
@@ -83,11 +89,39 @@ public class Slf4jLogger extends Abstrac
}
@Override
+ public boolean isLoggable(Level level) {
+ final int i = level.intValue();
+ if (i == Level.OFF.intValue()) {
+ return false;
+ } else if (i >= Level.SEVERE.intValue()) {
+ return logger.isErrorEnabled();
+ } else if (i >= Level.WARNING.intValue()) {
+ return logger.isWarnEnabled();
+ } else if (i >= Level.INFO.intValue()) {
+ return logger.isInfoEnabled();
+ } else if (i >= Level.FINER.intValue()) {
+ return logger.isDebugEnabled();
+ }
+ return logger.isTraceEnabled();
+ }
+
+
+ @Override
protected void internalLogFormatted(String msg, LogRecord record) {
Level level = record.getLevel();
Throwable t = record.getThrown();
-
+
+ Handler targets[] = getHandlers();
+ if (targets != null) {
+ for (Handler h : targets) {
+ h.publish(record);
+ }
+ }
+ if (!getUseParentHandlers()) {
+ return;
+ }
+
/*
* As we can not use a "switch ... case" block but only a "if ... else if ..." block, the order of the
* comparisons is important. We first try log level FINE then INFO, WARN, FINER, etc