diff --git a/kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMS.java b/kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMS.java
index f67f68b..c83382d 100644
--- a/kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMS.java
+++ b/kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMS.java
@@ -116,8 +116,10 @@
   @Produces(MediaType.APPLICATION_JSON)
   @SuppressWarnings("unchecked")
   public Response createKey(Map jsonKey, @Context HttpServletRequest request) throws Exception {
-    try{
-      LOG.info("Entering createKey Method.");
+	try {
+	  if (LOG.isDebugEnabled()) {
+			LOG.debug("Entering createKey Method.");
+	  }
       KMSWebApp.getAdminCallsMeter().mark();
       UserGroupInformation user = HttpUserGroupInformation.get();
       final String name = (String) jsonKey.get(KMSRESTConstants.NAME_FIELD);
@@ -129,8 +131,10 @@
       material = (String) jsonKey.get(KMSRESTConstants.MATERIAL_FIELD);
       int length = (jsonKey.containsKey(KMSRESTConstants.LENGTH_FIELD)) ? (Integer) jsonKey.get(KMSRESTConstants.LENGTH_FIELD) : 0;
       String description = (String) jsonKey.get(KMSRESTConstants.DESCRIPTION_FIELD);
-      LOG.debug("Creating key with name {}, cipher being used{}, "
-      +"length of key {}, description of key {}", name, cipher,length, description);
+      if (LOG.isDebugEnabled()) {
+	      LOG.debug("Creating key with name {}, cipher being used{}, "
+	      +"length of key {}, description of key {}", name, cipher,length, description);
+      }
       Map<String, String> attributes = (Map<String, String>)
       jsonKey.get(KMSRESTConstants.ATTRIBUTES_FIELD);
       if (material != null) {
@@ -165,13 +169,15 @@
       String requestURL = KMSMDCFilter.getURL();
       int idx = requestURL.lastIndexOf(KMSRESTConstants.KEYS_RESOURCE);
       requestURL = requestURL.substring(0, idx);
-      LOG.info("Exiting createKey Method.");
+      if (LOG.isDebugEnabled()) {
+          LOG.debug("Exiting createKey Method.");
+      }
       return Response.created(getKeyURI(KMSRESTConstants.SERVICE_VERSION, name))
        .type(MediaType.APPLICATION_JSON)
        .header("Location", getKeyURI(requestURL, name)).entity(json).build();
     }
     catch (Exception e) {
-      LOG.debug("Exception in createKey.", e);
+      LOG.error("Exception in createKey.", e);
       throw e;
     }
   }
@@ -190,7 +196,9 @@
     public Response deleteKey(@PathParam("name") final String name, @Context HttpServletRequest request)
         throws Exception {
       try {
-        LOG.info("Entering deleteKey method.");
+        if (LOG.isDebugEnabled()) {
+          LOG.debug("Entering deleteKey method.");
+        }
         KMSWebApp.getAdminCallsMeter().mark();
         UserGroupInformation user = HttpUserGroupInformation.get();
         assertAccess(Type.DELETE, user, KMSOp.DELETE_KEY, name, request.getRemoteAddr());
@@ -205,10 +213,12 @@
           }
         });
         kmsAudit.ok(user, KMSOp.DELETE_KEY, name, "");
-        LOG.info("Exiting deleteKey method.");
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Exiting deleteKey method.");
+        }
         return Response.ok().build();
       } catch (Exception e) {
-        LOG.debug("Exception in deleteKey.", e);
+        LOG.error("Exception in deleteKey.", e);
         throw e;
         }
     }
@@ -219,7 +229,9 @@
   @Produces(MediaType.APPLICATION_JSON)
   public Response rolloverKey(@PathParam("name") final String name, Map jsonMaterial, @Context HttpServletRequest request) throws Exception {
     try {
-      LOG.info("Entering rolloverKey Method.");
+      if (LOG.isDebugEnabled()) {
+        LOG.debug("Entering rolloverKey Method.");
+      }
       KMSWebApp.getAdminCallsMeter().mark();
       UserGroupInformation user = HttpUserGroupInformation.get();
       assertAccess(Type.ROLLOVER, user, KMSOp.ROLL_NEW_VERSION, name, request.getRemoteAddr());
@@ -243,10 +255,12 @@
         keyVersion = removeKeyMaterial(keyVersion);
       }
       Map json = KMSUtil.toJSON(keyVersion);
-      LOG.info("Exiting rolloverKey Method.");
+      if (LOG.isDebugEnabled()) {
+          LOG.debug("Exiting rolloverKey Method.");
+      }
       return Response.ok().type(MediaType.APPLICATION_JSON).entity(json).build();
     } catch (Exception e) {
-      LOG.debug("Exception in rolloverKey.", e);
+      LOG.error("Exception in rolloverKey.", e);
       throw e;
     }
   }
