Built-in string formatting vs string concatenation as logging parameter

前端 未结 4 2007
野性不改
野性不改 2021-01-01 10:42

I\'m using SonarLint that shows me an issue in the following line.

LOGGER.debug(\"Comparing objects: \" + object1 + \" and \" + object2);

S

4条回答
  •  滥情空心
    2021-01-01 10:53

    First let's understand the problem, then talk about solutions.

    We can make it simple, assume the following example

    LOGGER.debug("User name is " + userName + " and his email is " + email );
    

    The above logging message string consists of 4 parts
    And will require 3 String concatenations to be constructed.

    Now, let's go to what is the issue of this logging statement.

    Assume our logging level is OFF, which means that we don't interested in logging now.

    We can imagine that the String concatenations (slow operation) will be ALWAYS applied and will not consider the logging level.

    Wow, after understanding the performance issue, let's talk about the best practice.

    Solution 1 (NOT optimal)
    Instead of using String concatenations, we can use String Builder

    StringBuilder loggingMsgStringBuilder = new StringBuilder();
    loggingMsgStringBuilder.append("User name is ");
    loggingMsgStringBuilder.append(userName);
    loggingMsgStringBuilder.append(" and his email is ");
    loggingMsgStringBuilder.append(email );
    LOGGER.debug(loggingMsgStringBuilder.toString());
    

    Solution 2 (optimal)
    We don't need to construct the logging message before check the debugging level.
    So we can pass logging message format and all parts as parameters to the LOGGING engine, then delegate String concatenations operations to it, and according to the logging level, the engine will decide to concatenate or not.

    So, It's recommended to use parameterized logging as the following example

    LOGGER.debug("User name is {} and his email is {}", userName, email);
    

提交回复
热议问题