programing

sl4fj와 유사한 일반적인 문자열 대체 기능이 있습니까?

shortcode 2022. 10. 5. 21:49
반응형

sl4fj와 유사한 일반적인 문자열 대체 기능이 있습니까?

문자열 메시지를 작성하려면 sl4fj를 사용하여 치환을 사용하는 좋은 방법이 있습니다.예를 들어 다음과 같은 경우가 있습니다.

logger.info("Action {} occured on object {}.", objectA.getAction(), objectB);

교환이 여러 개 필요한 경우 다음과 같습니다.

logger.info("Action {} occured on object {} with outcome {}.", 
    new Object[]{objectA.getAction(), objectB, outcome});

질문입니다. (slf4j 로그 메시지뿐만 아니라) 문자열을 작성하는 일반적인 방법이 있습니까?예를 들어 다음과 같습니다.

String str = someMethod("Action {} occured on object {}.", objectA.getAction(), objectB);

또는

String str = someMethod("Action {} occured on object {} with outcome {}.", 
    new Object[]{objectA.getAction(), objectB, outcome});

표준 Java 라이브러리에 있는 경우 "some Method"는 무엇입니까?

String.format

String str = String.format("Action %s occured on object %s.",
   objectA.getAction(), objectB);

또는

String str = String.format("Action %s occured on object %s with outcome %s.",
   new Object[]{objectA.getAction(), objectB, outcome});

숫자 위치를 사용할 수도 있습니다. 예를 들어 다음과 같이 파라미터를 전환할 수 있습니다.

String str = String.format("Action %2$s occured on object %1$s.",
   objectA.getAction(), objectB);

String을 사용할 수 있습니다.형식 또는 메시지 형식입니다.포맷

예.,

MessageFormat.format("A sample value {1} with a sample string {0}", 
    new Object[] {"first", 1});

또는 간단히 말하면

MessageFormat.format("A sample value {1} with a sample string {0}", "first", 1);

String 내의 변수 묶음을 값으로 대체할 수 있는 솔루션을 찾고 있는 경우 Str Substitutor를 사용할 수 있습니다.

 Map<String, String> valuesMap = new HashMap<>();
 valuesMap.put("animal", "quick brown fox");
 valuesMap.put("target", "lazy dog");
 String templateString = "The ${animal} jumped over the ${target}.";
 StrSubstitutor sub = new StrSubstitutor(valuesMap);
 String resolvedString = sub.replace(templateString);

일반적으로 받아들여지는 패턴을 따릅니다.이 패턴에서는 변수가 있는 맵을 미해결 문자열과 함께 값으로 전달하고 해결된 문자열을 반환합니다.

org.slf4j.helpers를 사용하는 것이 좋습니다.MessageFormatter.이를 통해 slf4j와 동일한 포맷 스타일을 사용하는 유틸리티 메서드를 만들 수 있습니다.

// utillity method to format like slf4j
public static String format(String msg, Object... objs) {
    return MessageFormatter.arrayFormat(msg, objs).getMessage();
}

// example usage
public static void main(String[] args) {
    String msg = format("This msg is {} like slf{}j would do. {}", "formatted", 4,
            new Exception("Not substituted into the message"));

    // prints "This msg is formatted like slf4j would do. {}"    
    System.out.println(msg); 
}

메모: 어레이의 마지막 객체가 예외일 경우 slf4j 로거와 같이 메시지에서 대체되지 않습니다.예외에 액세스하려면MessageFormatter.arrayFormat(msg, objs).getThrowable().

원래 Joern Huxhorn이 Lilith용으로 작성한 Log4j2 Parameterized Message를 랩으로 선택합니다.

public static String format(final String messagePattern, Object... arguments) {
    return ParameterizedMessage.format(messagePattern, arguments);
}

슬로우 가능의 불필요한 처리를 포함하는 SLF4J MessageFormatter와는 달리 메시지 포맷에 초점을 맞추고 있습니다.

자바독 참조:

교체 가능한 각 토큰과 매개 변수를 나타내는 '{}'을(를) 포함하는 형식 문자열로 구성된 메시지를 처리합니다.

언급URL : https://stackoverflow.com/questions/5057960/is-there-a-general-string-substitution-function-similar-to-sl4fj

반응형