@@ -255,7 +269,9 @@
   @Path(KMSRESTConstants.KEY_RESOURCE + "/{name:.*}/" + KMSRESTConstants.INVALIDATECACHE_RESOURCE)
   public Response invalidateCache(@PathParam("name") final String name) throws Exception {
     try {
-      LOG.info("Entering invalidateCache Method.");
+      if (LOG.isDebugEnabled()) {
+        LOG.debug("Entering invalidateCache Method.");
+      }
       KMSWebApp.getAdminCallsMeter().mark();
       checkNotEmpty(name, "name");
       UserGroupInformation user = HttpUserGroupInformation.get();
@@ -270,10 +286,12 @@
         }
       });
       kmsAudit.ok(user, KMSOp.INVALIDATE_CACHE, name, "");
-      LOG.info("Exiting invalidateCache for key name {}.", name);
+      if (LOG.isDebugEnabled()) {
+          LOG.debug("Exiting invalidateCache for key name {}.", name);
+      }
       return Response.ok().build();
     } catch (Exception e) {
-      LOG.debug("Exception in invalidateCache for key name {}.", name, e);
+      LOG.error("Exception in invalidateCache for key name {}.", name, e);
       throw e;
     }
   }
@@ -284,7 +302,9 @@
   public Response getKeysMetadata(@QueryParam(KMSRESTConstants.KEY)
       List<String> keyNamesList, @Context HttpServletRequest request) throws Exception {
     try {
-      LOG.info("Entering getKeysMetadata method.");
+      if (LOG.isDebugEnabled()) {
+        LOG.debug("Entering getKeysMetadata method.");
+      }
       KMSWebApp.getAdminCallsMeter().mark();
       UserGroupInformation user = HttpUserGroupInformation.get();
       final String[] keyNames = keyNamesList.toArray( new String[keyNamesList.size()]);
@@ -297,10 +317,12 @@
       });
       Object json = KMSServerJSONUtils.toJSON(keyNames, keysMeta);
       kmsAudit.ok(user, KMSOp.GET_KEYS_METADATA, "");
-      LOG.info("Exiting getKeysMetadata method.");
+      if (LOG.isDebugEnabled()) {
+          LOG.debug("Exiting getKeysMetadata method.");
+      }
       return Response.ok().type(MediaType.APPLICATION_JSON).entity(json).build();
     } catch (Exception e) {
-      LOG.debug("Exception in getKeysmetadata.", e);
+      LOG.error("Exception in getKeysmetadata.", e);
       throw e;
     }
   }
@@ -310,7 +332,9 @@
   @Produces(MediaType.APPLICATION_JSON)
   public Response getKeyNames(@Context HttpServletRequest request) throws Exception {
     try {
-      LOG.info("Entering getKeyNames method.");
+      if (LOG.isDebugEnabled()) {
+        LOG.debug("Entering getKeyNames method.");
+      }
       KMSWebApp.getAdminCallsMeter().mark();
       UserGroupInformation user = HttpUserGroupInformation.get();
       assertAccess(Type.GET_KEYS, user, KMSOp.GET_KEYS, request.getRemoteAddr());
@@ -321,10 +345,12 @@
         }
       });
       kmsAudit.ok(user, KMSOp.GET_KEYS, "");
-      LOG.info("Exiting getKeyNames method.");
+      if (LOG.isDebugEnabled()) {
+          LOG.debug("Exiting getKeyNames method.");
+      }
       return Response.ok().type(MediaType.APPLICATION_JSON).entity(json).build();
     } catch (Exception e) {
-      LOG.debug("Exception in getkeyNames.", e);
+      LOG.error("Exception in getkeyNames.", e);
       throw e;
     }
   }
