You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by re...@apache.org on 2024/02/12 10:23:50 UTC

(tomcat) branch 10.1.x updated: Localization for debug strings

This is an automated email from the ASF dual-hosted git repository.

remm pushed a commit to branch 10.1.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/10.1.x by this push:
     new 9b34da5946 Localization for debug strings
9b34da5946 is described below

commit 9b34da5946eecbf19cdd9aab0fd580ec059b79f9
Author: remm <re...@apache.org>
AuthorDate: Mon Feb 12 11:19:54 2024 +0100

    Localization for debug strings
    
    Since debug is now more significant.
---
 .../catalina/authenticator/AuthenticatorBase.java  | 33 +++++++++---------
 .../catalina/authenticator/FormAuthenticator.java  | 40 +++++++++++-----------
 .../catalina/authenticator/LocalStrings.properties | 12 +++++++
 .../authenticator/NonLoginAuthenticator.java       |  4 +--
 .../catalina/authenticator/SSLAuthenticator.java   |  8 ++---
 .../apache/catalina/connector/CoyoteAdapter.java   |  4 +--
 java/org/apache/catalina/core/ContainerBase.java   |  2 +-
 .../apache/catalina/core/LocalStrings.properties   |  6 ++++
 .../catalina/core/NamingContextListener.java       | 16 +++++----
 .../core/ThreadLocalLeakPreventionListener.java    |  4 ++-
 .../catalina/filters/CsrfPreventionFilter.java     | 40 ++++++++++------------
 .../catalina/filters/LocalStrings.properties       |  4 +++
 .../catalina/ha/session/ClusterManagerBase.java    |  4 ++-
 .../catalina/ha/session/LocalStrings.properties    |  2 ++
 .../apache/catalina/ha/tcp/LocalStrings.properties |  3 ++
 .../apache/catalina/ha/tcp/SimpleTcpCluster.java   |  8 ++---
 .../mbeans/GlobalResourcesLifecycleListener.java   |  2 +-
 .../apache/catalina/mbeans/LocalStrings.properties |  1 +
 .../catalina/realm/JAASMemoryLoginModule.java      |  2 +-
 java/org/apache/catalina/realm/JNDIRealm.java      |  8 ++---
 .../apache/catalina/realm/LocalStrings.properties  |  2 ++
 java/org/apache/catalina/realm/RealmBase.java      |  2 +-
 java/org/apache/catalina/session/FileStore.java    |  2 +-
 .../catalina/session/LocalStrings.properties       |  3 ++
 java/org/apache/catalina/session/ManagerBase.java  |  8 ++---
 .../apache/catalina/session/StandardManager.java   |  4 +--
 java/org/apache/catalina/startup/Catalina.java     |  8 ++---
 .../org/apache/catalina/startup/ContextConfig.java |  7 ++--
 .../startup/CopyParentClassLoaderRule.java         |  4 +--
 java/org/apache/catalina/startup/HostConfig.java   |  4 +--
 .../catalina/startup/LocalStrings.properties       |  8 +++++
 .../group/interceptors/LocalStrings.properties     |  1 +
 .../group/interceptors/TcpFailureDetector.java     |  2 +-
 .../group/interceptors/TcpPingInterceptor.java     |  4 +--
 .../tribes/membership/LocalStrings.properties      |  6 ++++
 .../tribes/membership/McastServiceImpl.java        | 18 ++++++----
 .../tribes/tipis/AbstractReplicatedMap.java        | 12 +++----
 .../catalina/tribes/tipis/LocalStrings.properties  |  6 +++-
 .../catalina/tribes/tipis/ReplicatedMap.java       |  2 +-
 .../tribes/transport/LocalStrings.properties       |  1 +
 .../catalina/tribes/transport/ReceiverBase.java    |  2 +-
 .../tribes/transport/nio/LocalStrings.properties   |  3 ++
 .../catalina/tribes/transport/nio/NioReceiver.java | 10 +++---
 .../tribes/transport/nio/NioReplicationTask.java   |  2 +-
 .../tribes/transport/nio/ParallelNioSender.java    |  2 +-
 .../catalina/users/DataSourceUserDatabase.java     |  6 ++--
 .../apache/catalina/users/LocalStrings.properties  |  1 +
 .../apache/catalina/valves/ErrorReportValve.java   |  2 +-
 .../catalina/valves/ExtendedAccessLogValve.java    |  4 +--
 .../catalina/valves/JsonErrorReportValve.java      |  2 +-
 .../catalina/valves/LoadBalancerDrainingValve.java |  5 ++-
 .../apache/catalina/valves/LocalStrings.properties |  7 ++++
 .../catalina/valves/ProxyErrorReportValve.java     |  2 +-
 .../catalina/valves/StuckThreadDetectionValve.java |  2 +-
 .../valves/rewrite/LocalStrings.properties         |  2 ++
 .../catalina/valves/rewrite/RewriteValve.java      |  9 ++---
 java/org/apache/coyote/AbstractProcessor.java      |  2 +-
 java/org/apache/coyote/LocalStrings.properties     |  1 +
 java/org/apache/coyote/ajp/AjpProcessor.java       |  4 +--
 java/org/apache/coyote/ajp/LocalStrings.properties |  2 ++
 .../coyote/http11/filters/GzipOutputFilter.java    |  4 ++-
 .../coyote/http11/filters/LocalStrings.properties  |  2 ++
 java/org/apache/jasper/JspC.java                   | 11 +++---
 java/org/apache/jasper/compiler/AntCompiler.java   |  3 +-
 java/org/apache/jasper/compiler/Compiler.java      |  3 +-
 java/org/apache/jasper/compiler/JDTCompiler.java   |  3 +-
 java/org/apache/jasper/compiler/JspReader.java     |  2 +-
 .../optimizations/ELInterpreterTagSetters.java     | 19 +++++-----
 .../jasper/resources/LocalStrings.properties       |  9 +++++
 .../apache/tomcat/util/buf/LocalStrings.properties |  3 ++
 java/org/apache/tomcat/util/buf/StringCache.java   |  6 ++--
 java/org/apache/tomcat/util/digester/Digester.java |  2 +-
 .../tomcat/util/digester/FactoryCreateRule.java    |  8 ++---
 .../tomcat/util/digester/LocalStrings.properties   |  1 +
 .../tomcat/util/http/LocalStrings.properties       |  1 +
 .../tomcat/util/http/Rfc6265CookieProcessor.java   |  2 +-
 .../tomcat/util/modeler/LocalStrings.properties    |  3 ++
 java/org/apache/tomcat/util/modeler/Registry.java  |  7 ++--
 .../tomcat/util/threads/LocalStrings.properties    |  2 ++
 .../org/apache/tomcat/util/threads/TaskThread.java |  4 ++-
 80 files changed, 284 insertions(+), 188 deletions(-)

