Java 服务器应用程序中PrintStream.printf()参数的额外换行

Java 服务器应用程序中PrintStream.printf()参数的额外换行,java,printf,printstream,Java,Printf,Printstream,在普通Java应用程序中,以下代码: System.out.println(System.getProperty("java.version")); System.out.println(System.getProperty("java.vendor")); System.out.printf("XXXX %s YYY\n","Something"); System.out.printf("XXXX %s YYY\n",""); System.out.printf("XXXX %d YYY\n"

在普通Java应用程序中,以下代码:

System.out.println(System.getProperty("java.version"));
System.out.println(System.getProperty("java.vendor"));
System.out.printf("XXXX %s YYY\n","Something");
System.out.printf("XXXX %s YYY\n","");
System.out.printf("XXXX %d YYY\n",123);
System.out.printf("XXXX %3.3f YYY \n",123.456);
正如预期的那样,给出了:

1.8.0_131
Oracle Corporation
XXXX Something YYY
XXXX  YYY
XXXX 123 YYY
XXXX 123.456 YYY 
作为服务器应用程序的一部分,同样的代码会产生以下结果:

1.8.0_131
Oracle Corporation
XXXX 
Something
 YYY
XXXX 
 YYY
XXXX 
123
 YYY
XXXX 
123.456
 YYY 
此外,如果我删除XXX/YYY装饰,输出是正常的(除了空字符串的行根本没有打印)

系统是Ubuntu 16.04,服务器是IBM WAS Liberty 16.0.0.4,它实际上使用上面的OpenJDK运行时(/usr/lib/jvm/java-8-OpenJDK-amd64/jre/bin/java)。现在,我看到一个
org.owasp.esapi.waf.internal.InterceptingPrintWriter.class
,这可能是罪魁祸首吗

我可能遗漏了一些非常明显的内容,或者对PrintStream做了一些操作,但是我看不到任何设置

是的,我将修改代码以使用适当的日志框架,所以这个问题是非常学术性的。我还是很好奇

在同事的帮助下,我们在Windows上进行了测试(使用Java 1.8.0_121):

  • 使用Liberty服务器:同样的问题
  • 使用Tomcat V7服务器:没问题
因此,问题将出现在服务器运行时

嗯,转储System.out的类层次结构:

  • 在常规应用程序中:

    java.io.PrintStream
    java.io.FilterOutputStream
    java.io.OutputStream
    java.lang.Object
    
  • 在Liberty服务器中:

    com.ibm.ws.logging.internal.impl.BaseTraceService.TeePrintStream
    java.io.PrintStream
    java.io.FilterOutputStream
    java.io.OutputStream
    java.lang.Object
    

因此,我想我有一个解释的开始。

你能添加更多关于你所在平台的信息吗?关于服务器?@karna添加了所需信息作为补充,建议使用
%n
而不是
\n
printf
,以提高可移植性。看起来不像是罪魁祸首,它只是不加更改地转发每个方法调用。您实际上是在逐字打印“XXXX”和“YYY”,还是这些只是您正在打印的实际内容的符号?