diff --git a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/AsyncProxyServlet.java b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/AsyncProxyServlet.java
index 6ebc85c..518051d 100644
--- a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/AsyncProxyServlet.java
+++ b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/AsyncProxyServlet.java
@@ -60,7 +60,8 @@
     {
         try
         {
-            _log.debug("{} proxying content to downstream: {} bytes", getRequestId(request), length);
+            if (_log.isDebugEnabled())
+                _log.debug("{} proxying content to downstream: {} bytes", getRequestId(request), length);
             StreamWriter writeListener = (StreamWriter)request.getAttribute(WRITE_LISTENER_ATTRIBUTE);
             if (writeListener == null)
             {
@@ -130,24 +131,30 @@
         {
             int requestId = getRequestId(request);
             ServletInputStream input = request.getInputStream();
-            _log.debug("{} asynchronous read start on {}", requestId, input);
+            if (_log.isDebugEnabled())
+                _log.debug("{} asynchronous read start on {}", requestId, input);
 
             // First check for isReady() because it has
             // side effects, and then for isFinished().
             while (input.isReady() && !input.isFinished())
             {
                 int read = input.read(buffer);
-                _log.debug("{} asynchronous read {} bytes on {}", requestId, read, input);
+                if (_log.isDebugEnabled())
+                    _log.debug("{} asynchronous read {} bytes on {}", requestId, read, input);
                 if (read > 0)
                 {
-                    _log.debug("{} proxying content to upstream: {} bytes", requestId, read);
+                    if (_log.isDebugEnabled())
+                        _log.debug("{} proxying content to upstream: {} bytes", requestId, read);
                     onRequestContent(proxyRequest, request, provider, buffer, 0, read, this);
                     // Do not call isReady() so that we can apply backpressure.
                     break;
                 }
             }
             if (!input.isFinished())
-                _log.debug("{} asynchronous read pending on {}", requestId, input);
+            {
+                if (_log.isDebugEnabled())
+                    _log.debug("{} asynchronous read pending on {}", requestId, input);
+            }
         }
 
         protected void onRequestContent(Request proxyRequest, HttpServletRequest request, DeferredContentProvider provider, byte[] buffer, int offset, int length, Callback callback)
@@ -158,7 +165,8 @@
         @Override
         public void onAllDataRead() throws IOException
         {
-            _log.debug("{} proxying content to upstream completed", getRequestId(request));
+            if (_log.isDebugEnabled())
+                _log.debug("{} proxying content to upstream completed", getRequestId(request));
             provider.close();
         }
 
@@ -225,23 +233,27 @@
             if (state == WriteState.READY)
             {
                 // There is data to write.
-                _log.debug("{} asynchronous write start of {} bytes on {}", requestId, length, output);
+                if (_log.isDebugEnabled())
+                    _log.debug("{} asynchronous write start of {} bytes on {}", requestId, length, output);
                 output.write(buffer, offset, length);
                 state = WriteState.PENDING;
                 if (output.isReady())
                 {
-                    _log.debug("{} asynchronous write of {} bytes completed on {}", requestId, length, output);
+                    if (_log.isDebugEnabled())
+                        _log.debug("{} asynchronous write of {} bytes completed on {}", requestId, length, output);
                     complete();
                 }
                 else
                 {
-                    _log.debug("{} asynchronous write of {} bytes pending on {}", requestId, length, output);
+                    if (_log.isDebugEnabled())
+                        _log.debug("{} asynchronous write of {} bytes pending on {}", requestId, length, output);
                 }
             }
             else if (state == WriteState.PENDING)
             {
                 // The write blocked but is now complete.
-                _log.debug("{} asynchronous write of {} bytes completing on {}", requestId, length, output);
+                if (_log.isDebugEnabled())
+                    _log.debug("{} asynchronous write of {} bytes completing on {}", requestId, length, output);
                 complete();
             }
             else
diff --git a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/BalancerServlet.java b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/BalancerServlet.java
index fed4bf4..ff4ae86 100644
--- a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/BalancerServlet.java
+++ b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/BalancerServlet.java
@@ -26,7 +26,6 @@
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicLong;
-
 import javax.servlet.ServletException;
 import javax.servlet.UnavailableException;
 import javax.servlet.http.Cookie;
@@ -133,7 +132,8 @@
     protected URI rewriteURI(HttpServletRequest request)
     {
         BalancerMember balancerMember = selectBalancerMember(request);
-        _log.debug("Selected {}", balancerMember);
+        if (_log.isDebugEnabled())
+            _log.debug("Selected {}", balancerMember);
         String path = request.getRequestURI();
         String query = request.getQueryString();
         if (query != null)
diff --git a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/ProxyConnection.java b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/ProxyConnection.java
index 5eb72ec..3a620f4 100644
--- a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/ProxyConnection.java
+++ b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/ProxyConnection.java
@@ -119,7 +119,8 @@
             }
             catch (IOException x)
             {
-                LOG.debug(ProxyConnection.this + " could not fill", x);
+                if (LOG.isDebugEnabled())
+                    LOG.debug(ProxyConnection.this + " could not fill", x);
                 disconnect();
                 return Action.SUCCEEDED;
             }
diff --git a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/ProxyServlet.java b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/ProxyServlet.java
index 367badf..ed00af2 100644
--- a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/ProxyServlet.java
+++ b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/ProxyServlet.java
@@ -32,7 +32,6 @@
 import java.util.concurrent.Executor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
-
 import javax.servlet.AsyncContext;
 import javax.servlet.ServletConfig;
 import javax.servlet.ServletContext;
@@ -52,7 +51,6 @@
 import org.eclipse.jetty.http.HttpHeader;
 import org.eclipse.jetty.http.HttpHeaderValue;
 import org.eclipse.jetty.http.HttpVersion;
-import org.eclipse.jetty.server.HttpConnection;
 import org.eclipse.jetty.util.Callback;
 import org.eclipse.jetty.util.HttpCookieStore;
 import org.eclipse.jetty.util.log.Log;
@@ -203,7 +201,8 @@
         }
         catch (Exception x)
         {
-            _log.debug(x);
+            if (_log.isDebugEnabled())
+                _log.debug(x);
         }
     }
 
@@ -364,7 +363,8 @@
         {
             if (!_whiteList.contains(hostPort))
             {
-                _log.debug("Host {}:{} not whitelisted", host, port);
+                if (_log.isDebugEnabled())
+                    _log.debug("Host {}:{} not whitelisted", host, port);
                 return false;
             }
         }
@@ -372,7 +372,8 @@
         {
             if (_blackList.contains(hostPort))
             {
-                _log.debug("Host {}:{} blacklisted", host, port);
+                if (_log.isDebugEnabled())
+                    _log.debug("Host {}:{} blacklisted", host, port);
                 return false;
             }
         }
@@ -391,7 +392,8 @@
             StringBuffer uri = request.getRequestURL();
             if (request.getQueryString() != null)
                 uri.append("?").append(request.getQueryString());
-            _log.debug("{} rewriting: {} -> {}", requestId, uri, rewrittenURI);
+            if (_log.isDebugEnabled())
+                _log.debug("{} rewriting: {} -> {}", requestId, uri, rewrittenURI);
         }
 
         if (rewrittenURI == null)