diff --git a/java/org/apache/catalina/authenticator/AuthenticatorBase.java b/java/org/apache/catalina/authenticator/AuthenticatorBase.java
index b6604d4b9e..e52fa2f109 100644
--- a/java/org/apache/catalina/authenticator/AuthenticatorBase.java
+++ b/java/org/apache/catalina/authenticator/AuthenticatorBase.java
@@ -441,8 +441,8 @@ public abstract class AuthenticatorBase extends ValveBase implements Authenticat
     @Override
     public void invoke(Request request, Response response) throws IOException, ServletException {
 
-        if (log.isDebugEnabled()) {
-            log.debug("Security checking request " + request.getMethod() + " " + request.getRequestURI());
+        if (log.isTraceEnabled()) {
+            log.trace("Security checking request " + request.getMethod() + " " + request.getRequestURI());
         }
 
         // Have we got a cached authenticated Principal to record?
@@ -453,8 +453,8 @@ public abstract class AuthenticatorBase extends ValveBase implements Authenticat
                 if (session != null) {
                     principal = session.getPrincipal();
                     if (principal != null) {
-                        if (log.isDebugEnabled()) {
-                            log.debug("We have cached auth type " + session.getAuthType() + " for principal " +
+                        if (log.isTraceEnabled()) {
+                            log.trace("We have cached auth type " + session.getAuthType() + " for principal " +
                                     principal);
                         }
                         request.setAuthType(session.getAuthType());
@@ -476,8 +476,8 @@ public abstract class AuthenticatorBase extends ValveBase implements Authenticat
         }
 
         if (constraints == null && !context.getPreemptiveAuthentication() && !authRequired) {
-            if (log.isDebugEnabled()) {
-                log.debug("Not subject to any constraint");
+            if (log.isTraceEnabled()) {
+                log.trace("Not subject to any constraint");
             }
             getNext().invoke(request, response);
             return;
@@ -503,7 +503,7 @@ public abstract class AuthenticatorBase extends ValveBase implements Authenticat
             }
             if (!realm.hasUserDataPermission(request, response, constraints)) {
                 if (log.isDebugEnabled()) {
-                    log.debug("Failed hasUserDataPermission() test");
+                    log.debug(sm.getString("authenticator.userDataPermissionFail"));
                 }
                 /*
                  * ASSERT: Authenticator already set the appropriate HTTP status code, so we do not have to do anything
@@ -542,7 +542,7 @@ public abstract class AuthenticatorBase extends ValveBase implements Authenticat
 
         if ((authRequired || constraints != null) && allowCorsPreflightBypass(request)) {
             if (log.isDebugEnabled()) {
-                log.debug("CORS Preflight request bypassing authentication");
+                log.debug(sm.getString("authenticator.corsBypass"));
             }
             getNext().invoke(request, response);
             return;
@@ -563,7 +563,7 @@ public abstract class AuthenticatorBase extends ValveBase implements Authenticat
             if (jaspicProvider == null && !doAuthenticate(request, response) ||
                     jaspicProvider != null && !authenticateJaspic(request, response, jaspicState, false)) {
                 if (log.isDebugEnabled()) {
-                    log.debug("Failed authenticate() test");
+                    log.debug(sm.getString("authenticator.authenticationFail"));
                 }
                 /*
                  * ASSERT: Authenticator already set the appropriate HTTP status code, so we do not have to do anything
@@ -580,7 +580,7 @@ public abstract class AuthenticatorBase extends ValveBase implements Authenticat
             }
             if (!realm.hasResourcePermission(request, response, constraints, this.context)) {
                 if (log.isDebugEnabled()) {
-                    log.debug("Failed accessControl() test");
+                    log.debug(sm.getString("authenticator.userPermissionFail", request.getUserPrincipal().getName()));
                 }
                 /*
                  * ASSERT: AccessControl method has already set the appropriate HTTP status code, so we do not have to
@@ -813,8 +813,8 @@ public abstract class AuthenticatorBase extends ValveBase implements Authenticat
 
         if (authStatus == AuthStatus.SUCCESS) {
             GenericPrincipal principal = getPrincipal(client);
-            if (log.isDebugEnabled()) {
-                log.debug("Authenticated user: " + principal);
+            if (log.isTraceEnabled()) {
+                log.trace("Authenticated user: " + principal);
             }
             if (principal == null) {
                 request.setUserPrincipal(null);
@@ -975,8 +975,7 @@ public abstract class AuthenticatorBase extends ValveBase implements Authenticat
             associate(ssoId, request.getSessionInternal(true));
 
             if (log.isDebugEnabled()) {
-                log.debug("Reauthenticated cached principal '" + request.getUserPrincipal().getName() +
-                        "' with auth type '" + request.getAuthType() + "'");
+                log.debug(sm.getString("authenticator.reauthentication", request.getUserPrincipal().getName(), request.getAuthType()));
             }
         }
 
@@ -1018,7 +1017,7 @@ public abstract class AuthenticatorBase extends ValveBase implements Authenticat
 
         if (log.isDebugEnabled()) {
             String name = (principal == null) ? "none" : principal.getName();
-            log.debug("Authenticated '" + name + "' with type '" + authType + "'");
+            log.debug(sm.getString("authenticator.authentication", name, authType));
         }
 
         // Cache the authentication information in our request
@@ -1221,9 +1220,9 @@ public abstract class AuthenticatorBase extends ValveBase implements Authenticat
         }
         if (log.isDebugEnabled()) {
             if (sso != null) {
-                log.debug("Found SingleSignOn Valve at " + sso);
+                log.debug(sm.getString("authenticator.sso", sso));
             } else {
-                log.debug("No SingleSignOn Valve is present");
+                log.trace("No SingleSignOn Valve is present");
             }
         }
 
diff --git a/java/org/apache/catalina/authenticator/FormAuthenticator.java b/java/org/apache/catalina/authenticator/FormAuthenticator.java
index 7473a56d1b..0513ddfb27 100644
--- a/java/org/apache/catalina/authenticator/FormAuthenticator.java
+++ b/java/org/apache/catalina/authenticator/FormAuthenticator.java
@@ -165,14 +165,14 @@ public class FormAuthenticator extends AuthenticatorBase {
         // Have we authenticated this user before but have caching disabled?
         if (!cache) {
             session = request.getSessionInternal(true);
-            if (log.isDebugEnabled()) {
-                log.debug("Checking for reauthenticate in session " + session);
+            if (log.isTraceEnabled()) {
+                log.trace("Checking for reauthenticate in session " + session);
             }
             String username = (String) session.getNote(Constants.SESS_USERNAME_NOTE);
             String password = (String) session.getNote(Constants.SESS_PASSWORD_NOTE);
             if (username != null && password != null) {
-                if (log.isDebugEnabled()) {
-                    log.debug("Reauthenticating username '" + username + "'");
+                if (log.isTraceEnabled()) {
+                    log.trace("Reauthenticating username '" + username + "'");
                 }
                 principal = context.getRealm().authenticate(username, password);
                 if (principal != null) {
@@ -182,7 +182,7 @@ public class FormAuthenticator extends AuthenticatorBase {
                     }
                 }
                 if (log.isDebugEnabled()) {
-                    log.debug("Reauthentication failed, proceed normally");
+                    log.debug(sm.getString("formAuthenticator.reauthFailed"));
                 }
             }
         }
@@ -191,17 +191,17 @@ public class FormAuthenticator extends AuthenticatorBase {
         // authentication? If so, forward the *original* request instead.
         if (matchRequest(request)) {
             session = request.getSessionInternal(true);
-            if (log.isDebugEnabled()) {
-                log.debug("Restore request from session '" + session.getIdInternal() + "'");
+            if (log.isTraceEnabled()) {
+                log.trace("Restore request from session '" + session.getIdInternal() + "'");
             }
             if (restoreRequest(request, session)) {
-                if (log.isDebugEnabled()) {
-                    log.debug("Proceed to restored request");
+                if (log.isTraceEnabled()) {
+                    log.trace("Proceed to restored request");
                 }
                 return true;
             } else {
                 if (log.isDebugEnabled()) {
-                    log.debug("Restore of original request failed");
+                    log.debug(sm.getString("formAuthenticator.restoreFailed"));
                 }
                 response.sendError(HttpServletResponse.SC_BAD_REQUEST);
                 return false;
@@ -240,13 +240,13 @@ public class FormAuthenticator extends AuthenticatorBase {
             }
 
             session = request.getSessionInternal(true);
-            if (log.isDebugEnabled()) {
-                log.debug("Save request in session '" + session.getIdInternal() + "'");
+            if (log.isTraceEnabled()) {
+                log.trace("Save request in session '" + session.getIdInternal() + "'");
             }
             try {
                 saveRequest(request, session);
             } catch (IOException ioe) {
-                log.debug("Request body too big to save during authentication");
+                log.debug(sm.getString("authenticator.requestBodyTooBig"));
                 response.sendError(HttpServletResponse.SC_FORBIDDEN, sm.getString("authenticator.requestBodyTooBig"));
                 return false;
             }
@@ -263,8 +263,8 @@ public class FormAuthenticator extends AuthenticatorBase {
         }
         String username = request.getParameter(Constants.FORM_USERNAME);
         String password = request.getParameter(Constants.FORM_PASSWORD);
-        if (log.isDebugEnabled()) {
-            log.debug("Authenticating username '" + username + "'");
+        if (log.isTraceEnabled()) {
+            log.trace("Authenticating username '" + username + "'");
         }
         principal = realm.authenticate(username, password);
         if (principal == null) {
@@ -272,8 +272,8 @@ public class FormAuthenticator extends AuthenticatorBase {
             return false;
         }
 
-        if (log.isDebugEnabled()) {
-            log.debug("Authentication of '" + username + "' was successful");
+        if (log.isTraceEnabled()) {
+            log.trace("Authentication of '" + username + "' was successful");
         }
 
         if (session == null) {
@@ -292,7 +292,7 @@ public class FormAuthenticator extends AuthenticatorBase {
         }
         if (session == null) {
             if (containerLog.isDebugEnabled()) {
-                containerLog.debug("User took so long to log on the session expired");
+                containerLog.debug(sm.getString("formAuthenticator.sessionExpired"));
             }
             if (landingPage == null) {
                 response.sendError(HttpServletResponse.SC_REQUEST_TIMEOUT,
@@ -316,8 +316,8 @@ public class FormAuthenticator extends AuthenticatorBase {
         // Redirect the user to the original request URI (which will cause
         // the original request to be restored)
         requestURI = savedRequestURL(session);
-        if (log.isDebugEnabled()) {
-            log.debug("Redirecting to original '" + requestURI + "'");
+        if (log.isTraceEnabled()) {
+            log.trace("Redirecting to original '" + requestURI + "'");
         }
         if (requestURI == null) {
             if (landingPage == null) {
diff --git a/java/org/apache/catalina/authenticator/LocalStrings.properties b/java/org/apache/catalina/authenticator/LocalStrings.properties
index d66d2f2492..4909ee1967 100644
--- a/java/org/apache/catalina/authenticator/LocalStrings.properties
+++ b/java/org/apache/catalina/authenticator/LocalStrings.properties
@@ -13,12 +13,15 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+authenticator.authentication=Authenticated principal [{0}] with authentication type [{1}]
+authenticator.authenticationFail=User authentication failure
 authenticator.certificates=No client certificate chain in this request
 authenticator.changeSessionId=Session ID changed on authentication from [{0}] to [{1}]
 authenticator.check.authorize=User name [{0}] obtained from the Connector and trusted to be valid. Obtaining roles for this user from the Tomcat Realm.
 authenticator.check.authorizeFail=Realm did not recognise user [{0}]. Creating a Principal with that name and no roles.
 authenticator.check.found=Already authenticated [{0}]
 authenticator.check.sso=Not authenticated but SSO session ID [{0}] found. Attempting re-authentication.
+authenticator.corsBypass=CORS Preflight request bypassing authentication
 authenticator.formlogin=Invalid direct reference to form login page
 authenticator.jaspicCleanSubjectFail=Failed to clean JASPIC subject
 authenticator.jaspicSecureResponseFail=Failed to secure response during JASPIC processing
@@ -27,10 +30,14 @@ authenticator.loginFail=Login failed
 authenticator.manager=Exception initializing trust managers
 authenticator.noAuthHeader=No authorization header sent by client
 authenticator.notContext=Configuration error:  Must be attached to a Context
+authenticator.reauthentication=Reauthenticated cached principal [{0}] with authentication type [{1}]
 authenticator.requestBodyTooBig=The request body was too large to be cached during the authentication process
 authenticator.sessionExpired=The time allowed for the login process has been exceeded. If you wish to continue you must either click back twice and re-click the link you requested or close and re-open your browser
+authenticator.sso=Found SSO [{0}]
 authenticator.tomcatPrincipalLogoutFail=Logout with TomcatPrincipal instance has failed
 authenticator.unauthorized=Cannot authenticate with the provided credentials
+authenticator.userDataPermissionFail=User data does not comply with the constraints of the resource
+authenticator.userPermissionFail=User [{0}] does not have authorization to access the resource
 
 basicAuthenticator.invalidAuthorization=Invalid Authorization: [{0}]
 basicAuthenticator.invalidCharset=The only permitted values are null, the empty string or UTF-8
@@ -47,6 +54,9 @@ formAuthenticator.forwardLogin=Forwarding request for [{0}] made with method [{1
 formAuthenticator.forwardLoginFail=Unexpected error forwarding to login page
 formAuthenticator.noErrorPage=No error page was defined for FORM authentication in context [{0}]
 formAuthenticator.noLoginPage=No login page was defined for FORM authentication in context [{0}]
+formAuthenticator.reauthFailed=Reauthentication failed, proceeding with regular authentication
+formAuthenticator.restoreFailed=Restoring the original request failed
+formAuthenticator.sessionExpired=Client inactivity caused the session to expire during authentication
 formAuthenticator.sessionIdMismatch=Current session ID is [{0}] but FORM authenticator was expecting [{1}]
 
 singleSignOn.debug.associate=SSO associating application session [{1}] with SSO session [{0}]
@@ -79,4 +89,6 @@ spnegoAuthenticator.serviceLoginFail=Unable to login as the service principal
 spnegoAuthenticator.ticketValidateFail=Failed to validate client supplied ticket
 
 sslAuthenticatorValve.http2=The context [{0}] in virtual host [{1}] is configured to use CLIENT-CERT authentication and [{2}] is configured to support HTTP/2. Use of CLIENT-CERT authentication is not compatible with the use of HTTP/2.
+sslAuthenticatorValve.noCertificates=No certificates are included with this request
+sslAuthenticatorValve.authFailed=Authentication with the provided certificates failed
 sslAuthenticatorValve.tls13=The context [{0}] in virtual host [{1}] is configured to use CLIENT-CERT authentication and [{2}] is configured to support TLS 1.3 using JSSE. Use of CLIENT-CERT authentication is not compatible with the use of TLS 1.3 and JSSE.
diff --git a/java/org/apache/catalina/authenticator/NonLoginAuthenticator.java b/java/org/apache/catalina/authenticator/NonLoginAuthenticator.java
index ac786a347c..2cf878f867 100644
--- a/java/org/apache/catalina/authenticator/NonLoginAuthenticator.java
+++ b/java/org/apache/catalina/authenticator/NonLoginAuthenticator.java
@@ -90,8 +90,8 @@ public final class NonLoginAuthenticator extends AuthenticatorBase {
         // to say the user is now authenticated because access to
         // protected resources will only be allowed with a matching role.
         // i.e. SC_FORBIDDEN (403 status) will be generated later.
-        if (containerLog.isDebugEnabled()) {
-            containerLog.debug("User authenticated without any roles");
+        if (containerLog.isTraceEnabled()) {
+            containerLog.trace("User authenticated without any roles");
         }
         return true;
     }
diff --git a/java/org/apache/catalina/authenticator/SSLAuthenticator.java b/java/org/apache/catalina/authenticator/SSLAuthenticator.java
index 5b1c51910c..b3df81c9ed 100644
--- a/java/org/apache/catalina/authenticator/SSLAuthenticator.java
+++ b/java/org/apache/catalina/authenticator/SSLAuthenticator.java
@@ -73,15 +73,15 @@ public class SSLAuthenticator extends AuthenticatorBase {
         }
 
         // Retrieve the certificate chain for this client
-        if (containerLog.isDebugEnabled()) {
-            containerLog.debug(" Looking up certificates");
+        if (containerLog.isTraceEnabled()) {
+            containerLog.trace(" Looking up certificates");
         }
 
         X509Certificate certs[] = getRequestCertificates(request);
 
         if ((certs == null) || (certs.length < 1)) {
             if (containerLog.isDebugEnabled()) {
-                containerLog.debug("  No certificates included with this request");
+                containerLog.debug(sm.getString("sslAuthenticatorValve.noCertificates"));
             }
             response.sendError(HttpServletResponse.SC_UNAUTHORIZED, sm.getString("authenticator.certificates"));
             return false;
@@ -91,7 +91,7 @@ public class SSLAuthenticator extends AuthenticatorBase {
         Principal principal = context.getRealm().authenticate(certs);
         if (principal == null) {
             if (containerLog.isDebugEnabled()) {
-                containerLog.debug("  Realm.authenticate() returned false");
+                containerLog.debug(sm.getString("sslAuthenticatorValve.authFailed"));
             }
             response.sendError(HttpServletResponse.SC_UNAUTHORIZED, sm.getString("authenticator.unauthorized"));
             return false;
diff --git a/java/org/apache/catalina/connector/CoyoteAdapter.java b/java/org/apache/catalina/connector/CoyoteAdapter.java
index c3a0dc2506..e0ed1b9b07 100644
--- a/java/org/apache/catalina/connector/CoyoteAdapter.java
+++ b/java/org/apache/catalina/connector/CoyoteAdapter.java
@@ -1022,8 +1022,8 @@ public class CoyoteAdapter implements Adapter {
                     request.setRequestedSessionId(scookie.getValue().toString());
                     request.setRequestedSessionCookie(true);
                     request.setRequestedSessionURL(false);
-                    if (log.isDebugEnabled()) {
-                        log.debug(" Requested cookie session id is " + request.getRequestedSessionId());
+                    if (log.isTraceEnabled()) {
+                        log.trace(" Requested cookie session id is " + request.getRequestedSessionId());
                     }
                 } else {
                     if (!request.isRequestedSessionIdValid()) {
diff --git a/java/org/apache/catalina/core/ContainerBase.java b/java/org/apache/catalina/core/ContainerBase.java
index 5e6f74d9a5..c15298a359 100644
--- a/java/org/apache/catalina/core/ContainerBase.java
+++ b/java/org/apache/catalina/core/ContainerBase.java
@@ -662,7 +662,7 @@ public abstract class ContainerBase extends LifecycleMBeanBase implements Contai
     private void addChildInternal(Container child) {
 
         if (log.isDebugEnabled()) {
-            log.debug("Add child " + child + " " + this);
+            log.debug(sm.getString("containerBase.child.add", child, this));
         }
 
         synchronized (children) {
diff --git a/java/org/apache/catalina/core/LocalStrings.properties b/java/org/apache/catalina/core/LocalStrings.properties
index 14a9f73763..a407310206 100644
--- a/java/org/apache/catalina/core/LocalStrings.properties
+++ b/java/org/apache/catalina/core/LocalStrings.properties
@@ -114,6 +114,7 @@ containerBase.backgroundProcess.cluster=Exception processing cluster [{0}] backg
 containerBase.backgroundProcess.error=Exception processing background thread
 containerBase.backgroundProcess.realm=Exception processing realm [{0}] background process
 containerBase.backgroundProcess.valve=Exception processing valve [{0}] background process
+containerBase.child.add=Add container child [{0}] to container [{1}]
 containerBase.child.destroy=Error destroying child
 containerBase.child.notUnique=Child name [{0}] is not unique
 containerBase.child.start=Error starting child
@@ -154,6 +155,11 @@ listener.notServer=This listener must only be nested within Server elements, but
 
 naming.addEnvEntry=Adding environment entry [{0}]
 naming.addResourceEnvRef=Adding resource env ref [{0}]
+naming.addResourceLink=Adding resource link [{0}]
+naming.addResourceRef=Adding resource reference [{0}] at [{1}]
+naming.addService=Adding service reference [{0}] at [{1}]
+naming.addSlash=Changing service URL to [/{0}]
+naming.bind=Bind naming context to container [{0}]
 naming.bindFailed=Failed to bind object: [{0}]
 naming.invalidEnvEntryType=Environment entry [{0}] has an invalid type
 naming.invalidEnvEntryValue=Environment entry [{0}] has an invalid value
diff --git a/java/org/apache/catalina/core/NamingContextListener.java b/java/org/apache/catalina/core/NamingContextListener.java
index a81ff0a04c..95c69ea23b 100644
--- a/java/org/apache/catalina/core/NamingContextListener.java
+++ b/java/org/apache/catalina/core/NamingContextListener.java
@@ -228,7 +228,7 @@ public class NamingContextListener implements LifecycleListener, PropertyChangeL
                 ContextAccessController.setSecurityToken(container, token);
                 ContextBindings.bindContext(container, namingContext, token);
                 if (log.isDebugEnabled()) {
-                    log.debug("Bound " + container);
+                    log.debug(sm.getString("naming.bind", container));
                 }
 
                 // Configure write when read-only behaviour
@@ -825,7 +825,9 @@ public class NamingContextListener implements LifecycleListener, PropertyChangeL
                 if (wsdlURL == null) {
                     try {
                         wsdlURL = ((Context) container).getServletContext().getResource("/" + service.getWsdlfile());
-                        log.debug("  Changing service ref wsdl file for /" + service.getWsdlfile());
+                        if (log.isDebugEnabled()) {
+                            log.debug(sm.getString("naming.addSlash", service.getWsdlfile()));
+                        }
                     } catch (MalformedURLException e) {
                         log.error(sm.getString("naming.wsdlFailed", e));
                     }
@@ -858,7 +860,9 @@ public class NamingContextListener implements LifecycleListener, PropertyChangeL
                     try {
                         jaxrpcURL = ((Context) container).getServletContext()
                                 .getResource("/" + service.getJaxrpcmappingfile());
-                        log.debug("  Changing service ref jaxrpc file for /" + service.getJaxrpcmappingfile());
+                        if (log.isDebugEnabled()) {
+                            log.debug(sm.getString("naming.addSlash", service.getJaxrpcmappingfile()));
+                        }
                     } catch (MalformedURLException e) {
                         log.error(sm.getString("naming.wsdlFailed", e));
                     }
@@ -916,7 +920,7 @@ public class NamingContextListener implements LifecycleListener, PropertyChangeL
 
         try {
             if (log.isDebugEnabled()) {
-                log.debug("  Adding service ref " + service.getName() + "  " + ref);
+                log.debug(sm.getString("naming.addService", ref, service.getName()));
             }
             createSubcontexts(envCtx, service.getName());
             envCtx.bind(service.getName(), ref);
@@ -951,7 +955,7 @@ public class NamingContextListener implements LifecycleListener, PropertyChangeL
 
         try {
             if (log.isDebugEnabled()) {
-                log.debug("  Adding resource ref " + resource.getName() + "  " + ref);
+                log.debug(sm.getString("naming.addResourceRef", ref, resource.getName()));
             }
             createSubcontexts(envCtx, resource.getName());
             envCtx.bind(resource.getName(), ref);
@@ -1035,7 +1039,7 @@ public class NamingContextListener implements LifecycleListener, PropertyChangeL
         javax.naming.Context ctx = "UserTransaction".equals(resourceLink.getName()) ? compCtx : envCtx;
         try {
             if (log.isDebugEnabled()) {
-                log.debug("  Adding resource link " + resourceLink.getName());
+                log.debug(sm.getString("naming.addResourceLink", resourceLink.getName()));
             }
             createSubcontexts(envCtx, resourceLink.getName());
             ctx.bind(resourceLink.getName(), ref);
diff --git a/java/org/apache/catalina/core/ThreadLocalLeakPreventionListener.java b/java/org/apache/catalina/core/ThreadLocalLeakPreventionListener.java
index fa43eebefe..c413317186 100644
--- a/java/org/apache/catalina/core/ThreadLocalLeakPreventionListener.java
+++ b/java/org/apache/catalina/core/ThreadLocalLeakPreventionListener.java
@@ -101,7 +101,9 @@ public class ThreadLocalLeakPreventionListener extends FrameworkListener {
 
         if (!(context instanceof StandardContext) ||
                 !((StandardContext) context).getRenewThreadsWhenStoppingContext()) {
-            log.debug("Not renewing threads when the context is stopping. " + "It is not configured to do it.");
+            if (log.isTraceEnabled()) {
+                log.trace("Not renewing threads when the context is stopping. It is not configured to do it.");
+            }
             return;
         }
 
diff --git a/java/org/apache/catalina/filters/CsrfPreventionFilter.java b/java/org/apache/catalina/filters/CsrfPreventionFilter.java
index 9d4639c2bf..8a172702dc 100644
--- a/java/org/apache/catalina/filters/CsrfPreventionFilter.java
+++ b/java/org/apache/catalina/filters/CsrfPreventionFilter.java
@@ -354,17 +354,16 @@ public class CsrfPreventionFilter extends CsrfPreventionFilterBase {
                 if (previousNonce == null) {
                     if (enforce(req, requestedPath)) {
                         if (log.isDebugEnabled()) {
-                            log.debug("Rejecting request for " + getRequestedPath(req) + ", session " +
-                                    (null == session ? "(none)" : session.getId()) +
-                                    " with no CSRF nonce found in request");
+                            log.debug(sm.getString("csrfPrevention.rejectNoNonce", getRequestedPath(req),
+                                    (null == session ? "(null)" : session.getId())));
                         }
 
                         res.sendError(getDenyStatus());
                         return;
                     } else {
-                        if (log.isDebugEnabled()) {
-                            log.debug("Would have rejected request for " + getRequestedPath(req) + ", session " +
-                                    (null == session ? "(none)" : session.getId()) +
+                        if (log.isTraceEnabled()) {
+                            log.trace("Would have rejected request for " + getRequestedPath(req) + ", session " +
+                                    (null == session ? "(null)" : session.getId()) +
                                     " with no CSRF nonce found in request");
                         }
                     }
@@ -373,32 +372,31 @@ public class CsrfPreventionFilter extends CsrfPreventionFilterBase {
                     if (nonceCache == null) {
                         if (enforce(req, requestedPath)) {
                             if (log.isDebugEnabled()) {
-                                log.debug("Rejecting request for " + getRequestedPath(req) + ", session " +
-                                        (null == session ? "(none)" : session.getId()) + " due to empty / missing nonce cache");
+                                log.debug(sm.getString("csrfPrevention.rejectNoCache", getRequestedPath(req),
+                                        (null == session ? "(null)" : session.getId())));
                             }
 
                             res.sendError(getDenyStatus());
                             return;
                         } else {
-                            if (log.isDebugEnabled()) {
-                                log.debug("Would have rejecting request for " + getRequestedPath(req) + ", session " +
-                                        (null == session ? "(none)" : session.getId()) + " due to empty / missing nonce cache");
+                            if (log.isTraceEnabled()) {
+                                log.trace("Would have rejecting request for " + getRequestedPath(req) + ", session " +
+                                        (null == session ? "(null)" : session.getId()) + " due to empty / missing nonce cache");
                             }
                         }
                     } else if (!nonceCache.contains(previousNonce)) {
                         if (enforce(req, requestedPath)) {
                             if (log.isDebugEnabled()) {
-                                log.debug("Rejecting request for " + getRequestedPath(req) + ", session " +
-                                        (null == session ? "(none)" : session.getId()) + " due to invalid nonce " +
-                                        previousNonce);
+                                log.debug(sm.getString("csrfPrevention.rejectInvalidNonce", getRequestedPath(req),
+                                        (null == session ? "(null)" : session.getId()), previousNonce));
                             }
 
                             res.sendError(getDenyStatus());
                             return;
                         } else {
-                            if (log.isDebugEnabled()) {
-                                log.debug("Would have rejecting request for " + getRequestedPath(req) + ", session " +
-                                        (null == session ? "(none)" : session.getId()) + " due to invalid nonce " +
+                            if (log.isTraceEnabled()) {
+                                log.trace("Would have rejecting request for " + getRequestedPath(req) + ", session " +
+                                        (null == session ? "(null)" : session.getId()) + " due to invalid nonce " +
                                         previousNonce);
                             }
                         }
@@ -418,13 +416,13 @@ public class CsrfPreventionFilter extends CsrfPreventionFilterBase {
                 }
                 if (nonceCache == null) {
                     if (log.isDebugEnabled()) {
-                        log.debug("Creating new CSRF nonce cache with size=" + nonceCacheSize + " for session " +
-                                (null == session ? "(will create)" : session.getId()));
+                        log.debug(sm.getString("csrfPrevention.createCache", Integer.valueOf(nonceCacheSize),
+                                (null == session ? "(null)" : session.getId())));
                     }
 
                     if (session == null) {
-                        if (log.isDebugEnabled()) {
-                            log.debug("Creating new session to store CSRF nonce cache");
+                        if (log.isTraceEnabled()) {
+                            log.trace("Creating new session to store CSRF nonce cache");
                         }
 
                         session = req.getSession(true);
diff --git a/java/org/apache/catalina/filters/LocalStrings.properties b/java/org/apache/catalina/filters/LocalStrings.properties
index 5c5da1559e..be56650ae2 100644
--- a/java/org/apache/catalina/filters/LocalStrings.properties
+++ b/java/org/apache/catalina/filters/LocalStrings.properties
@@ -23,7 +23,11 @@ corsFilter.onlyHttp=CORS doesn't support non-HTTP request or response
 corsFilter.wrongType1=Expects an HttpServletRequest object of type [{0}]
 corsFilter.wrongType2=Expects an HttpServletRequest object of type [{0}] or [{1}]
 
+csrfPrevention.createCache=Creating new CSRF nonce cache with size [{0}] for session [{1}] (it will be created if null)
 csrfPrevention.invalidRandomClass=Unable to create Random source using class [{0}]
+csrfPrevention.rejectInvalidNonce=Rejecting request for [{0}] with session [{1}] due to invalid nonce [{2}]
+csrfPrevention.rejectNoCache=Rejecting request for [{0}] with session [{1}] due to empty or missing nonce cache
+csrfPrevention.rejectNoNonce=Rejecting request for [{0}] with session [{1}] because no CSRF nonce was found
 csrfPrevention.unsupportedPattern=Unsupported pattern [{0}]
 
 expiresFilter.exceptionProcessingParameter=Exception processing configuration parameter [{0}]:[{1}]
diff --git a/java/org/apache/catalina/ha/session/ClusterManagerBase.java b/java/org/apache/catalina/ha/session/ClusterManagerBase.java
index 4169f81c7e..b642178f4b 100644
--- a/java/org/apache/catalina/ha/session/ClusterManagerBase.java
+++ b/java/org/apache/catalina/ha/session/ClusterManagerBase.java
@@ -33,9 +33,11 @@ import org.apache.catalina.tribes.io.ReplicationStream;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.util.collections.SynchronizedStack;
+import org.apache.tomcat.util.res.StringManager;
 
 public abstract class ClusterManagerBase extends ManagerBase implements ClusterManager {
 
+    protected static final StringManager sm = StringManager.getManager(ClusterManagerBase.class);
     private final Log log = LogFactory.getLog(ClusterManagerBase.class); // must not be static
 
     /**
@@ -191,7 +193,7 @@ public abstract class ClusterManagerBase extends ManagerBase implements ClusterM
                     } // for
 
                     if (replicationValve == null && log.isDebugEnabled()) {
-                        log.debug("no ReplicationValve found for CrossContext Support");
+                        log.debug(sm.getString("clusterManager.noValve"));
                     } // endif
                 } // end if
             } // endif
diff --git a/java/org/apache/catalina/ha/session/LocalStrings.properties b/java/org/apache/catalina/ha/session/LocalStrings.properties
index d894dd3c64..0b6a7b39fb 100644
--- a/java/org/apache/catalina/ha/session/LocalStrings.properties
+++ b/java/org/apache/catalina/ha/session/LocalStrings.properties
@@ -18,6 +18,8 @@ backupManager.startFailed=Failed to start BackupManager: [{0}]
 backupManager.startUnable=Unable to start BackupManager: [{0}]
 backupManager.stopped=Manager [{0}] is stopping
 
+clusterManager.noValve=No ReplicationValve found for cross context support
+
 clusterSessionListener.noManager=Context manager doesn''t exist:[{0}]
 
 deltaManager.createMessage.access=Manager [{0}]: create session access message for session [{1}]
diff --git a/java/org/apache/catalina/ha/tcp/LocalStrings.properties b/java/org/apache/catalina/ha/tcp/LocalStrings.properties
index 2214450e08..e8525482bb 100644
--- a/java/org/apache/catalina/ha/tcp/LocalStrings.properties
+++ b/java/org/apache/catalina/ha/tcp/LocalStrings.properties
@@ -31,10 +31,13 @@ ReplicationValve.stats=Average request time=[{0}] ms with cluster overhead time=
 
 simpleTcpCluster.clustermanager.cloneFailed=Unable to clone cluster manager, defaulting to org.apache.catalina.ha.session.DeltaManager
 simpleTcpCluster.clustermanager.notImplement=Manager [{0}] does not implement ClusterManager, addition to cluster has been aborted.
+simpleTcpCluster.createManager=Creating ClusterManager for context [{0}] using class [{1}]
 simpleTcpCluster.member.addFailed=Unable to connect to replication system.
 simpleTcpCluster.member.added=Replication member added:[{0}]
 simpleTcpCluster.member.disappeared=Received member disappeared:[{0}]
 simpleTcpCluster.member.removeFailed=Unable remove cluster node from replication system.
+simpleTcpCluster.noListener=Message [{0}] from type [{1}] transferred but no listener registered
+simpleTcpCluster.noMembers=No members in cluster, ignoring message [{0}]
 simpleTcpCluster.sendFailed=Unable to send message through cluster sender.
 simpleTcpCluster.start=Cluster is about to start
 simpleTcpCluster.startUnable=Unable to start cluster.
diff --git a/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java b/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java
index 01774e46c0..c0d3cad81c 100644
--- a/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java
+++ b/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java
@@ -412,8 +412,7 @@ public class SimpleTcpCluster extends LifecycleMBeanBase
     @Override
     public synchronized Manager createManager(String name) {
         if (log.isDebugEnabled()) {
-            log.debug("Creating ClusterManager for context " + name + " using class " +
-                    getManagerTemplate().getClass().getName());
+            log.debug(sm.getString("simpleTcpCluster.createManager", name, getManagerTemplate().getClass().getName()));
         }
         ClusterManager manager = null;
         try {
@@ -716,7 +715,7 @@ public class SimpleTcpCluster extends LifecycleMBeanBase
                 if (destmembers.length > 0) {
                     channel.send(destmembers, msg, sendOptions);
                 } else if (log.isDebugEnabled()) {
-                    log.debug("No members in cluster, ignoring message:" + msg);
+                    log.debug(sm.getString("simpleTcpCluster.noMembers", msg));
                 }
             }
         } catch (Exception x) {
@@ -815,8 +814,7 @@ public class SimpleTcpCluster extends LifecycleMBeanBase
                 // Notify our interested LifecycleListeners
                 fireLifecycleEvent(RECEIVE_MESSAGE_FAILURE_EVENT, new SendMessageData(message, dest, null));
                 if (log.isDebugEnabled()) {
-                    log.debug("Message " + message.toString() + " from type " + message.getClass().getName() +
-                            " transferred but no listener registered");
+                    log.debug(sm.getString("simpleTcpCluster.noListener", message, message.getClass().getName()));
                 }
             }
         }
diff --git a/java/org/apache/catalina/mbeans/GlobalResourcesLifecycleListener.java b/java/org/apache/catalina/mbeans/GlobalResourcesLifecycleListener.java
index feba89cf8e..94f0bf3255 100644
--- a/java/org/apache/catalina/mbeans/GlobalResourcesLifecycleListener.java
+++ b/java/org/apache/catalina/mbeans/GlobalResourcesLifecycleListener.java
@@ -121,7 +121,7 @@ public class GlobalResourcesLifecycleListener implements LifecycleListener {
     protected void createMBeans(String prefix, Context context) throws NamingException {
 
         if (log.isDebugEnabled()) {
-            log.debug("Creating MBeans for Global JNDI Resources in Context '" + prefix + "'");
+            log.debug(sm.getString("globalResources.create", prefix));
         }
 
         try {
diff --git a/java/org/apache/catalina/mbeans/LocalStrings.properties b/java/org/apache/catalina/mbeans/LocalStrings.properties
index 2d996c6f2c..138b3a36d1 100644
--- a/java/org/apache/catalina/mbeans/LocalStrings.properties
+++ b/java/org/apache/catalina/mbeans/LocalStrings.properties
@@ -13,6 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+globalResources.create=Creating MBeans for Global JNDI Resources in Context [{0}]
 globalResources.createError=Exception processing global JNDI Resources
 globalResources.createError.operation=Operation not supported error creating MBeans
 globalResources.createError.runtime=Unexpected error creating MBeans
diff --git a/java/org/apache/catalina/realm/JAASMemoryLoginModule.java b/java/org/apache/catalina/realm/JAASMemoryLoginModule.java
index 1cd386a420..6500f9754a 100644
--- a/java/org/apache/catalina/realm/JAASMemoryLoginModule.java
+++ b/java/org/apache/catalina/realm/JAASMemoryLoginModule.java
@@ -293,7 +293,7 @@ public class JAASMemoryLoginModule extends MemoryRealm implements LoginModule {
         }
 
         if (log.isDebugEnabled()) {
-            log.debug("login " + username + " " + principal);
+            log.debug(sm.getString("jaasMemoryLoginModule.login", username, principal));
         }
 
         // Report results based on success or failure
diff --git a/java/org/apache/catalina/realm/JNDIRealm.java b/java/org/apache/catalina/realm/JNDIRealm.java
index aa097e24a9..1549ea33ec 100644
--- a/java/org/apache/catalina/realm/JNDIRealm.java
+++ b/java/org/apache/catalina/realm/JNDIRealm.java
@@ -1199,8 +1199,8 @@ public class JNDIRealm extends RealmBase {
             closePooledConnections();
 
             // Return "not authenticated" for this request
-            if (containerLog.isDebugEnabled()) {
-                containerLog.debug("Returning null principal.");
+            if (containerLog.isTraceEnabled()) {
+                containerLog.trace("Returning null principal.");
             }
             return null;
         } finally {
@@ -1227,8 +1227,8 @@ public class JNDIRealm extends RealmBase {
             throws NamingException {
 
         if (username == null || username.equals("") || credentials == null || credentials.equals("")) {
-            if (containerLog.isDebugEnabled()) {
-                containerLog.debug("username null or empty: returning null principal.");
+            if (containerLog.isTraceEnabled()) {
+                containerLog.trace("username null or empty: returning null principal.");
             }
             return null;
         }
diff --git a/java/org/apache/catalina/realm/LocalStrings.properties b/java/org/apache/catalina/realm/LocalStrings.properties
index bf4ab48fd0..c72c39ac2d 100644
--- a/java/org/apache/catalina/realm/LocalStrings.properties
+++ b/java/org/apache/catalina/realm/LocalStrings.properties
@@ -38,6 +38,7 @@ jaasCallback.username=Returned username [{0}]
 
 jaasMemoryLoginModule.callbackHandlerError=Error invoking callback handler: [{0}]
 jaasMemoryLoginModule.invalidCredentials=User name or password is incorrect
+jaasMemoryLoginModule.login=Login for user [{0}] as principal [{1}]
 jaasMemoryLoginModule.noCallbackHandler=No CallbackHandler specified
 jaasMemoryLoginModule.noCatalinaBase=Unable to determine Catalina base to load file [{0}]
 jaasMemoryLoginModule.noConfig=Cannot load configuration file [{0}]
@@ -110,6 +111,7 @@ realmBase.hasRoleFailure=Username [{0}] does NOT have role [{1}]
 realmBase.hasRoleSuccess=Username [{0}] has role [{1}]
 realmBase.invalidDigestEncoding=Invalid digest encoding [{0}]
 realmBase.unknownAllRolesMode=Unknown mode [{0}], must be one of: strict, authOnly, strictAuthOnly
+realmBase.validity=Error checking certificate validity
 
 userDatabaseRealm.lookup=Exception looking up UserDatabase under key [{0}]
 userDatabaseRealm.noDatabase=No UserDatabase component found under key [{0}]
diff --git a/java/org/apache/catalina/realm/RealmBase.java b/java/org/apache/catalina/realm/RealmBase.java
index 0fdcc56930..7dcd3ae4ea 100644
--- a/java/org/apache/catalina/realm/RealmBase.java
+++ b/java/org/apache/catalina/realm/RealmBase.java
@@ -451,7 +451,7 @@ public abstract class RealmBase extends LifecycleMBeanBase implements Realm {
                     cert.checkValidity();
                 } catch (Exception e) {
                     if (log.isDebugEnabled()) {
-                        log.debug("  Validity exception", e);
+                        log.debug(sm.getString("realmBase.validity"), e);
                     }
                     return null;
                 }
diff --git a/java/org/apache/catalina/session/FileStore.java b/java/org/apache/catalina/session/FileStore.java
index 1fa34b90d6..7399d436a3 100644
--- a/java/org/apache/catalina/session/FileStore.java
+++ b/java/org/apache/catalina/session/FileStore.java
@@ -233,7 +233,7 @@ public final class FileStore extends StoreBase {
             return session;
         } catch (FileNotFoundException e) {
             if (contextLog.isDebugEnabled()) {
-                contextLog.debug("No persisted data file found");
+                contextLog.debug(sm.getString("fileStore.noFile", id, file.getAbsolutePath()));
             }
             return null;
         } finally {
diff --git a/java/org/apache/catalina/session/LocalStrings.properties b/java/org/apache/catalina/session/LocalStrings.properties
index d2e79e9414..40896868fc 100644
--- a/java/org/apache/catalina/session/LocalStrings.properties
+++ b/java/org/apache/catalina/session/LocalStrings.properties
@@ -31,6 +31,7 @@ fileStore.deleteFailed=Unable to delete file [{0}] which is preventing the creat
 fileStore.deleteSessionFailed=Unable to delete file [{0}] which is no longer required
 fileStore.invalid=Invalid persistence file [{0}] for session ID [{1}]
 fileStore.loading=Loading Session [{0}] from file [{1}]
+fileStore.noFile=Persistence file [{1}] for session ID [{0}] was not found
 fileStore.removing=Removing Session [{0}] at file [{1}]
 fileStore.saving=Saving Session [{0}] to file [{1}]
 
@@ -64,10 +65,12 @@ persistentManager.tooManyActive=Too many active sessions, [{0}], looking for idl
 persistentManager.unloading=Saving [{0}] persisted sessions
 
 standardManager.deletePersistedFileFail=Unable to delete [{0}] after reading the persisted sessions. The continued presence of this file may cause future attempts to persist sessions to fail.
+standardManager.expiringSessions=Expiring [{0}] persisted sessions
 standardManager.loading=Loading persisted sessions from [{0}]
 standardManager.loading.exception=Exception while loading persisted sessions
 standardManager.managerLoad=Exception loading sessions from persistent storage
 standardManager.managerUnload=Exception unloading sessions to persistent storage
+standardManager.noFile=Persisted data file [{0}] was not found
 standardManager.unloading=Saving persisted sessions to [{0}]
 standardManager.unloading.debug=Unloading persisted sessions
 standardManager.unloading.nosessions=No persisted sessions to unload
diff --git a/java/org/apache/catalina/session/ManagerBase.java b/java/org/apache/catalina/session/ManagerBase.java
index 067b30f4b8..405f6762cd 100644
--- a/java/org/apache/catalina/session/ManagerBase.java
+++ b/java/org/apache/catalina/session/ManagerBase.java
@@ -650,12 +650,12 @@ public abstract class ManagerBase extends LifecycleMBeanBase implements Manager
             ((Lifecycle) sessionIdGenerator).start();
         } else {
             // Force initialization of the random number generator
-            if (log.isDebugEnabled()) {
-                log.debug("Force random number initialization starting");
+            if (log.isTraceEnabled()) {
+                log.trace("Force random number initialization starting");
             }
             sessionIdGenerator.generateSessionId();
-            if (log.isDebugEnabled()) {
-                log.debug("Force random number initialization completed");
+            if (log.isTraceEnabled()) {
+                log.trace("Force random number initialization completed");
             }
         }
     }
diff --git a/java/org/apache/catalina/session/StandardManager.java b/java/org/apache/catalina/session/StandardManager.java
index 4ed5791eca..af4cfa191b 100644
--- a/java/org/apache/catalina/session/StandardManager.java
+++ b/java/org/apache/catalina/session/StandardManager.java
@@ -230,7 +230,7 @@ public class StandardManager extends ManagerBase {
             }
         } catch (FileNotFoundException e) {
             if (log.isDebugEnabled()) {
-                log.debug("No persisted data file found");
+                log.debug(sm.getString("standardManager.noFile", file.getAbsolutePath()));
             }
             return;
         }
@@ -311,7 +311,7 @@ public class StandardManager extends ManagerBase {
 
         // Expire all the sessions we just wrote
         if (log.isDebugEnabled()) {
-            log.debug("Expiring " + list.size() + " persisted sessions");
+            log.debug(sm.getString("standardManager.expiringSessions", list.size()));
         }
         for (StandardSession session : list) {
             try {
diff --git a/java/org/apache/catalina/startup/Catalina.java b/java/org/apache/catalina/startup/Catalina.java
index 0531de5e4e..01d7d3cbb9 100644
--- a/java/org/apache/catalina/startup/Catalina.java
+++ b/java/org/apache/catalina/startup/Catalina.java
@@ -760,7 +760,7 @@ public class Catalina {
             try {
                 getServer().destroy();
             } catch (LifecycleException e1) {
-                log.debug("destroy() failed for failed Server ", e1);
+                log.debug(sm.getString("catalina.destroyFail"), e1);
             }
             return;
         }
@@ -880,14 +880,14 @@ public class Catalina {
             }
             System.setProperty(javax.naming.Context.URL_PKG_PREFIXES, value);
             if (log.isDebugEnabled()) {
-                log.debug("Setting naming prefix=" + value);
+                log.debug(sm.getString("catalina.namingPrefix", value));
             }
             value = System.getProperty(javax.naming.Context.INITIAL_CONTEXT_FACTORY);
             if (value == null) {
                 System.setProperty(javax.naming.Context.INITIAL_CONTEXT_FACTORY,
                         "org.apache.naming.java.javaURLContextFactory");
             } else {
-                log.debug("INITIAL_CONTEXT_FACTORY already set " + value);
+                log.debug(sm.getString("catalina.initialContextFactory", value));
             }
         }
     }
@@ -923,7 +923,7 @@ public class Catalina {
             writer.write(code.toString());
         } catch (IOException e) {
             // Should not happen
-            log.debug("Error writing code loader", e);
+            log.debug(sm.getString("catalina.loaderWriteFail"), e);
         }
     }
 
diff --git a/java/org/apache/catalina/startup/ContextConfig.java b/java/org/apache/catalina/startup/ContextConfig.java
index 2c1ced2222..f605ccf40e 100644
--- a/java/org/apache/catalina/startup/ContextConfig.java
+++ b/java/org/apache/catalina/startup/ContextConfig.java
@@ -689,7 +689,7 @@ public class ContextConfig implements LifecycleListener {
     protected void processContextConfig(Digester digester, URL contextXml, InputStream stream) {
 
         if (log.isDebugEnabled()) {
-            log.debug("Processing context [" + context.getName() + "] configuration file [" + contextXml + "]");
+            log.debug(sm.getString("contextConfig.processContext", context.getName(), contextXml));
         }
 
         InputSource source = null;
@@ -894,8 +894,7 @@ public class ContextConfig implements LifecycleListener {
             antiLockingDocBase = antiLockingDocBase.getAbsoluteFile();
 
             if (log.isDebugEnabled()) {
-                log.debug("Anti locking context[" + context.getName() + "] setting docBase to " +
-                        antiLockingDocBase.getPath());
+                log.debug(sm.getString("contextConfig.antiLocking", context.getName(), antiLockingDocBase.getPath()));
             }
 
             // Cleanup just in case an old deployment is lying around
@@ -1541,7 +1540,7 @@ public class ContextConfig implements LifecycleListener {
             } else {
                 if (log.isDebugEnabled()) {
                     for (String urlPattern : jspPropertyGroup.getUrlPatterns()) {
-                        log.debug("Skipping " + urlPattern + " , no servlet " + jspServletName);
+                        log.debug(sm.getString("contextConfig.noJsp", urlPattern, jspServletName));
                     }
                 }
             }
diff --git a/java/org/apache/catalina/startup/CopyParentClassLoaderRule.java b/java/org/apache/catalina/startup/CopyParentClassLoaderRule.java
index e271113fbf..c6640d4d2b 100644
--- a/java/org/apache/catalina/startup/CopyParentClassLoaderRule.java
+++ b/java/org/apache/catalina/startup/CopyParentClassLoaderRule.java
@@ -56,8 +56,8 @@ public class CopyParentClassLoaderRule extends Rule {
     @Override
     public void begin(String namespace, String name, Attributes attributes) throws Exception {
 
-        if (digester.getLogger().isDebugEnabled()) {
-            digester.getLogger().debug("Copying parent class loader");
+        if (digester.getLogger().isTraceEnabled()) {
+            digester.getLogger().trace("Copying parent class loader");
         }
         Container child = (Container) digester.peek(0);
         Object parent = digester.peek(1);
diff --git a/java/org/apache/catalina/startup/HostConfig.java b/java/org/apache/catalina/startup/HostConfig.java
index 748594b942..8377e575c0 100644
--- a/java/org/apache/catalina/startup/HostConfig.java
+++ b/java/org/apache/catalina/startup/HostConfig.java
@@ -1503,7 +1503,7 @@ public class HostConfig implements LifecycleListener {
             // host's configBase
             if (isDeletableResource(app, current)) {
                 if (log.isDebugEnabled()) {
-                    log.debug("Delete " + current);
+                    log.debug(sm.getString("hostConfig.delete", current));
                 }
                 ExpandWar.delete(current);
             }
@@ -1522,7 +1522,7 @@ public class HostConfig implements LifecycleListener {
                 // configBase
                 if (isDeletableResource(app, current)) {
                     if (log.isDebugEnabled()) {
-                        log.debug("Delete " + current);
+                        log.debug(sm.getString("hostConfig.delete", current));
                     }
                     ExpandWar.delete(current);
                 }
diff --git a/java/org/apache/catalina/startup/LocalStrings.properties b/java/org/apache/catalina/startup/LocalStrings.properties
index 5abd648a71..d6144f9a69 100644
--- a/java/org/apache/catalina/startup/LocalStrings.properties
+++ b/java/org/apache/catalina/startup/LocalStrings.properties
@@ -14,10 +14,14 @@
 # limitations under the License.
 
 catalina.configFail=Unable to load server configuration from [{0}]
+catalina.destroyFail=Error destroying failed server
 catalina.generatedCodeLocationError=Error using configured location for generated Tomcat embedded code [{0}]
 catalina.incorrectPermissions=Permissions incorrect, read permission is not allowed on the file
 catalina.init=Server initialization in [{0}] milliseconds
 catalina.initError=Error initializing Catalina
+catalina.initialContextFactory=The system property INITIAL_CONTEXT_FACTORY is already set to [{0}]
+catalina.loaderWriteFail=Error writing code loader
+catalina.namingPrefix=Set naming prefix [{0}]
 catalina.noCluster=Cluster RuleSet not found due to [{0}]. Cluster configuration disabled.
 catalina.noLoader=Configuration code loader [{0}] was not found, generated code will not be used
 catalina.noNaming=Naming environment is disabled
@@ -37,6 +41,7 @@ connector.noSetSSLImplementationName=Connector [{0}] does not support changing t
 
 contextConfig.altDDNotFound=alt-dd file [{0}] not found
 contextConfig.annotationsStackOverflow=Unable to complete the scan for annotations for web application [{0}] due to a StackOverflowError. Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies. The class hierarchy being processed was [{1}]
+contextConfig.antiLocking=Anti locking for context [{0}] setting docBase to [{1}]
 contextConfig.applicationMissing=Missing application web.xml, using defaults only
 contextConfig.applicationParse=Parse error in application web.xml file at [{0}]
 contextConfig.applicationPosition=Occurred at line [{0}] column [{1}]
@@ -69,10 +74,12 @@ contextConfig.jspFile.error=JSP file [{0}] must start with a ''/''
 contextConfig.jspFile.warning=WARNING: JSP file [{0}] must start with a ''/'' in Servlet 2.4
 contextConfig.missingRealm=No Realm has been configured to authenticate against
 contextConfig.noAntiLocking=The value [{0}] configured for java.io.tmpdir does not point to a valid directory. The antiResourceLocking setting for the web application [{1}] will be ignored.
+contextConfig.noJsp=Skipping JSP property group for URL [{0}], no JSP Servlet found for name [{1}]
 contextConfig.processAnnotationsDir.debug=Scanning directory for class files with annotations [{0}]
 contextConfig.processAnnotationsInParallelFailure=Parallel execution failed
 contextConfig.processAnnotationsJar.debug=Scanning jar file for class files with annotations [{0}]
 contextConfig.processAnnotationsWebDir.debug=Scanning web application directory for class files with annotations [{0}]
+contextConfig.processContext=Processing context [{0}] with configuration [{1}]
 contextConfig.resourceJarFail=Failed to process JAR found at URL [{0}] for static resources to be included in context with name [{1}]
 contextConfig.role.auth=Security role name [{0}] used in an <auth-constraint> without being defined in a <security-role>
 contextConfig.role.link=Security role name [{0}] used in a <role-link> without being defined in a <security-role>
@@ -109,6 +116,7 @@ hostConfig.cce=Lifecycle event data object [{0}] is not a Host
 hostConfig.context.remove=Error while removing context [{0}]
 hostConfig.context.restart=Error during context [{0}] restart
 hostConfig.createDirs=Unable to create directory for deployment: [{0}]
+hostConfig.delete=Delete resource [{0}] during application reload
 hostConfig.deploy.error=Exception while deploying web application directory [{0}]
 hostConfig.deployDescriptor=Deploying deployment descriptor [{0}]
 hostConfig.deployDescriptor.blocked=The web application with context path [{0}] was not deployed because it contained a deployment descriptor [{1}] which may include configuration necessary for the secure deployment of the application but processing of deployment descriptors is prevented by the deployXML setting of this host. An appropriate descriptor should be created at [{2}] to deploy this application.
diff --git a/java/org/apache/catalina/tribes/group/interceptors/LocalStrings.properties b/java/org/apache/catalina/tribes/group/interceptors/LocalStrings.properties
index c3270357ac..6564e4f0ce 100644
--- a/java/org/apache/catalina/tribes/group/interceptors/LocalStrings.properties
+++ b/java/org/apache/catalina/tribes/group/interceptors/LocalStrings.properties
@@ -80,6 +80,7 @@ tcpFailureDetector.heartbeat.failed=Unable to perform heartbeat on the TcpFailur
 tcpFailureDetector.member.disappeared=Verification complete. Member disappeared[{0}]
 tcpFailureDetector.memberDisappeared.verify=Received memberDisappeared[{0}] message. Will verify.
 tcpFailureDetector.performBasicCheck.memberAdded=Member added, even though we weren''t notified:[{0}]
+tcpFailureDetector.recievedPacket=Received a failure detector packet [{0}]
 tcpFailureDetector.still.alive=Verification complete. Member still alive[{0}]
 tcpFailureDetector.suspectMember.alive=Suspect member, confirmed alive.[{0}]
 tcpFailureDetector.suspectMember.dead=Suspect member, confirmed dead.[{0}]
diff --git a/java/org/apache/catalina/tribes/group/interceptors/TcpFailureDetector.java b/java/org/apache/catalina/tribes/group/interceptors/TcpFailureDetector.java
index 5b6ae35708..dbfd3acd37 100644
--- a/java/org/apache/catalina/tribes/group/interceptors/TcpFailureDetector.java
+++ b/java/org/apache/catalina/tribes/group/interceptors/TcpFailureDetector.java
@@ -113,7 +113,7 @@ public class TcpFailureDetector extends ChannelInterceptorBase implements TcpFai
         if ( process ) {
             super.messageReceived(msg);
         } else if ( log.isDebugEnabled() ) {
-            log.debug("Received a failure detector packet:"+msg);
+            log.debug(sm.getString("tcpFailureDetector.recievedPacket", msg));
         }
     }//messageReceived
 
diff --git a/java/org/apache/catalina/tribes/group/interceptors/TcpPingInterceptor.java b/java/org/apache/catalina/tribes/group/interceptors/TcpPingInterceptor.java
index e1a9302ba0..06a21c5540 100644
--- a/java/org/apache/catalina/tribes/group/interceptors/TcpPingInterceptor.java
+++ b/java/org/apache/catalina/tribes/group/interceptors/TcpPingInterceptor.java
@@ -179,8 +179,8 @@ public class TcpPingInterceptor extends ChannelInterceptorBase implements TcpPin
         //ignore the message, it doesn't have the flag set
         if ( process ) {
             super.messageReceived(msg);
-        } else if ( log.isDebugEnabled() ) {
-            log.debug("Received a TCP ping packet:"+msg);
+        } else if ( log.isTraceEnabled() ) {
+            log.trace("Received a TCP ping packet:" + msg);
         }
     }//messageReceived
 
diff --git a/java/org/apache/catalina/tribes/membership/LocalStrings.properties b/java/org/apache/catalina/tribes/membership/LocalStrings.properties
index 3cb738b131..23fbe8da37 100644
--- a/java/org/apache/catalina/tribes/membership/LocalStrings.properties
+++ b/java/org/apache/catalina/tribes/membership/LocalStrings.properties
@@ -26,9 +26,15 @@ mcastService.noStart=Multicast send is not started or enabled.
 mcastServiceImpl.bind=Attempting to bind the multicast socket to [{0}:{1}]
 mcastServiceImpl.bind.failed=Binding to multicast address, failed. Binding to port only.
 mcastServiceImpl.error.receiving=Error receiving mcast package. Sleeping 500ms
+mcastServiceImpl.error.receivingNoSleep=Error receiving multicast package
 mcastServiceImpl.invalid.startLevel=Invalid start level. Only acceptable levels are Channel.MBR_RX_SEQ and Channel.MBR_TX_SEQ
 mcastServiceImpl.invalid.stopLevel=Invalid stop level. Only acceptable levels are Channel.MBR_RX_SEQ and Channel.MBR_TX_SEQ
+mcastServiceImpl.invalidMemberPackage=Invalid member multicast package
+mcastServiceImpl.memberAdd=Add member [{0}]
 mcastServiceImpl.memberDisappeared.failed=Unable to process member disappeared message.
+mcastServiceImpl.memberExpire=Expire member [{0}]
+mcastServiceImpl.memberShutdown=Member [{0}] has shutdown
+mcastServiceImpl.messageError=Unable to decode message
 mcastServiceImpl.packet.tooLong=Multicast packet received was too long, dropping package:[{0}]
 mcastServiceImpl.receive.running=McastService.receive already running.
 mcastServiceImpl.recovery=Tribes membership running recovery thread. Multicasting is not functional.
diff --git a/java/org/apache/catalina/tribes/membership/McastServiceImpl.java b/java/org/apache/catalina/tribes/membership/McastServiceImpl.java
index 73a0d93f45..bf7541cabe 100644
--- a/java/org/apache/catalina/tribes/membership/McastServiceImpl.java
+++ b/java/org/apache/catalina/tribes/membership/McastServiceImpl.java
@@ -403,7 +403,7 @@ public class McastServiceImpl extends MembershipProviderBase {
         Thread currentThread = Thread.currentThread();
         if (Arrays.equals(m.getCommand(), Member.SHUTDOWN_PAYLOAD)) {
             if (log.isDebugEnabled()) {
-                log.debug("Member has shutdown:" + m);
+                log.debug(sm.getString("mcastServiceImpl.memberShutdown", m));
             }
             membership.removeMember(m);
             t = () -> {
@@ -417,7 +417,7 @@ public class McastServiceImpl extends MembershipProviderBase {
             };
         } else if (membership.memberAlive(m)) {
             if (log.isDebugEnabled()) {
-                log.debug("Mcast add member " + m);
+                log.debug(sm.getString("mcastServiceImpl.memberAdd", m));
             }
             t = () -> {
                 String name = currentThread.getName();
@@ -445,8 +445,8 @@ public class McastServiceImpl extends MembershipProviderBase {
             for (int i=0; i<count; i++) {
                 try {
                     data[i] = buffer.extractPackage(true);
-                }catch (IllegalStateException ise) {
-                    log.debug("Unable to decode message.",ise);
+                } catch (IllegalStateException ise) {
+                    log.debug(sm.getString("mcastServiceImpl.messageError"), ise);
                 }
             }
             Runnable t = () -> {
@@ -483,7 +483,7 @@ public class McastServiceImpl extends MembershipProviderBase {
             Member[] expired = membership.expire(timeToExpiration);
             for (final Member member : expired) {
                 if (log.isDebugEnabled()) {
-                    log.debug("Mcast expire  member " + member);
+                    log.debug(sm.getString("mcastServiceImpl.memberExpire", member));
                 }
                 try {
                     Runnable t = () -> {
@@ -584,13 +584,17 @@ public class McastServiceImpl extends MembershipProviderBase {
                     //we can ignore this, as it means we have an invalid package
                     //but we will log it to debug
                     if ( log.isDebugEnabled() ) {
-                        log.debug("Invalid member mcast package.",ax);
+                        log.debug(sm.getString("mcastServiceImpl.invalidMemberPackage"), ax);
                     }
                 } catch ( Exception x ) {
                     if (errorCounter==0 && doRunReceiver) {
                         log.warn(sm.getString("mcastServiceImpl.error.receiving"),x);
                     } else if (log.isDebugEnabled()) {
-                        log.debug("Error receiving mcast package"+(doRunReceiver?". Sleeping 500ms":"."),x);
+                        if (doRunReceiver) {
+                            log.debug(sm.getString("mcastServiceImpl.error.receiving"), x);
+                        } else {
+                            log.warn(sm.getString("mcastServiceImpl.error.receivingNoSleep"), x);
+                        }
                     }
                     if (doRunReceiver) {
                         try {
diff --git a/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java b/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java
index c63bfb0cad..7499133bf6 100644
--- a/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java
+++ b/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java
@@ -895,13 +895,13 @@ public abstract class AbstractReplicatedMap<K,V>
             removed = (mapMembers.remove(member) != null );
             if (!removed) {
                 if (log.isDebugEnabled()) {
-                    log.debug("Member["+member+"] disappeared, but was not present in the map.");
+                    log.debug(sm.getString("replicatedMap.member.disappeared.unknown", member));
                 }
                 return; //the member was not part of our map.
             }
         }
         if (log.isInfoEnabled()) {
-            log.info(sm.getString("abstractReplicatedMap.member.disappeared", member));
+            log.info(sm.getString("replicatedMap.member.disappeared", member));
         }
         long start = System.currentTimeMillis();
         Iterator<Map.Entry<K,MapEntry<K,V>>> i = innerMap.entrySet().iterator();
@@ -913,7 +913,7 @@ public abstract class AbstractReplicatedMap<K,V>
             }
             if (entry.isPrimary() && inSet(member,entry.getBackupNodes())) {
                 if (log.isDebugEnabled()) {
-                    log.debug("[1] Primary choosing a new backup");
+                    log.debug(sm.getString("abstractReplicatedMap.newBackup"));
                 }
                 try {
                     Member[] backup = publishEntryInfo(entry.getKey(), entry.getValue());
@@ -924,7 +924,7 @@ public abstract class AbstractReplicatedMap<K,V>
                 }
             } else if (member.equals(entry.getPrimary())) {
                 if (log.isDebugEnabled()) {
-                    log.debug("[2] Primary disappeared");
+                    log.debug(sm.getString("abstractReplicatedMap.primaryDisappeared"));
                 }
                 entry.setPrimary(null);
             } //end if
@@ -936,7 +936,7 @@ public abstract class AbstractReplicatedMap<K,V>
                  entry.getBackupNodes()[0].equals(member) ) {
                 //remove proxies that have no backup nor primaries
                 if (log.isDebugEnabled()) {
-                    log.debug("[3] Removing orphaned proxy");
+                    log.debug(sm.getString("abstractReplicatedMap.removeOrphan"));
                 }
                 i.remove();
             } else if ( entry.getPrimary() == null &&
@@ -946,7 +946,7 @@ public abstract class AbstractReplicatedMap<K,V>
                         entry.getBackupNodes()[0].equals(channel.getLocalMember(false)) ) {
                 try {
                     if (log.isDebugEnabled()) {
-                        log.debug("[4] Backup becoming primary");
+                        log.debug(sm.getString("abstractReplicatedMap.newPrimary"));
                     }
                     entry.setPrimary(channel.getLocalMember(false));
                     entry.setBackup(false);
diff --git a/java/org/apache/catalina/tribes/tipis/LocalStrings.properties b/java/org/apache/catalina/tribes/tipis/LocalStrings.properties
index 604c31b899..b85b37c8a4 100644
--- a/java/org/apache/catalina/tribes/tipis/LocalStrings.properties
+++ b/java/org/apache/catalina/tribes/tipis/LocalStrings.properties
@@ -22,10 +22,13 @@ abstractReplicatedMap.leftOver.pingMsg=PING message has been received beyond the
 abstractReplicatedMap.mapMember.unavailable=Member[{0}] is not available yet.
 abstractReplicatedMap.mapMemberAdded.added=Map member added:[{0}]
 abstractReplicatedMap.mapMemberAdded.nullMember=Notified member is not registered in the membership:[{0}].
-abstractReplicatedMap.member.disappeared=Member[{0}] disappeared. Related map entries will be relocated to the new node.
+abstractReplicatedMap.newBackup=Primary choosing a new backup
+abstractReplicatedMap.newPrimary=Backup becoming primary
 abstractReplicatedMap.ping.stateTransferredMember=Member[{0}] is state transferred but not available yet.
 abstractReplicatedMap.ping.timeout=Member[{0}] in the Map[{1}] has timed-out in the ping processing.
+abstractReplicatedMap.primaryDisappeared=Primary disappeared
 abstractReplicatedMap.relocate.complete=Relocation of map entries was complete in [{0}] ms.
+abstractReplicatedMap.removeOrphan=Removing orphaned proxy
 abstractReplicatedMap.transferState.noReplies=Transfer state, 0 replies, probably a timeout.
 abstractReplicatedMap.unable.deserialize.MapMessage=Unable to deserialize MapMessage.
 abstractReplicatedMap.unable.diffObject=Unable to diff object. Will replicate the entire object instead.
@@ -48,6 +51,7 @@ mapMessage.deserialize.error.key=Failed to deserialize MapMessage key
 mapMessage.deserialize.error.value=Failed to deserialize MapMessage value
 
 replicatedMap.member.disappeared=Member[{0}] disappeared. Related map entries will be relocated to the new node.
+replicatedMap.member.disappeared.unknown=Member[{0}] disappeared, but was not present in the map.
 replicatedMap.relocate.complete=Relocation of map entries was complete in [{0}] ms.
 replicatedMap.unable.relocate=Unable to relocate[{0}] to a new backup node
 replicatedMap.unableReplicate.completely=Unable to replicate backup key:[{0}]. Success nodes:[{1}]. Failed nodes:[{2}].
diff --git a/java/org/apache/catalina/tribes/tipis/ReplicatedMap.java b/java/org/apache/catalina/tribes/tipis/ReplicatedMap.java
index 1d346d8a9e..05f28b1943 100644
--- a/java/org/apache/catalina/tribes/tipis/ReplicatedMap.java
+++ b/java/org/apache/catalina/tribes/tipis/ReplicatedMap.java
@@ -191,7 +191,7 @@ public class ReplicatedMap<K,V> extends AbstractReplicatedMap<K,V> {
             removed = (mapMembers.remove(member) != null );
             if (!removed) {
                 if (log.isDebugEnabled()) {
-                    log.debug("Member["+member+"] disappeared, but was not present in the map.");
+                    log.debug(sm.getString("replicatedMap.member.disappeared.unknown", member));
                 }
                 return; //the member was not part of our map.
             }
diff --git a/java/org/apache/catalina/tribes/transport/LocalStrings.properties b/java/org/apache/catalina/tribes/transport/LocalStrings.properties
index 2d09e7d751..e2d64970a2 100644
--- a/java/org/apache/catalina/tribes/transport/LocalStrings.properties
+++ b/java/org/apache/catalina/tribes/transport/LocalStrings.properties
@@ -19,6 +19,7 @@ pooledSender.closed.queue=Queue is closed
 
 receiverBase.bind.failed=Failed bind replication listener on address:[{0}]
 receiverBase.socket.bind=Receiver Server Socket bound to:[{0}]
+receiverBase.start=Starting replication listener on address [{0}]
 receiverBase.udp.bind=UDP Receiver Server Socket bound to:[{0}]
 receiverBase.unable.bind=Unable to bind server socket to:[{0}] throwing error.
 receiverBase.unable.bind.udp=Unable to bind UDP socket to:[{0}] throwing error.
diff --git a/java/org/apache/catalina/tribes/transport/ReceiverBase.java b/java/org/apache/catalina/tribes/transport/ReceiverBase.java
index efc194a172..507865cd7a 100644
--- a/java/org/apache/catalina/tribes/transport/ReceiverBase.java
+++ b/java/org/apache/catalina/tribes/transport/ReceiverBase.java
@@ -183,7 +183,7 @@ public abstract class ReceiverBase implements ChannelReceiver, ListenCallback, R
                     host = InetAddress.getLocalHost().getHostAddress();
                 }
                 if (log.isDebugEnabled()) {
-                    log.debug("Starting replication listener on address:"+ host);
+                    log.debug(sm.getString("receiverBase.start", host));
                 }
                 bind = InetAddress.getByName(host);
             } catch (IOException ioe) {
diff --git a/java/org/apache/catalina/tribes/transport/nio/LocalStrings.properties b/java/org/apache/catalina/tribes/transport/nio/LocalStrings.properties
index 7419037f9a..df2b56c77f 100644
--- a/java/org/apache/catalina/tribes/transport/nio/LocalStrings.properties
+++ b/java/org/apache/catalina/tribes/transport/nio/LocalStrings.properties
@@ -16,7 +16,9 @@
 nioReceiver.alreadyStarted=ServerSocketChannel already started
 nioReceiver.cleanup.fail=Unable to cleanup on selector close
 nioReceiver.clientDisconnect=Replication client disconnected, error when polling key. Ignoring client.
+nioReceiver.closeError=Close error
 nioReceiver.eventsError=Error processing events
+nioReceiver.noThread=No TcpReplicationThread available
 nioReceiver.requestError=Unable to process request in NioReceiver
 nioReceiver.run.fail=Unable to run replication listener
 nioReceiver.start.fail=Unable to start cluster receiver
@@ -44,6 +46,7 @@ nioSender.unknown.state=Data is in unknown state. readyOps=[{0}]
 
 parallelNioSender.error.keepalive=Error during keepalive test for sender:[{0}]
 parallelNioSender.operation.timedout=Operation has timed out([{0}] ms.).
+parallelNioSender.selectorCloseFail=Failed to close selector
 parallelNioSender.send.fail=Member send is failing for:[{0}] ; Setting to suspect.
 parallelNioSender.send.fail.retrying=Member send is failing for:[{0}] ; Setting to suspect and retrying.
 parallelNioSender.send.failed=Parallel NIO send failed.
diff --git a/java/org/apache/catalina/tribes/transport/nio/NioReceiver.java b/java/org/apache/catalina/tribes/transport/nio/NioReceiver.java
index 4af074bf25..3d587c1f28 100644
--- a/java/org/apache/catalina/tribes/transport/nio/NioReceiver.java
+++ b/java/org/apache/catalina/tribes/transport/nio/NioReceiver.java
@@ -191,16 +191,16 @@ public class NioReceiver extends ReceiverBase implements Runnable, NioReceiverMB
         key.attach(null);
         if (key.channel() instanceof SocketChannel) {
             try { ((SocketChannel)key.channel()).socket().close(); } catch (IOException e) { if (log.isDebugEnabled()) {
-                log.debug("", e);
+                log.debug(sm.getString("nioReceiver.closeError"), e);
             } }
         }
         if (key.channel() instanceof DatagramChannel) {
             try { ((DatagramChannel)key.channel()).socket().close(); } catch (Exception e) { if (log.isDebugEnabled()) {
-                log.debug("", e);
+                log.debug(sm.getString("nioReceiver.closeError"), e);
             } }
         }
         try { key.channel().close(); } catch (IOException e) { if (log.isDebugEnabled()) {
-            log.debug("", e);
+            log.debug(sm.getString("nioReceiver.closeError"), e);
         } }
 
     }
@@ -346,7 +346,7 @@ public class NioReceiver extends ReceiverBase implements Runnable, NioReceiverMB
                 datagramChannel.close();
             }catch (Exception iox) {
                 if (log.isDebugEnabled()) {
-                    log.debug("Unable to close datagram channel.",iox);
+                    log.debug(sm.getString("nioReceiver.closeError"), iox);
                 }
             }
             datagramChannel=null;
@@ -473,7 +473,7 @@ public class NioReceiver extends ReceiverBase implements Runnable, NioReceiverMB
             // thread becomes available, the thread pool itself has a waiting mechanism
             // so we will not wait here.
             if (log.isDebugEnabled()) {
-                log.debug("No TcpReplicationThread available");
+                log.debug(sm.getString("nioReceiver.noThread"));
             }
         } else {
             // invoking this wakes up the worker thread then returns
diff --git a/java/org/apache/catalina/tribes/transport/nio/NioReplicationTask.java b/java/org/apache/catalina/tribes/transport/nio/NioReplicationTask.java
index 05e8f77a72..7fd5ecbe1a 100644
--- a/java/org/apache/catalina/tribes/transport/nio/NioReplicationTask.java
+++ b/java/org/apache/catalina/tribes/transport/nio/NioReplicationTask.java
@@ -110,7 +110,7 @@ public class NioReplicationTask extends AbstractRxTask {
             } else if ( e instanceof IOException ) {
                 //don't spew out stack traces for IO exceptions unless debug is enabled.
                 if (log.isDebugEnabled()) {
-                    log.debug ("IOException in replication worker, unable to drain channel. Probable cause: Keep alive socket closed["+e.getMessage()+"].", e);
+                    log.debug(sm.getString("nioReplicationTask.unable.drainChannel.ioe", e.getMessage()), e);
                 } else {
                     log.warn (sm.getString("nioReplicationTask.unable.drainChannel.ioe", e.getMessage()));
                 }
diff --git a/java/org/apache/catalina/tribes/transport/nio/ParallelNioSender.java b/java/org/apache/catalina/tribes/transport/nio/ParallelNioSender.java
index 68dfbca08a..f73347d5ff 100644
--- a/java/org/apache/catalina/tribes/transport/nio/ParallelNioSender.java
+++ b/java/org/apache/catalina/tribes/transport/nio/ParallelNioSender.java
@@ -428,7 +428,7 @@ public class ParallelNioSender extends AbstractSender implements MultiPointSende
                 selector.close();
             } catch (Exception e) {
                 if (log.isDebugEnabled()) {
-                    log.debug("Failed to close selector", e);
+                    log.debug(sm.getString("parallelNioSender.selectorCloseFail"), e);
                 }
             }
         }
diff --git a/java/org/apache/catalina/users/DataSourceUserDatabase.java b/java/org/apache/catalina/users/DataSourceUserDatabase.java
index d79082d758..8ad9aa7a7f 100644
--- a/java/org/apache/catalina/users/DataSourceUserDatabase.java
+++ b/java/org/apache/catalina/users/DataSourceUserDatabase.java
@@ -934,10 +934,8 @@ public class DataSourceUserDatabase extends SparseUserDatabase {
 
         if (log.isDebugEnabled()) {
             // As there are lots of parameters to configure, log some debug to help out
-            log.debug("DataSource UserDatabase features: User<->Role ["
-                    + Boolean.toString(userRoleTable != null && roleNameCol != null)
-                    + "], Roles [" + Boolean.toString(isRoleStoreDefined())
-                    + "], Groups [" + Boolean.toString(isRoleStoreDefined()) + "]");
+            log.debug(sm.getString("dataSourceUserDatabase.features", Boolean.toString(userRoleTable != null && roleNameCol != null),
+                    Boolean.toString(isRoleStoreDefined()), Boolean.toString(isGroupStoreDefined())));
         }
 
         dbWriteLock.lock();
diff --git a/java/org/apache/catalina/users/LocalStrings.properties b/java/org/apache/catalina/users/LocalStrings.properties
index 4c946de163..56bea7c03f 100644
--- a/java/org/apache/catalina/users/LocalStrings.properties
+++ b/java/org/apache/catalina/users/LocalStrings.properties
@@ -14,6 +14,7 @@
 # limitations under the License.
 
 dataSourceUserDatabase.exception=Exception accessing the database
+dataSourceUserDatabase.features=DataSource UserDatabase features: User <-> Role [{0}], Roles [{1}], Groups [{2}]
 
 memoryUserDatabase.fileClose=Failed to close [{0}]
 memoryUserDatabase.fileDelete=Failed to delete [{0}]
diff --git a/java/org/apache/catalina/valves/ErrorReportValve.java b/java/org/apache/catalina/valves/ErrorReportValve.java
index ee5b4a2ec0..7832b4f3ae 100644
--- a/java/org/apache/catalina/valves/ErrorReportValve.java
+++ b/java/org/apache/catalina/valves/ErrorReportValve.java
@@ -329,7 +329,7 @@ public class ErrorReportValve extends ValveBase {
             } catch (Throwable t) {
                 ExceptionUtils.handleThrowable(t);
                 if (container.getLogger().isDebugEnabled()) {
-                    container.getLogger().debug("Failure to set the content-type of response", t);
+                    container.getLogger().debug(sm.getString("errorReportValve.contentTypeFail"), t);
                 }
             }
             Writer writer = response.getReporter();
diff --git a/java/org/apache/catalina/valves/ExtendedAccessLogValve.java b/java/org/apache/catalina/valves/ExtendedAccessLogValve.java
index fd2439ad2d..c75e41dc01 100644
--- a/java/org/apache/catalina/valves/ExtendedAccessLogValve.java
+++ b/java/org/apache/catalina/valves/ExtendedAccessLogValve.java
@@ -483,8 +483,8 @@ public class ExtendedAccessLogValve extends AccessLogValve {
 
     @Override
     protected AccessLogElement[] createLogElements() {
-        if (log.isDebugEnabled()) {
-            log.debug("decodePattern, pattern =" + pattern);
+        if (log.isTraceEnabled()) {
+            log.trace("decodePattern, pattern =" + pattern);
         }
         List<AccessLogElement> list = new ArrayList<>();
 
diff --git a/java/org/apache/catalina/valves/JsonErrorReportValve.java b/java/org/apache/catalina/valves/JsonErrorReportValve.java
index c698ca3ce5..c073783150 100644
--- a/java/org/apache/catalina/valves/JsonErrorReportValve.java
+++ b/java/org/apache/catalina/valves/JsonErrorReportValve.java
@@ -93,7 +93,7 @@ public class JsonErrorReportValve extends ErrorReportValve {
             } catch (Throwable t) {
                 ExceptionUtils.handleThrowable(t);
                 if (container.getLogger().isDebugEnabled()) {
-                    container.getLogger().debug("Failure to set the content-type of response", t);
+                    container.getLogger().debug(sm.getString("errorReportValve.contentTypeFail"), t);
                 }
             }
             Writer writer = response.getReporter();
diff --git a/java/org/apache/catalina/valves/LoadBalancerDrainingValve.java b/java/org/apache/catalina/valves/LoadBalancerDrainingValve.java
index 45b1ef5555..09214f2b54 100644
--- a/java/org/apache/catalina/valves/LoadBalancerDrainingValve.java
+++ b/java/org/apache/catalina/valves/LoadBalancerDrainingValve.java
@@ -157,7 +157,7 @@ public class LoadBalancerDrainingValve extends ValveBase {
                 !request.isRequestedSessionIdValid()) {
 
             if (containerLog.isDebugEnabled()) {
-                containerLog.debug("Load-balancer is in DISABLED state; draining this node");
+                containerLog.debug(sm.getString("loadBalancerDrainingValve.draining"));
             }
 
             boolean ignoreRebalance = false;
@@ -187,8 +187,7 @@ public class LoadBalancerDrainingValve extends ValveBase {
 
             if (ignoreRebalance) {
                 if (containerLog.isDebugEnabled()) {
-                    containerLog.debug("Client is presenting a valid " + _ignoreCookieName +
-                            " cookie, re-balancing is being skipped");
+                    containerLog.debug(sm.getString("loadBalancerDrainingValve.skip", _ignoreCookieName));
                 }
 
                 getNext().invoke(request, response);
diff --git a/java/org/apache/catalina/valves/LocalStrings.properties b/java/org/apache/catalina/valves/LocalStrings.properties
index 247139f0f1..13466d2f12 100644
--- a/java/org/apache/catalina/valves/LocalStrings.properties
+++ b/java/org/apache/catalina/valves/LocalStrings.properties
@@ -31,6 +31,7 @@ errorReportValve.errorPageIOException=Unable to display error page at [{0}] due
 errorReportValve.errorPageNotFound=Unable to find a static error page at [{0}]
 errorReportValve.exception=Exception
 errorReportValve.exceptionReport=Exception Report
+errorReportValve.contentTypeFail=Failure to set the content-type of response
 errorReportValve.message=Message
 errorReportValve.noDescription=No description available
 errorReportValve.note=Note
@@ -128,6 +129,9 @@ http.511.reason=Network Authentication Required
 jdbcAccessLogValve.close=Failed to close database
 jdbcAccessLogValve.exception=Exception performing insert access entry
 
+loadBalancerDrainingValve.draining=Load-balancer is in DISABLED state, draining this node
+loadBalancerDrainingValve.skip=Client is presenting a valid [{0}] cookie, re-balancing is being skipped
+
 patternTokenizer.unexpectedParenthesis=Unexpected ')' in pattern
 
 persistentValve.acquireFailed=The request for [{0}] did not obtain the per session Semaphore as no permit was available
@@ -137,6 +141,8 @@ persistentValve.requestIgnore=The request for [{0}] was ignored by this Valve as
 persistentValve.requestProcess=The request for [{0}] will be processed by this Valve as it does not match the configured filter
 persistentValve.sessionLoadFail=Loading session [{0}] from the store failed
 
+proxyErrorReportValve.error=Proxy error to [{0}]
+
 remoteCidrValve.invalid=Invalid configuration provided for [{0}]. See previous messages for details.
 remoteCidrValve.noPort=Request does not contain a valid server port. Request denied.
 remoteCidrValve.noRemoteIp=Client does not have an IP address. Request denied.
@@ -153,6 +159,7 @@ requestFilterValve.deny=Denied request for [{0}] based on property [{1}]
 sslValve.certError=Failed to process certificate string [{0}] to create a java.security.cert.X509Certificate object
 sslValve.invalidProvider=The SSL provider specified on the connector associated with this request of [{0}] is invalid. The certificate data could not be processed.
 
+stuckThreadDetectionValve.interrupted=Thread interrupted after the request is finished, ignoring
 stuckThreadDetectionValve.notifyStuckThreadCompleted=Thread [{0}] (id=[{3}]) was previously reported to be stuck but has completed. It was active for approximately [{1}] milliseconds.{2,choice,0#|0< There is/are still [{2}] thread(s) that are monitored by this Valve and may be stuck.}
 stuckThreadDetectionValve.notifyStuckThreadDetected=Thread [{0}] (id=[{6}]) has been active for [{1}] milliseconds (since [{2}]) to serve the same request for [{4}] and may be stuck (configured threshold for this StuckThreadDetectionValve is [{5}] seconds). There is/are [{3}] thread(s) in total that are monitored by this Valve and may be stuck.
 stuckThreadDetectionValve.notifyStuckThreadInterrupted=Thread [{0}] (id=[{5}]) has been interrupted because it was active for [{1}] milliseconds (since [{2}]) to serve the same request for [{3}] and was probably stuck (configured interruption threshold for this StuckThreadDetectionValve is [{4}] seconds).
diff --git a/java/org/apache/catalina/valves/ProxyErrorReportValve.java b/java/org/apache/catalina/valves/ProxyErrorReportValve.java
index 3371ee55e6..d6f7243825 100644
--- a/java/org/apache/catalina/valves/ProxyErrorReportValve.java
+++ b/java/org/apache/catalina/valves/ProxyErrorReportValve.java
@@ -212,7 +212,7 @@ public class ProxyErrorReportValve extends ErrorReportValve {
                 IOTools.flow(inputStream, outputStream);
             } catch (URISyntaxException | IOException | IllegalArgumentException e) {
                 if (log.isDebugEnabled()) {
-                    log.debug("Proxy error to " + urlString, e);
+                    log.debug(sm.getString("proxyErrorReportValve.error", urlString), e);
                 }
                 // Ignore
             } finally {
diff --git a/java/org/apache/catalina/valves/StuckThreadDetectionValve.java b/java/org/apache/catalina/valves/StuckThreadDetectionValve.java
index 462c568e3b..a523029d75 100644
--- a/java/org/apache/catalina/valves/StuckThreadDetectionValve.java
+++ b/java/org/apache/catalina/valves/StuckThreadDetectionValve.java
@@ -321,7 +321,7 @@ public class StuckThreadDetectionValve extends ValveBase {
                     // going out from here, maybe already serving a new request
                     this.interruptionSemaphore.acquire();
                 } catch (InterruptedException e) {
-                    log.debug("thread interrupted after the request is finished, ignoring", e);
+                    log.debug(sm.getString("stuckThreadDetectionValve.interrupted"), e);
                 }
                 // no need to release the semaphore, it will be GCed
             }
diff --git a/java/org/apache/catalina/valves/rewrite/LocalStrings.properties b/java/org/apache/catalina/valves/rewrite/LocalStrings.properties
index 34e6248834..db07290ebb 100644
--- a/java/org/apache/catalina/valves/rewrite/LocalStrings.properties
+++ b/java/org/apache/catalina/valves/rewrite/LocalStrings.properties
@@ -23,4 +23,6 @@ rewriteValve.closeError=Error closing configuration
 rewriteValve.invalidFlags=Invalid flag in [{0}] flags [{1}]
 rewriteValve.invalidLine=Invalid line [{0}]
 rewriteValve.invalidMapClassName=Invalid map class name [{0}]
+rewriteValve.noConfiguration=No configuration resource found [{0}]
+rewriteValve.readConfiguration=Read configuration from [/WEB-INF/{0}]
 rewriteValve.readError=Error reading configuration
diff --git a/java/org/apache/catalina/valves/rewrite/RewriteValve.java b/java/org/apache/catalina/valves/rewrite/RewriteValve.java
index 356c4b03b2..8beb2ac3ae 100644
--- a/java/org/apache/catalina/valves/rewrite/RewriteValve.java
+++ b/java/org/apache/catalina/valves/rewrite/RewriteValve.java
@@ -142,13 +142,14 @@ public class RewriteValve extends ValveBase {
         // Process configuration file for this valve
         if (getContainer() instanceof Context) {
             context = true;
+            String webInfResourcePath = "/WEB-INF/" + resourcePath;
             is = ((Context) getContainer()).getServletContext()
-                .getResourceAsStream("/WEB-INF/" + resourcePath);
+                .getResourceAsStream(webInfResourcePath);
             if (containerLog.isDebugEnabled()) {
                 if (is == null) {
-                    containerLog.debug("No configuration resource found: /WEB-INF/" + resourcePath);
+                    containerLog.debug(sm.getString("rewriteValve.noConfiguration", webInfResourcePath));
                 } else {
-                    containerLog.debug("Read configuration from: /WEB-INF/" + resourcePath);
+                    containerLog.debug(sm.getString("rewriteValve.readConfiguration", webInfResourcePath));
                 }
             }
         } else {
@@ -158,7 +159,7 @@ public class RewriteValve extends ValveBase {
                 is = resource.getInputStream();
             } catch (IOException e) {
                 if (containerLog.isDebugEnabled()) {
-                    containerLog.debug("No configuration resource found: " + resourceName, e);
+                    containerLog.debug(sm.getString("rewriteValve.noConfiguration", resourceName), e);
                 }
             }
         }
diff --git a/java/org/apache/coyote/AbstractProcessor.java b/java/org/apache/coyote/AbstractProcessor.java
index 44439a668e..c61be06dd6 100644
--- a/java/org/apache/coyote/AbstractProcessor.java
+++ b/java/org/apache/coyote/AbstractProcessor.java
@@ -209,7 +209,7 @@ public abstract class AbstractProcessor extends AbstractProcessorLight implement
                 }
             } catch (IOException ioe) {
                 if (getLog().isDebugEnabled()) {
-                    getLog().debug("Unable to write async data.", ioe);
+                    getLog().debug(sm.getString("abstractProcessor.asyncFail"), ioe);
                 }
                 status = SocketEvent.ERROR;
                 request.setAttribute(RequestDispatcher.ERROR_EXCEPTION, ioe);
diff --git a/java/org/apache/coyote/LocalStrings.properties b/java/org/apache/coyote/LocalStrings.properties
index 74adeeaceb..cffa960ef7 100644
--- a/java/org/apache/coyote/LocalStrings.properties
+++ b/java/org/apache/coyote/LocalStrings.properties
@@ -25,6 +25,7 @@ abstractConnectionHandler.protocolexception.debug=ProtocolExceptions are normal,
 abstractConnectionHandler.socketexception.debug=SocketExceptions are normal, ignored
 abstractConnectionHandler.upgradeCreate=Created upgrade processor [{0}] for socket wrapper [{1}]
 
+abstractProcessor.asyncFail=Unable to write async data
 abstractProcessor.fallToDebug=\n\
 \ Note: further occurrences of request parsing errors will be logged at DEBUG level.
 abstractProcessor.hostInvalid=The host [{0}] is not valid
diff --git a/java/org/apache/coyote/ajp/AjpProcessor.java b/java/org/apache/coyote/ajp/AjpProcessor.java
index ef22da9c68..2096a20c7b 100644
--- a/java/org/apache/coyote/ajp/AjpProcessor.java
+++ b/java/org/apache/coyote/ajp/AjpProcessor.java
@@ -376,7 +376,7 @@ public class AjpProcessor extends AbstractProcessor {
                         socketWrapper.flush(true);
                     } catch (IOException e) {
                         if (getLog().isDebugEnabled()) {
-                            getLog().debug("Pong message failed", e);
+                            getLog().debug(sm.getString("ajpprocessor.pongFail"), e);
                         }
                         setErrorState(ErrorState.CLOSE_CONNECTION_NOW, e);
                     }
@@ -386,7 +386,7 @@ public class AjpProcessor extends AbstractProcessor {
                     // Unexpected packet type. Unread body packets should have
                     // been swallowed in finish().
                     if (getLog().isDebugEnabled()) {
-                        getLog().debug("Unexpected message: " + type);
+                        getLog().debug(sm.getString("ajpprocessor.unexpectedMessage", type));
                     }
                     setErrorState(ErrorState.CLOSE_CONNECTION_NOW, null);
                     break;
diff --git a/java/org/apache/coyote/ajp/LocalStrings.properties b/java/org/apache/coyote/ajp/LocalStrings.properties
index 623f82c4a9..be8a46c100 100644
--- a/java/org/apache/coyote/ajp/LocalStrings.properties
+++ b/java/org/apache/coyote/ajp/LocalStrings.properties
@@ -23,10 +23,12 @@ ajpmessage.overflow=Overflow error for buffer adding [{0}] bytes at position [{1
 ajpprocessor.certs.fail=Certificate conversion failed
 ajpprocessor.header.error=Header message parsing failed
 ajpprocessor.header.tooLong=Header message of length [{0}] received but the packetSize is only [{1}]
+ajpprocessor.pongFail=Pong message failed
 ajpprocessor.readtimeout=Timeout attempting to read data from the socket
 ajpprocessor.request.prepare=Error preparing request
 ajpprocessor.request.process=Error processing request
 ajpprocessor.response.invalidHeader=The HTTP response header [{0}] with value [{1}] has been removed from the response because it is invalid
+ajpprocessor.unexpectedMessage=Unexpected message type [{0}]
 ajpprocessor.unknownAttribute=Rejecting request due to unknown request attribute [{0}] received from reverse proxy
 
 ajpprotocol.noSSL=SSL is not supported with AJP. The SSL host configuration for [{0}] was ignored
diff --git a/java/org/apache/coyote/http11/filters/GzipOutputFilter.java b/java/org/apache/coyote/http11/filters/GzipOutputFilter.java
index 29c4b15f97..14c68db9a5 100644
--- a/java/org/apache/coyote/http11/filters/GzipOutputFilter.java
+++ b/java/org/apache/coyote/http11/filters/GzipOutputFilter.java
@@ -26,6 +26,7 @@ import org.apache.coyote.http11.HttpOutputBuffer;
 import org.apache.coyote.http11.OutputFilter;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.util.res.StringManager;
 
 /**
  * Gzip output filter.
@@ -35,6 +36,7 @@ import org.apache.juli.logging.LogFactory;
 public class GzipOutputFilter implements OutputFilter {
 
     protected static final Log log = LogFactory.getLog(GzipOutputFilter.class);
+    private static final StringManager sm = StringManager.getManager(GzipOutputFilter.class);
 
 
     // ----------------------------------------------------- Instance Variables
@@ -98,7 +100,7 @@ public class GzipOutputFilter implements OutputFilter {
                 compressionStream.flush();
             } catch (IOException e) {
                 if (log.isDebugEnabled()) {
-                    log.debug("Ignored exception while flushing gzip filter", e);
+                    log.debug(sm.getString("gzipOutputFilter.flushFail"), e);
                 }
             }
         }
diff --git a/java/org/apache/coyote/http11/filters/LocalStrings.properties b/java/org/apache/coyote/http11/filters/LocalStrings.properties
index 3114a87d0a..3650316b88 100644
--- a/java/org/apache/coyote/http11/filters/LocalStrings.properties
+++ b/java/org/apache/coyote/http11/filters/LocalStrings.properties
@@ -29,4 +29,6 @@ chunkedInputFilter.invalidTrailerHeaderValue=Invalid trailer header value (contr
 chunkedInputFilter.maxExtension=maxExtensionSize exceeded
 chunkedInputFilter.maxTrailer=maxTrailerSize exceeded
 
+gzipOutputFilter.flushFail=Ignored exception while flushing gzip filter
+
 inputFilter.maxSwallow=maxSwallowSize exceeded
diff --git a/java/org/apache/jasper/JspC.java b/java/org/apache/jasper/JspC.java
index 727a56e7a9..dc79af668b 100644
--- a/java/org/apache/jasper/JspC.java
+++ b/java/org/apache/jasper/JspC.java
@@ -1065,8 +1065,7 @@ public class JspC extends Task implements Options {
         throws IOException
     {
         if (log.isDebugEnabled()) {
-            log.debug("Generating web mapping for file " + file
-                      + " using compilation context " + clctxt);
+            log.debug(Localizer.getMessage("jspc.generatingMapping", file, clctxt));
         }
 
         String className = clctxt.getServletClassName();
@@ -1230,7 +1229,7 @@ public class JspC extends Task implements Options {
     protected void processFile(String file) throws JasperException {
 
         if (log.isDebugEnabled()) {
-            log.debug("Processing file: " + file);
+            log.debug(Localizer.getMessage("jspc.processing", file));
         }
 
         ClassLoader originalClassLoader = null;
@@ -1273,7 +1272,7 @@ public class JspC extends Task implements Options {
             // the .java file
             if( clc.isOutDated(compile) ) {
                 if (log.isDebugEnabled()) {
-                    log.debug(jspUri + " is out dated, compiling...");
+                    log.debug(Localizer.getMessage("jspc.outdated", jspUri));
                 }
 
                 clc.compile(compile, true);
@@ -1282,7 +1281,7 @@ public class JspC extends Task implements Options {
             // Generate mapping
             generateWebMapping( file, clctxt );
             if ( showSuccess ) {
-                log.info( "Built File: " + file );
+                log.info(Localizer.getMessage("jspc.built", file));
             }
 
         } catch (JasperException je) {
@@ -1350,7 +1349,7 @@ public class JspC extends Task implements Options {
     @Override
     public void execute() {
         if(log.isDebugEnabled()) {
-            log.debug("execute() starting for " + pages.size() + " pages.");
+            log.debug(Localizer.getMessage("jspc.start", pages.size()));
         }
 
         try {
diff --git a/java/org/apache/jasper/compiler/AntCompiler.java b/java/org/apache/jasper/compiler/AntCompiler.java
index b615c2395f..632954e23b 100644
--- a/java/org/apache/jasper/compiler/AntCompiler.java
+++ b/java/org/apache/jasper/compiler/AntCompiler.java
@@ -255,8 +255,7 @@ public class AntCompiler extends Compiler {
 
         if( log.isDebugEnabled() ) {
             long t2 = System.currentTimeMillis();
-            log.debug("Compiled " + ctxt.getServletJavaFileName() + " "
-                      + (t2-t1) + "ms");
+            log.debug(Localizer.getMessage("jsp.compiled", ctxt.getServletJavaFileName(), Long.valueOf(t2 - t1)));
         }
 
         logger = null;
diff --git a/java/org/apache/jasper/compiler/Compiler.java b/java/org/apache/jasper/compiler/Compiler.java
index 89f11919cc..731750179f 100644
--- a/java/org/apache/jasper/compiler/Compiler.java
+++ b/java/org/apache/jasper/compiler/Compiler.java
@@ -548,8 +548,7 @@ public abstract class Compiler {
                 }
             } catch (Exception e) {
                 if (log.isDebugEnabled()) {
-                    log.debug("Problem accessing resource. Treat as outdated.",
-                            e);
+                    log.debug(Localizer.getMessage("jsp.error.compiler.missingResource"), e);
                 }
                 return true;
             }
diff --git a/java/org/apache/jasper/compiler/JDTCompiler.java b/java/org/apache/jasper/compiler/JDTCompiler.java
index 65868661e0..2a19f14794 100644
--- a/java/org/apache/jasper/compiler/JDTCompiler.java
+++ b/java/org/apache/jasper/compiler/JDTCompiler.java
@@ -515,8 +515,7 @@ public class JDTCompiler extends org.apache.jasper.compiler.Compiler {
 
         if( log.isDebugEnabled() ) {
             long t2=System.currentTimeMillis();
-            log.debug("Compiled " + ctxt.getServletJavaFileName() + " "
-                      + (t2-t1) + "ms");
+            log.debug(Localizer.getMessage("jsp.compiled", ctxt.getServletJavaFileName(), Long.valueOf(t2 - t1)));
         }
 
         if (ctxt.isPrototypeMode()) {
diff --git a/java/org/apache/jasper/compiler/JspReader.java b/java/org/apache/jasper/compiler/JspReader.java
index 20efad478a..df3ee8a0f4 100644
--- a/java/org/apache/jasper/compiler/JspReader.java
+++ b/java/org/apache/jasper/compiler/JspReader.java
@@ -127,7 +127,7 @@ class JspReader {
                     reader.close();
                 } catch (Exception any) {
                     if(log.isDebugEnabled()) {
-                        log.debug("Exception closing reader: ", any);
+                        log.debug(Localizer.getMessage("jsp.error.file.close"), any);
                     }
                 }
             }
diff --git a/java/org/apache/jasper/optimizations/ELInterpreterTagSetters.java b/java/org/apache/jasper/optimizations/ELInterpreterTagSetters.java
index 23202d73a7..e2ea5f1773 100644
--- a/java/org/apache/jasper/optimizations/ELInterpreterTagSetters.java
+++ b/java/org/apache/jasper/optimizations/ELInterpreterTagSetters.java
@@ -26,6 +26,7 @@ import jakarta.el.ELResolver;
 import org.apache.jasper.JspCompilationContext;
 import org.apache.jasper.compiler.ELInterpreter;
 import org.apache.jasper.compiler.JspUtil;
+import org.apache.jasper.compiler.Localizer;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 
@@ -110,7 +111,7 @@ public class ELInterpreterTagSetters implements ELInterpreter {
                     BigDecimal unused = new BigDecimal(m.group(2));
                     result = "new java.math.BigDecimal(\"" + m.group(2) + "\")";
                 } catch (NumberFormatException e) {
-                    log.debug("Failed to convert [" + m.group(2) + "] to BigDecimal", e);
+                    log.debug(Localizer.getMessage("jsp.error.typeConversion", m.group(2), "BigDecimal"), e);
                     // Continue and resolve the value at runtime
                 }
             }
@@ -128,7 +129,7 @@ public class ELInterpreterTagSetters implements ELInterpreter {
                         result = "Long.valueOf(\"" + m.group(2) + "\")";
                     }
                 } catch (NumberFormatException e) {
-                    log.debug("Failed to convert [" + m.group(2) + "] to Long", e);
+                    log.debug(Localizer.getMessage("jsp.error.typeConversion", m.group(2), "Long"), e);
                     // Continue and resolve the value at runtime
                 }
             }
@@ -145,7 +146,7 @@ public class ELInterpreterTagSetters implements ELInterpreter {
                         result = "Integer.valueOf(\"" + m.group(2) + "\")";
                     }
                 } catch (NumberFormatException e) {
-                    log.debug("Failed to convert [" + m.group(2) + "] to Integer", e);
+                    log.debug(Localizer.getMessage("jsp.error.typeConversion", m.group(2), "Integer"), e);
                     // Continue and resolve the value at runtime
                 }
             }
@@ -163,7 +164,7 @@ public class ELInterpreterTagSetters implements ELInterpreter {
                         result = "Short.valueOf(\"" + m.group(2) + "\")";
                     }
                 } catch (NumberFormatException e) {
-                    log.debug("Failed to convert [" + m.group(2) + "] to Short", e);
+                    log.debug(Localizer.getMessage("jsp.error.typeConversion", m.group(2), "Short"), e);
                     // Continue and resolve the value at runtime
                 }
             }
@@ -181,7 +182,7 @@ public class ELInterpreterTagSetters implements ELInterpreter {
                         result = "Byte.valueOf(\"" + m.group(2) + "\")";
                     }
                 } catch (NumberFormatException e) {
-                    log.debug("Failed to convert [" + m.group(2) + "] to Byte", e);
+                    log.debug(Localizer.getMessage("jsp.error.typeConversion", m.group(2), "Byte"), e);
                     // Continue and resolve the value at runtime
                 }
             }
@@ -198,7 +199,7 @@ public class ELInterpreterTagSetters implements ELInterpreter {
                         result = "Double.valueOf(\"" + m.group(2) + "\")";
                     }
                 } catch (NumberFormatException e) {
-                    log.debug("Failed to convert [" + m.group(2) + "] to Double", e);
+                    log.debug(Localizer.getMessage("jsp.error.typeConversion", m.group(2), "Double"), e);
                     // Continue and resolve the value at runtime
                 }
             }
@@ -216,7 +217,7 @@ public class ELInterpreterTagSetters implements ELInterpreter {
                         result = "Float.valueOf(\"" + m.group(2) + "\")";
                     }
                 } catch (NumberFormatException e) {
-                    log.debug("Failed to convert [" + m.group(2) + "] to Float", e);
+                    log.debug(Localizer.getMessage("jsp.error.typeConversion", m.group(2), "Float"), e);
                     // Continue and resolve the value at runtime
                 }
             }
@@ -229,7 +230,7 @@ public class ELInterpreterTagSetters implements ELInterpreter {
                     BigInteger unused = new BigInteger(m.group(2));
                     result = "new java.math.BigInteger(\"" + m.group(2) + "\")";
                 } catch (NumberFormatException e) {
-                    log.debug("Failed to convert [" + m.group(2) + "] to BigInteger", e);
+                    log.debug(Localizer.getMessage("jsp.error.typeConversion", m.group(2), "BigInteger"), e);
                     // Continue and resolve the value at runtime
                 }
             }
@@ -242,7 +243,7 @@ public class ELInterpreterTagSetters implements ELInterpreter {
                     Enum<?> enumValue = Enum.valueOf((Class<? extends Enum>) expectedType, m.group(2));
                     result = expectedType.getName() + "." + enumValue.name();
                 } catch (IllegalArgumentException iae) {
-                    log.debug("Failed to convert [" + m.group(2) + "] to Enum type [" + expectedType.getName() + "]", iae);
+                    log.debug(Localizer.getMessage("jsp.error.typeConversion", m.group(2), "Enum[" + expectedType.getName() + "]"), iae);
                     // Continue and resolve the value at runtime
                 }
             }
diff --git a/java/org/apache/jasper/resources/LocalStrings.properties b/java/org/apache/jasper/resources/LocalStrings.properties
index fd3c0e8837..d97e126885 100644
--- a/java/org/apache/jasper/resources/LocalStrings.properties
+++ b/java/org/apache/jasper/resources/LocalStrings.properties
@@ -15,6 +15,7 @@
 
 jasper.error.emptybodycontent.nonempty=According to TLD, tag [{0}] must be empty, but is not
 
+jsp.compiled=Compiled [{0}] {1}ms
 jsp.engine.info=Jasper JSP {0} Engine
 jsp.error.URLMustStartWithSlash=Path [{0}] must start with a slash character
 jsp.error.action.isnottagfile=[{0}] action can be used in tag files only
@@ -55,6 +56,7 @@ jsp.error.compilation.jdtProblemError=Error processing JDT problems list
 jsp.error.compilation.source=Error loading source file [{0}]
 jsp.error.compiler=No Java compiler available
 jsp.error.compiler.config=No Java compiler available for configuration options compilerClassName: [{0}] and compiler: [{1}]
+jsp.error.compiler.missingResource=Problem accessing resource, treat as outdated
 jsp.error.config_pagedir_encoding_mismatch=Page-encoding specified in jsp-property-group [{0}] is different from that specified in page directive [{1}]
 jsp.error.corresponding.servlet=Generated servlet error:\n
 jsp.error.could.not.add.taglibraries=Could not add one or more tag libraries.
@@ -75,6 +77,7 @@ jsp.error.el_interpreter_class.instantiation=Failed to load or instantiate ELInt
 jsp.error.fallback.invalidUse=jsp:fallback must be a direct child of jsp:plugin
 jsp.error.file.already.registered=Recursive include of file [{0}]
 jsp.error.file.cannot.read=Cannot read file: [{0}]
+jsp.error.file.close=Exception closing reader
 jsp.error.file.not.found=JSP file [{0}] not found
 jsp.error.flush=Exception occurred when flushing data
 jsp.error.fragmentwithtype=Cannot specify both ''fragment'' and ''type'' attributes.  If ''fragment'' is present, ''type'' is fixed as ''{0}''
@@ -241,6 +244,7 @@ jsp.error.tld.unable_to_get_jar=Unable to get JAR resource [{0}] containing TLD:
 jsp.error.tld.url=Bad TLD URL [{0}]
 jsp.error.tlv.invalid.page=Validation error messages from TagLibraryValidator for [{0}] in [{1}]
 jsp.error.tlvclass.instantiation=Failed to load or instantiate TagLibraryValidator class: [{0}]
+jsp.error.typeConversion=Failed to convert [{0}] to {1}
 jsp.error.unable.compile=Unable to compile class for JSP
 jsp.error.unable.deleteClassFile=Unable to delete class file [{0}]
 jsp.error.unable.getType=Unable to extract type from [{0}]
@@ -319,6 +323,7 @@ jsp.warning.unsupported.targetVM=Unsupported target VM [{0}] requested, using [{
 jsp.warning.useInstanceManagerForTags=Warning: Invalid value for the initParam useInstanceManagerForTags. Will use the default value of "false"
 jsp.warning.xpoweredBy=Warning: Invalid value for the initParam xpoweredBy. Will use the default value of "false"
 
+jspc.built=Built file [{0}]
 jspc.delete.fail=Failed to delete file [{0}]
 jspc.error.compilation=Compilation error
 jspc.error.fileDoesNotExist=The file argument [{0}] does not exist
@@ -329,8 +334,12 @@ jspc.error.minThreadCount=There must be at least one thread [{0}]
 jspc.error.parseThreadCount=Cannot parse thread count [{0}]
 jspc.error.unknownOption=Unrecognized option [{0}]. Use -help for help.
 jspc.errorCount=Error count: [{0}]
+jspc.generatingMapping=Generating web mapping for file [{0}] using compilation context [{1}]
 jspc.generation.result=Generation completed with [{0}] errors in [{1}] milliseconds
 jspc.implicit.uriRoot=uriRoot implicitly set to [{0}]
+jspc.outdated=[{0}] is outdated and is compiled
+jspc.processing=Processing file [{0}]
+jspc.start=Execute starting for {0} pages
 jspc.usage=Usage: jspc <options> [--] <jsp files>\n\
 where jsp files is\n\
 \    -webapp <dir>         A directory containing a web-app, whose JSP pages\n\
diff --git a/java/org/apache/tomcat/util/buf/LocalStrings.properties b/java/org/apache/tomcat/util/buf/LocalStrings.properties
index a9ed4914c6..7fb7314b6a 100644
--- a/java/org/apache/tomcat/util/buf/LocalStrings.properties
+++ b/java/org/apache/tomcat/util/buf/LocalStrings.properties
@@ -32,6 +32,9 @@ hexUtils.fromHex.oddDigits=The input must consist of an even number of hex digit
 
 messageBytes.illegalCharacter=The Unicode character [{0}] at code point [{1}] cannot be encoded as it is outside the permitted range of 0 to 255
 
+stringCache.byteTime=ByteCache generation time: {0}ms
+stringCache.charTime=CharCache generation time: {0}ms
+
 uDecoder.eof=End of file (EOF)
 uDecoder.isHexDigit=The hexadecimal encoding is invalid
 uDecoder.noSlash=The encoded slash character is not allowed
diff --git a/java/org/apache/tomcat/util/buf/StringCache.java b/java/org/apache/tomcat/util/buf/StringCache.java
index 5b82e44f74..8f0c664dd5 100644
--- a/java/org/apache/tomcat/util/buf/StringCache.java
+++ b/java/org/apache/tomcat/util/buf/StringCache.java
@@ -27,6 +27,7 @@ import java.util.TreeMap;
 
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.util.res.StringManager;
 
 /**
  * This class implements a String cache for ByteChunk and CharChunk.
@@ -37,6 +38,7 @@ public class StringCache {
 
 
     private static final Log log = LogFactory.getLog(StringCache.class);
+    private static final StringManager sm = StringManager.getManager(StringCache.class);
 
 
     // ------------------------------------------------------- Static Variables
@@ -283,7 +285,7 @@ public class StringCache {
                         bcCache = tempbcCache;
                         if (log.isDebugEnabled()) {
                             long t2 = System.currentTimeMillis();
-                            log.debug("ByteCache generation time: " + (t2 - t1) + "ms");
+                            log.debug(sm.getString("stringCache.byteTime", Long.valueOf(t2 - t1)));
                         }
                     } else {
                         bcCount++;
@@ -391,7 +393,7 @@ public class StringCache {
                         ccCache = tempccCache;
                         if (log.isDebugEnabled()) {
                             long t2 = System.currentTimeMillis();
-                            log.debug("CharCache generation time: " + (t2 - t1) + "ms");
+                            log.debug(sm.getString("stringCache.charTime", Long.valueOf(t2 - t1)));
                         }
                     } else {
                         ccCount++;
diff --git a/java/org/apache/tomcat/util/digester/Digester.java b/java/org/apache/tomcat/util/digester/Digester.java
index 5d06d75cd3..034aa8bbd1 100644
--- a/java/org/apache/tomcat/util/digester/Digester.java
+++ b/java/org/apache/tomcat/util/digester/Digester.java
@@ -1403,7 +1403,7 @@ public class Digester extends DefaultHandler2 {
                         }
                     } catch (URISyntaxException e) {
                         if (log.isDebugEnabled()) {
-                            log.debug("Invalid URI '" + baseURI + "' or '" + systemId + "'");
+                            log.debug(sm.getString("digester.invalidURI", baseURI, systemId));
                         }
                     }
                 }
diff --git a/java/org/apache/tomcat/util/digester/FactoryCreateRule.java b/java/org/apache/tomcat/util/digester/FactoryCreateRule.java
index 7fdff66531..91f7349e2e 100644
--- a/java/org/apache/tomcat/util/digester/FactoryCreateRule.java
+++ b/java/org/apache/tomcat/util/digester/FactoryCreateRule.java
@@ -98,12 +98,12 @@ public class FactoryCreateRule extends Rule {
 
             } catch (Exception e) {
                 // log message and error
-                if (digester.log.isInfoEnabled()) {
+                if (digester.log.isDebugEnabled()) {
+                    digester.log.debug(sm.getString("rule.createError",
+                            ((e.getMessage() == null) ? e.getClass().getName() : e.getMessage())), e);
+                } else if (digester.log.isInfoEnabled()) {
                     digester.log.info(sm.getString("rule.createError",
                         ((e.getMessage() == null) ? e.getClass().getName() : e.getMessage())));
-                    if (digester.log.isDebugEnabled()) {
-                        digester.log.debug("[FactoryCreateRule] Ignored exception:", e);
-                    }
                 }
                 exceptionIgnoredStack.push(Boolean.TRUE);
             }
diff --git a/java/org/apache/tomcat/util/digester/LocalStrings.properties b/java/org/apache/tomcat/util/digester/LocalStrings.properties
index 74c6c78252..f833ab873b 100644
--- a/java/org/apache/tomcat/util/digester/LocalStrings.properties
+++ b/java/org/apache/tomcat/util/digester/LocalStrings.properties
@@ -24,6 +24,7 @@ digester.error.finish=Finish event threw exception
 digester.errorLocation=Error at line [{0}] column [{1}]: [{2}]
 digester.failedToUpdateAttributes=Attribute [{0}] failed to update and remains [{1}]
 digester.failedToUpdateSystemProperty=System property [{0}] failed to update and remains [{1}]
+digester.invalidURI=Invalid URI [{0}] or [{1}]
 digester.noLocator=No Locator
 digester.noRulesFound=No rules found matching [{0}]
 digester.parseError=Parse error at line [{0}] column [{1}]
diff --git a/java/org/apache/tomcat/util/http/LocalStrings.properties b/java/org/apache/tomcat/util/http/LocalStrings.properties
index e0f0d494f6..a8f60eb911 100644
--- a/java/org/apache/tomcat/util/http/LocalStrings.properties
+++ b/java/org/apache/tomcat/util/http/LocalStrings.properties
@@ -37,6 +37,7 @@ parameters.maxCountFail.fallToDebug=\n\
 parameters.multipleDecodingFail=Character decoding failed. A total of [{0}] failures were detected but only the first was logged. Enable debug level logging for this logger to log all failures.
 parameters.noequal=Parameter starting at position [{0}] and ending at position [{1}] with a value of [{2}] was not followed by an ''='' character
 
+rfc6265CookieProcessor.expectedBytes=Parsing cookie as String, expected bytes
 rfc6265CookieProcessor.invalidAttributeName=An invalid attribute name [{0}] was specified for this cookie
 rfc6265CookieProcessor.invalidAttributeValue=An invalid attribute value [{1}] was specified for this cookie attribute [{0}]
 rfc6265CookieProcessor.invalidCharInValue=An invalid character [{0}] was present in the Cookie value
diff --git a/java/org/apache/tomcat/util/http/Rfc6265CookieProcessor.java b/java/org/apache/tomcat/util/http/Rfc6265CookieProcessor.java
index dfb19fd70c..76fa906bd1 100644
--- a/java/org/apache/tomcat/util/http/Rfc6265CookieProcessor.java
+++ b/java/org/apache/tomcat/util/http/Rfc6265CookieProcessor.java
@@ -82,7 +82,7 @@ public class Rfc6265CookieProcessor extends CookieProcessorBase {
                     if (log.isDebugEnabled()) {
                         Exception e = new Exception();
                         // TODO: Review this in light of HTTP/2
-                        log.debug("Cookies: Parsing cookie as String. Expected bytes.", e);
+                        log.debug(sm.getString("rfc6265CookieProcessor.expectedBytes"), e);
                     }
                     cookieValue.toBytes();
                 }
diff --git a/java/org/apache/tomcat/util/modeler/LocalStrings.properties b/java/org/apache/tomcat/util/modeler/LocalStrings.properties
index 8c0825d81c..90b3af24dc 100644
--- a/java/org/apache/tomcat/util/modeler/LocalStrings.properties
+++ b/java/org/apache/tomcat/util/modeler/LocalStrings.properties
@@ -37,6 +37,8 @@ managedMBean.noSet=Cannot find setter method [{0}] on resource [{1}]
 modules.digesterParseError=Error parsing registry data
 modules.readDescriptorsError=Error reading descriptors
 
+registry.createdServer=Created MBeanServer
+registry.existingServer=Using existing MBeanServer
 registry.initError=Error initializing [{0}]
 registry.invalidSource=Invalid source specified, must be either URL, File, Class or InputStream
 registry.loadError=Error loading descriptors from [{0}]
@@ -47,3 +49,4 @@ registry.nullBean=Cannot register null bean for [{0}]
 registry.objectNameCreateError=Error creating object name
 registry.registerError=Error registering MBean
 registry.unregisterError=Error unregistering MBean
+registry.unregisterExisting=Unregistering existing component [{0}]
diff --git a/java/org/apache/tomcat/util/modeler/Registry.java b/java/org/apache/tomcat/util/modeler/Registry.java
index e5034453d7..758b8d5c97 100644
--- a/java/org/apache/tomcat/util/modeler/Registry.java
+++ b/java/org/apache/tomcat/util/modeler/Registry.java
@@ -432,16 +432,15 @@ public class Registry implements RegistryMBean, MBeanRegistration {
         if (server == null) {
             synchronized (serverLock) {
                 if (server == null) {
-                    long t1 = System.currentTimeMillis();
                     if (MBeanServerFactory.findMBeanServer(null).size() > 0) {
                         server = MBeanServerFactory.findMBeanServer(null).get(0);
                         if (log.isDebugEnabled()) {
-                            log.debug("Using existing MBeanServer " + (System.currentTimeMillis() - t1));
+                            log.debug(sm.getString("registry.existingServer"));
                         }
                     } else {
                         server = ManagementFactory.getPlatformMBeanServer();
                         if (log.isDebugEnabled()) {
-                            log.debug("Created MBeanServer" + (System.currentTimeMillis() - t1));
+                            log.debug(sm.getString("registry.createdServer"));
                         }
                     }
                 }
@@ -624,7 +623,7 @@ public class Registry implements RegistryMBean, MBeanRegistration {
 
             if (getMBeanServer().isRegistered(oname)) {
                 if (log.isDebugEnabled()) {
-                    log.debug("Unregistering existing component " + oname);
+                    log.debug(sm.getString("registry.unregisterExisting", oname));
                 }
                 getMBeanServer().unregisterMBean(oname);
             }
diff --git a/java/org/apache/tomcat/util/threads/LocalStrings.properties b/java/org/apache/tomcat/util/threads/LocalStrings.properties
index 273a378551..53856f58a0 100644
--- a/java/org/apache/tomcat/util/threads/LocalStrings.properties
+++ b/java/org/apache/tomcat/util/threads/LocalStrings.properties
@@ -15,6 +15,8 @@
 
 taskQueue.notRunning=Executor not running, can't force a command into the queue
 
+taskThread.exiting=Thread exiting on purpose
+
 threadPoolExecutor.invalidKeepAlive=Core threads must have positive keep alive times
 threadPoolExecutor.queueFull=Queue capacity is full
 threadPoolExecutor.taskRejected=Task [{0}] rejected from [{1}]
diff --git a/java/org/apache/tomcat/util/threads/TaskThread.java b/java/org/apache/tomcat/util/threads/TaskThread.java
index 5a7e0f373f..b0dbb0a461 100644
--- a/java/org/apache/tomcat/util/threads/TaskThread.java
+++ b/java/org/apache/tomcat/util/threads/TaskThread.java
@@ -18,6 +18,7 @@ package org.apache.tomcat.util.threads;
 
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.util.res.StringManager;
 
 /**
  * A Thread implementation that records the time at which it was created.
@@ -26,6 +27,7 @@ import org.apache.juli.logging.LogFactory;
 public class TaskThread extends Thread {
 
     private static final Log log = LogFactory.getLog(TaskThread.class);
+    private static final StringManager sm = StringManager.getManager(TaskThread.class);
     private final long creationTime;
 
     public TaskThread(ThreadGroup group, Runnable target, String name) {
@@ -62,7 +64,7 @@ public class TaskThread extends Thread {
             } catch(StopPooledThreadException exc) {
                 //expected : we just swallow the exception to avoid disturbing
                 //debuggers like eclipse's
-                log.debug("Thread exiting on purpose", exc);
+                log.debug(sm.getString("taskThread.exiting"), exc);
             }
         }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org