Skip to content

Commit

Permalink
Only generate blitz location info when using NFPatternLayout to avoid…
Browse files Browse the repository at this point in the history
… costly stack creation.
  • Loading branch information
jhspaybar committed Feb 19, 2017
1 parent 9a93186 commit d628735
Showing 1 changed file with 46 additions and 5 deletions.
51 changes: 46 additions & 5 deletions src/main/java/com/netflix/blitz4j/LoggingContext.java
Expand Up @@ -16,10 +16,17 @@

package com.netflix.blitz4j;

import java.util.Enumeration;
import java.util.concurrent.TimeUnit;

import com.netflix.logging.log4jAdapter.NFPatternLayout;
import org.apache.log4j.Appender;
import org.apache.log4j.Category;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.MDC;
import org.apache.log4j.helpers.AppenderAttachableImpl;
import org.apache.log4j.spi.AppenderAttachable;
import org.apache.log4j.spi.LocationInfo;
import org.apache.log4j.spi.LoggingEvent;

Expand Down Expand Up @@ -157,11 +164,14 @@ public LocationInfo generateLocationInfo(LoggingEvent event) {
}
LocationInfo locationInfo = null;
try {
locationInfo = (LocationInfo) LoggingContext
.getInstance()
.getLocationInfo(Class.forName(event.getFQNOfLoggerClass()));
if (locationInfo != null) {
MDC.put(LOCATION_INFO, locationInfo);
// We should only generate location info if the caller is using NFPatternLayout otherwise this is expensive and unused.
if (isUsingNFPatternLayout(event)) {
locationInfo = (LocationInfo) LoggingContext
.getInstance()
.getLocationInfo(Class.forName(event.getFQNOfLoggerClass()));
if (locationInfo != null) {
MDC.put(LOCATION_INFO, locationInfo);
}
}
} catch (Throwable e) {
if (CONFIGURATION !=null && CONFIGURATION
Expand All @@ -172,6 +182,37 @@ public LocationInfo generateLocationInfo(LoggingEvent event) {
return locationInfo;
}

private boolean isUsingNFPatternLayout(LoggingEvent event) {
final Category logger = event.getLogger();
return logger != null && isUsingNFPatternLayout(logger.getAllAppenders());

}

private boolean isUsingNFPatternLayout(Enumeration enumeration) {
if (enumeration == null) {
return false;
}

while(enumeration.hasMoreElements()) {
Object maybeAppender = enumeration.nextElement();
if (maybeAppender instanceof Appender) {
Appender a = (Appender) maybeAppender;
if (a.getLayout() instanceof NFPatternLayout) {
return true;
}
}

if (maybeAppender instanceof AppenderAttachable) {
AppenderAttachable aa = (AppenderAttachable) maybeAppender;
if (isUsingNFPatternLayout(aa.getAllAppenders())) {
return true;
}
}
}

return false;
}

/**
* Get the location information of the logging event. If the information has
* been cached it is retrieved from the MDC (for asynchronous events MDCs
Expand Down

0 comments on commit d628735

Please sign in to comment.