@@ -334,12 +360,12 @@
   public Response getKey(@PathParam("name") String name, @Context HttpServletRequest request)
       throws Exception {
     try {
-      LOG.info("Entering getKey method.");
-      LOG.debug("Getting key information for key with name {}.", name);
-      LOG.info("Exiting getKey method.");
+      if (LOG.isDebugEnabled()) {
+        LOG.debug("Getting key information for key with name {}.", name);
+      }
       return getMetadata(name, request);
     } catch (Exception e) {
-      LOG.debug("Exception in getKey.", e);
+      LOG.error("Exception in getKey.", e);
       throw e;
     }
   }
@@ -351,7 +377,9 @@
   public Response getMetadata(@PathParam("name") final String name, @Context HttpServletRequest request)
       throws Exception {
     try {
-      LOG.info("Entering getMetadata method.");
+      if (LOG.isDebugEnabled()) {
+        LOG.debug("Entering getMetadata method.");
+      }
       UserGroupInformation user = HttpUserGroupInformation.get();
       checkNotEmpty(name, "name");
       KMSWebApp.getAdminCallsMeter().mark();
@@ -366,10 +394,12 @@
       });
       Object json = KMSServerJSONUtils.toJSON(name, metadata);
       kmsAudit.ok(user, KMSOp.GET_METADATA, name, "");
-      LOG.info("Exiting getMetadata method.");
+      if (LOG.isDebugEnabled()) {
+          LOG.debug("Exiting getMetadata method.");
+      }
       return Response.ok().type(MediaType.APPLICATION_JSON).entity(json).build();
     } catch (Exception e) {
-      LOG.debug("Exception in getMetadata.", e);
+      LOG.error("Exception in getMetadata.", e);
       throw e;
     }
   }
@@ -381,7 +411,9 @@
   public Response getCurrentVersion(@PathParam("name") final String name, @Context HttpServletRequest request)
       throws Exception {
     try {
-      LOG.info("Entering getCurrentVersion method.");
+      if (LOG.isDebugEnabled()) {
+        LOG.debug("Entering getCurrentVersion method.");
+      }
       UserGroupInformation user = HttpUserGroupInformation.get();
       checkNotEmpty(name, "name");
       KMSWebApp.getKeyCallsMeter().mark();
@@ -395,10 +427,12 @@
       });
       Object json = KMSUtil.toJSON(keyVersion);
       kmsAudit.ok(user, KMSOp.GET_CURRENT_KEY, name, "");
-      LOG.info("Exiting getCurrentVersion method.");
+      if (LOG.isDebugEnabled()) {
+        LOG.debug("Exiting getCurrentVersion method.");
+      }
       return Response.ok().type(MediaType.APPLICATION_JSON).entity(json).build();
     } catch (Exception e) {
-      LOG.debug("Exception in getCurrentVersion.", e);
+      LOG.error("Exception in getCurrentVersion.", e);
       throw e;
     }
   }
@@ -409,7 +443,9 @@
   public Response getKeyVersion(
       @PathParam("versionName") final String versionName, @Context HttpServletRequest request) throws Exception {
     try {
-      LOG.info("Entering getKeyVersion method.");
+      if (LOG.isDebugEnabled()) {
+        LOG.debug("Entering getKeyVersion method.");
+      }
       UserGroupInformation user = HttpUserGroupInformation.get();
       checkNotEmpty(versionName, "versionName");
       KMSWebApp.getKeyCallsMeter().mark();
@@ -425,10 +461,12 @@
         kmsAudit.ok(user, KMSOp.GET_KEY_VERSION, keyVersion.getName(), "");
       }
       Object json = KMSUtil.toJSON(keyVersion);
-      LOG.info("Exiting getKeyVersion method.");
+      if (LOG.isDebugEnabled()) {
+          LOG.debug("Exiting getKeyVersion method.");
+      }
       return Response.ok().type(MediaType.APPLICATION_JSON).entity(json).build();
     } catch (Exception e) {
-      LOG.debug("Exception in getKeyVersion.", e);
+      LOG.error("Exception in getKeyVersion.", e);
       throw e;
     }
   }
