Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将相同的slf4j日志与JDK8和JDK11(其中包含String.format)一起使用?_Java_Slf4j_Openjdk 11 - Fatal编程技术网

Java 如何将相同的slf4j日志与JDK8和JDK11(其中包含String.format)一起使用?

Java 如何将相同的slf4j日志与JDK8和JDK11(其中包含String.format)一起使用?,java,slf4j,openjdk-11,Java,Slf4j,Openjdk 11,如何使slf4j日志与JDK8和JDK11相同 我的java Slf4j记录器: log.info("---> {} {}", "When", String.format(matcher.group(1).replaceAll("\\{\\S+\\}", "{%s}").replace("(\\?)", ""), invocation.getArguments())); JDK8在java 8中的我的跟踪: ---> When I update text {bakery.DemoP

如何使slf4j日志与JDK8和JDK11相同

我的java Slf4j记录器:

log.info("---> {} {}", "When", String.format(matcher.group(1).replaceAll("\\{\\S+\\}", "{%s}").replace("(\\?)", ""), invocation.getArguments()));
JDK8在java 8中的我的跟踪:

---> When I update text {bakery.DemoPage-input_text_field} with {Jenkins T5}
JDK11在java 8中的我的跟踪:

---> When "I update text {bakery.DemoPage-input_text_field} with {Jenkins T5}"
编辑:

log.info("---> {} {}", "When", String.format(matcher.group(1).replaceAll("\\{\\S+\\}", "{%s}").replace("(\\?)", ""), invocation.getArguments()));
我尝试了这个方法,但结果相同:

String message = MessageFormat.format("---> {0} {1}",
                                      stepAnnotation.annotationType().getSimpleName(),
                                      String.format(matcher.group(1).replaceAll("\\{\\S+\\}", "{%s}").replace("(\\?)", ""), invocation.getArguments())
                                     );
log.info(message);
编辑(如果需要更简单的案例):

使用@M.Deinum提案编辑,但不起作用

log.info("---> {} " + matcher.group(1).replaceAll("\\{\\S+\\}", "{}").replace("(\\?)", ""), stepAnnotation.annotationType().getSimpleName(), invocation.getArguments());

---> When "I update text [bakery.DemoPage-input_text_field, Jenkins T5, []] with {}"
编辑:我尝试使用外部替换的其他方案:

String mes = String.format(matcher.group(1).replaceAll("\\{\\S+\\}", "{%s}").replace("(\\?)", ""), invocation.getArguments());
log.info("---> {} {}", stepAnnotation.annotationType().getSimpleName(), mes);

---> When "I update text {bakery.DemoPage-input_text_field} with {Jenkins T5}"

问题不是来自Slf4j,而是来自
stepAnnotation.toString()
不同于
JDK8
JDK11

openjdk11
oraclejdk11
do不尊重javadoc:

/**
 * Returns a string representation of this annotation.  The details
 * of the representation are implementation-dependent, but the following
 * may be regarded as typical:
 * <pre>
 *   &#064;com.acme.util.Name(first=Alfred, middle=E., last=Neuman)
 * </pre>
 *
 * @return a string representation of this annotation
 */
String toString();
/**
*返回此批注的字符串表示形式。细节
*表示形式的类型取决于实现,但如下所示
*可被视为典型:
* 
*   @com.acme.util.Name(first=Alfred,middle=E,last=Neuman)
* 
*
*@返回此批注的字符串表示形式
*/
字符串toString();
解决方案:

log.info("---> {} {}", "When", String.format(matcher.group(1).replaceAll("\\{\\S+\\}", "{%s}").replace("(\\?)", ""), invocation.getArguments()));
import java.lang.annotation.annotation;
导入java.lang.reflect.InvocationTargetException;
导入java.lang.reflect.Method;
导入java.lang.reflect.Modifier;
导入org.slf4j.Logger;
导入org.slf4j.LoggerFactory;
导入io.cumber.java.en.When;
公共类软件{
私有静态最终记录器log=LoggerFactory.getLogger(软件类);
@当(value=“I用{string}(\\?)更新文本{string}”)时
公共静态void main(字符串[]args){
对象为[]={“a”,“b”};
c类=软件类;
方法[]方法=c.getMethods();
方法=null;
用于(方法m:方法){
if(m.getName().equals(“main”)){
方法=m;
}
}
Annotation stepAnnotation=method.getAnnotation(When.class);

类请编辑您的问题以包含一个。只需放弃字符串格式。使用
log.info(“-->当我用{}更新文本{}”、“bakery.DemoPage-input_text_field”、“Jenkins T5”);
.SLF4J将处理替换问题,而不管使用的是什么JDK。@Progman,我添加了一个更简单的案例,但所有内容都已在文章中重现问题。我希望这将帮助您在家重现问题。@M.Deinum,您的建议不起作用,我用更多元素编辑我的文章,但不使用替换。您为什么要添加这些内容对于日志记录这样简单的事情来说是复杂的。Log4j已经支持替换。正如我所说的,将整个消息放在那里,而不是自己进行替换。