@@ -495,7 +497,8 @@
 
     protected void onClientRequestFailure(Request proxyRequest, HttpServletRequest request, Throwable failure)
     {
-        _log.debug(getRequestId(request) + " client request failure", failure);
+        if (_log.isDebugEnabled())
+            _log.debug(getRequestId(request) + " client request failure", failure);
         proxyRequest.abort(failure);
     }
 
@@ -538,7 +541,8 @@
     {
         try
         {
-            _log.debug("{} proxying content to downstream: {} bytes", getRequestId(request), length);
+            if (_log.isDebugEnabled())
+                _log.debug("{} proxying content to downstream: {} bytes", getRequestId(request), length);
             response.getOutputStream().write(buffer, offset, length);
             callback.succeeded();
         }
@@ -550,27 +554,30 @@
 
     protected void onResponseSuccess(HttpServletRequest request, HttpServletResponse response, Response proxyResponse)
     {
-        _log.debug("{} proxying successful", getRequestId(request));
+        if (_log.isDebugEnabled())
+            _log.debug("{} proxying successful", getRequestId(request));
         AsyncContext asyncContext = request.getAsyncContext();
         asyncContext.complete();
     }
 
     protected void onResponseFailure(HttpServletRequest request, HttpServletResponse response, Response proxyResponse, Throwable failure)
     {
-        _log.debug(getRequestId(request) + " proxying failed", failure);
+        if (_log.isDebugEnabled())
+            _log.debug(getRequestId(request) + " proxying failed", failure);
         if (response.isCommitted())
         {
-            // Use Jetty specific behavior to close connection
             try
             {
+                // Use Jetty specific behavior to close connection.
                 response.sendError(-1);
+                AsyncContext asyncContext = request.getAsyncContext();
+                asyncContext.complete();
             }
-            catch (IOException e)
+            catch (IOException x)
             {
-                getServletContext().log("close failed", e);
+                if (_log.isDebugEnabled())
+                    _log.debug(getRequestId(request) + " could not close the connection", failure);
             }
-            AsyncContext asyncContext = request.getAsyncContext();
-            asyncContext.complete();
         }
         else
         {
@@ -687,7 +694,8 @@
             String contextPath = config.getServletContext().getContextPath();
             _prefix = _prefix == null ? contextPath : (contextPath + _prefix);
 
-            proxyServlet._log.debug(config.getServletName() + " @ " + _prefix + " to " + _proxyTo);
+            if (proxyServlet._log.isDebugEnabled())
+                proxyServlet._log.debug(config.getServletName() + " @ " + _prefix + " to " + _proxyTo);
         }
 
         protected URI rewriteURI(HttpServletRequest request)
@@ -807,7 +815,8 @@
                 onResponseSuccess(request, response, result.getResponse());
             else
                 onResponseFailure(request, response, result.getResponse(), result.getFailure());
-            _log.debug("{} proxying complete", getRequestId(request));
+            if (_log.isDebugEnabled())
+                _log.debug("{} proxying complete", getRequestId(request));
         }
     }
 
@@ -832,7 +841,8 @@
         @Override
         protected ByteBuffer onRead(byte[] buffer, int offset, int length)
         {
-            _log.debug("{} proxying content to upstream: {} bytes", getRequestId(request), length);
+            if (_log.isDebugEnabled())
+                _log.debug("{} proxying content to upstream: {} bytes", getRequestId(request), length);
             return onRequestContent(proxyRequest, request, buffer, offset, length);
         }
 