@@ -443,7 +481,9 @@
     @DefaultValue("1") @QueryParam(KMSRESTConstants.EEK_NUM_KEYS) final int numKeys,
     @Context HttpServletRequest request) throws Exception {
     try {
-      LOG.info("Entering generateEncryptedKeys method.");
+      if (LOG.isDebugEnabled()) {
+        LOG.debug("Entering generateEncryptedKeys method.");
+      }
       UserGroupInformation user = HttpUserGroupInformation.get();
       checkNotEmpty(name, "name");
       checkNotNull(edekOp, "eekOp");
@@ -485,10 +525,12 @@
         throw new IllegalArgumentException(error.toString());
       }
       KMSWebApp.getGenerateEEKCallsMeter().mark();
-      LOG.info("Exiting generateEncryptedKeys method.");
+      if (LOG.isDebugEnabled()) {
+          LOG.debug("Exiting generateEncryptedKeys method.");
+      }
       return Response.ok().type(MediaType.APPLICATION_JSON).entity(retJSON).build();
     } catch (Exception e) {
-      LOG.debug("Exception in generateEncryptedKeys.", e);
+      LOG.error("Exception in generateEncryptedKeys.", e);
       throw e;
     }
   }
@@ -503,7 +545,9 @@
         final List<Map> jsonPayload)
         throws Exception {
     try {
-      LOG.info("Entering reencryptEncryptedKeys method.");
+      if (LOG.isDebugEnabled()) {
+        LOG.debug("Entering reencryptEncryptedKeys method.");
+      }
       final Stopwatch sw = Stopwatch.createStarted();
       checkNotEmpty(name, "name");
       checkNotNull(jsonPayload, "jsonPayload");
@@ -533,10 +577,12 @@
       }
       kmsAudit.ok(user, KMSOp.REENCRYPT_EEK_BATCH, name,"reencrypted " + ekvs.size() + " keys");
       LOG.info("reencryptEncryptedKeys {} keys for key {} took {}", jsonPayload.size(), name, sw.stop());
-      LOG.info("Exiting reencryptEncryptedKeys method.");
+      if (LOG.isDebugEnabled()) {
+          LOG.debug("Exiting reencryptEncryptedKeys method.");
+      }
       return Response.ok().type(MediaType.APPLICATION_JSON).entity(retJSON).build();
     } catch (Exception e) {
-      LOG.debug("Exception in reencryptEncryptedKeys.", e);
+      LOG.error("Exception in reencryptEncryptedKeys.", e);
       throw e;
     }
   }
@@ -552,7 +598,9 @@
       Map jsonPayload, @Context HttpServletRequest request)
       throws Exception {
     try {
-      LOG.info("Entering decryptEncryptedKey method.");
+      if (LOG.isDebugEnabled()) {
+        LOG.debug("Entering handleEncryptedKeyOp method.");
+      }
       UserGroupInformation user = HttpUserGroupInformation.get();
       checkNotEmpty(versionName, "versionName");
       checkNotNull(eekOp, "eekOp");
@@ -600,10 +648,12 @@
         LOG.error(error.toString());
         throw new IllegalArgumentException(error.toString());
       }
-      LOG.info("Exiting handleEncryptedKeyOp method.");
+      if (LOG.isDebugEnabled()) {
+          LOG.debug("Exiting handleEncryptedKeyOp method.");
+      }
       return Response.ok().type(MediaType.APPLICATION_JSON).entity(retJSON).build();
     } catch (Exception e) {
-      LOG.debug("Exception in handleEncryptedKeyOp.", e);
+      LOG.error("Exception in handleEncryptedKeyOp.", e);
       throw e;
 }
   }
@@ -615,7 +665,9 @@
   public Response getKeyVersions(@PathParam("name") final String name, @Context HttpServletRequest request)
       throws Exception {
     try {
-      LOG.info("Entering getKeyVersions method.");
+      if (LOG.isDebugEnabled()) {
+        LOG.debug("Entering getKeyVersions method.");
+      }
       UserGroupInformation user = HttpUserGroupInformation.get();
       checkNotEmpty(name, "name");
       KMSWebApp.getKeyCallsMeter().mark();
@@ -629,10 +681,12 @@
       });
       Object json = KMSServerJSONUtils.toJSON(ret);
       kmsAudit.ok(user, KMSOp.GET_KEY_VERSIONS, name, "");
-      LOG.info("Exiting getKeyVersions method.");
+      if (LOG.isDebugEnabled()) {
+          LOG.debug("Exiting getKeyVersions method.");
+      }
       return Response.ok().type(MediaType.APPLICATION_JSON).entity(json).build();
     } catch (Exception e) {
-      LOG.debug("Exception in getKeyVersions.", e);
+        LOG.error("Exception in getKeyVersions.", e);
       throw e;
     }
    }
