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

时间:2017-07-23 17:14:09

标签: 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",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
    

所以,我想我已经开始解释了。

0 个答案:

没有答案