在普通的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):
所以问题出在服务器运行时。
好吧,转储System.out的类层次结构:
在常规应用中:
java.io.PrintStream
java.io.FilterOutputStream
java.io.OutputStream
java.lang.Object
:
com.ibm.ws.logging.internal.impl.BaseTraceService.TeePrintStream
java.io.PrintStream
java.io.FilterOutputStream
java.io.OutputStream
java.lang.Object
所以,我想我已经开始解释了。