【问题标题】:Output of Logger and System.out.println are not in orderLogger 和 System.out.println 的输出不按顺序
【发布时间】:2015-07-31 11:53:44
【问题描述】:

我想在 Eclipse 控制台中输出 logger 和 inputstream。但是每次我执行时,结果总是不一样的。我有几个类,其中一个主类可以调用其他类,并且我将记录器放在每种方法中进行调试。我将结果打印到控制台。我还有将inputstream 检索为string 并将其打印到控制台的方法。

输出示例

mai 19, 2015 4:10:58 PM ScriptPack.Section findSection
INFO: findSection OK
mai 19, 2015 4:10:58 PM ScriptPack.Section convertStringToTestCase
INFO: convertStringToTestCase OK
mai 19, 2015 4:10:58 PM ScriptPack.TestCase getIsPassed
INFO: getIsPassed OK
mai 19, 2015 4:10:58 PM ScriptPack.TestCase getName
INFO: getName OK
//Error. 
//**********EasyTest Test Report**********
//Test Case: testCase/test1.tc
//Result  : FAILED
//Start at: 2015-05-19-T16:10:58.479
mai 19, 2015 4:10:58 PM ScriptPack.TestCase settIterationNumber
INFO: settIterationNumber OK
mai 19, 2015 4:10:58 PM ScriptPack.TestCase getIterationNumber
INFO: getIterationNumber OK
mai 19, 2015 4:10:58 PM ScriptPack.TestCase getIsPassed
INFO: getIsPassed OK
Iteration number : 1
mai 19, 2015 4:10:58 PM ScriptPack.TestCase getName
INFO: getName OK
//**********EasyTest Test Report**********
//Test Case: testCase/test2.tc
mai 19, 2015 4:10:59 PM ScriptPack.TestCase setIsPassed
INFO: setIsPassed OK
//Result  : PASSED
//Start at: 2015-05-19-T16:10:58.838
Iteration number : 1
mai 19, 2015 4:10:59 PM ScriptPack.TestCase settIterationNumber
INFO: settIterationNumber OK
mai 19, 2015 4:10:59 PM ScriptPack.TestCase getIterationNumber
INFO: getIterationNumber OK
mai 19, 2015 4:10:59 PM ScriptPack.TestCase getIsPassed
INFO: getIsPassed OK
mai 19, 2015 4:10:59 PM ScriptPack.TestCase getName
INFO: getName OK
//**********EasyTest Test Report**********
//Test Case: testCase/test3.tc
mai 19, 2015 4:10:59 PM ScriptPack.TestCase setIsPassed
INFO: setIsPassed OK
//Result  : PASSED
//Start at: 2015-05-19-T16:10:59.229
mai 19, 2015 4:10:59 PM ScriptPack.TestCase settIterationNumber
INFO: settIterationNumber OK
Iteration number : 1
mai 19, 2015 4:10:59 PM ScriptPack.TestCase getIterationNumber
INFO: getIterationNumber OK
mai 19, 2015 4:10:59 PM ScriptPack.TestCase getIsPassed
INFO: getIsPassed OK
mai 19, 2015 4:10:59 PM ScriptPack.TestCase getIsPassed
INFO: getIsPassed OK
mai 19, 2015 4:10:59 PM ScriptPack.TestCase getIsPassed
INFO: getIsPassed OK
mai 19, 2015 4:10:59 PM ScriptPack.TestCaseList verifyList
INFO: verifyList NOK
mai 19, 2015 4:10:59 PM ScriptPack.TestCase getIsPassed
INFO: getIsPassed OK
mai 19, 2015 4:10:59 PM ScriptPack.TestCase getName
INFO: getName OK
mai 19, 2015 4:10:59 PM ScriptPack.TestCase settIterationNumber
INFO: settIterationNumber OK
mai 19, 2015 4:10:59 PM ScriptPack.TestCase getIterationNumber
INFO: getIterationNumber OK
mai 19, 2015 4:10:59 PM ScriptPack.TestCase getIsPassed
INFO: getIsPassed OK
mai 19, 2015 4:10:59 PM ScriptPack.TestCase getIsPassed
INFO: getIsPassed OK
mai 19, 2015 4:10:59 PM ScriptPack.TestCase getIsPassed
INFO: getIsPassed OK
mai 19, 2015 4:10:59 PM ScriptPack.TestCase getIsPassed
INFO: getIsPassed OK
mai 19, 2015 4:10:59 PM ScriptPack.TestCase getIsPassed
INFO: getIsPassed OK
mai 19, 2015 4:10:59 PM ScriptPack.TestCaseList verifyList
INFO: verifyList NOK
//Error. 
//**********EasyTest Test Report**********
//Test Case: testCase/test1.tc
//Result  : FAILED
//Start at: 2015-05-19-T16:10:59.635
Iteration number : 2

然后我重新执行并得到不同的顺序

mai 19, 2015 4:13:24 PM ScriptPack.Section findSection
INFO: findSection OK
mai 19, 2015 4:13:24 PM ScriptPack.Section convertStringToTestCase
INFO: convertStringToTestCase OK
mai 19, 2015 4:13:24 PM ScriptPack.TestCase getIsPassed
INFO: getIsPassed OK
mai 19, 2015 4:13:24 PM ScriptPack.TestCase getName
INFO: getName OK
//Error. 
//**********EasyTest Test Report**********
//Test Case: testCase/test1.tc
//Result  : FAILED
//Start at: 2015-05-19-T16:13:24.321
mai 19, 2015 4:13:24 PM ScriptPack.TestCase settIterationNumber
INFO: settIterationNumber OK
mai 19, 2015 4:13:24 PM ScriptPack.TestCase getIterationNumber
INFO: getIterationNumber OK
Iteration number : 1
mai 19, 2015 4:13:24 PM ScriptPack.TestCase getIsPassed
INFO: getIsPassed OK
mai 19, 2015 4:13:24 PM ScriptPack.TestCase getName
INFO: getName OK
//**********EasyTest Test Report**********
//Test Case: testCase/test2.tc
mai 19, 2015 4:13:25 PM ScriptPack.TestCase setIsPassed
INFO: setIsPassed OK
mai 19, 2015 4:13:25 PM ScriptPack.TestCase settIterationNumber
INFO: settIterationNumber OK
mai 19, 2015 4:13:25 PM ScriptPack.TestCase getIterationNumber
INFO: getIterationNumber OK
mai 19, 2015 4:13:25 PM ScriptPack.TestCase getIsPassed
INFO: getIsPassed OK
mai 19, 2015 4:13:25 PM ScriptPack.TestCase getName
INFO: getName OK
//Result  : PASSED
//Start at: 2015-05-19-T16:13:24.789
Iteration number : 1
//**********EasyTest Test Report**********
//Test Case: testCase/test3.tc
//Result  : PASSED
//Start at: 2015-05-19-T16:13:25.228
mai 19, 2015 4:13:25 PM ScriptPack.TestCase setIsPassed
INFO: setIsPassed OK
mai 19, 2015 4:13:25 PM ScriptPack.TestCase settIterationNumber
INFO: settIterationNumber OK
Iteration number : 1
mai 19, 2015 4:13:25 PM ScriptPack.TestCase getIterationNumber
INFO: getIterationNumber OK
mai 19, 2015 4:13:25 PM ScriptPack.TestCase getIsPassed
INFO: getIsPassed OK
mai 19, 2015 4:13:25 PM ScriptPack.TestCase getIsPassed
INFO: getIsPassed OK
mai 19, 2015 4:13:25 PM ScriptPack.TestCase getIsPassed
INFO: getIsPassed OK
mai 19, 2015 4:13:25 PM ScriptPack.TestCaseList verifyList
INFO: verifyList NOK
mai 19, 2015 4:13:25 PM ScriptPack.TestCase getIsPassed
INFO: getIsPassed OK
mai 19, 2015 4:13:25 PM ScriptPack.TestCase getName
INFO: getName OK
mai 19, 2015 4:13:25 PM ScriptPack.TestCase settIterationNumber
INFO: settIterationNumber OK
mai 19, 2015 4:13:25 PM ScriptPack.TestCase getIterationNumber
INFO: getIterationNumber OK
mai 19, 2015 4:13:25 PM ScriptPack.TestCase getIsPassed
INFO: getIsPassed OK
mai 19, 2015 4:13:25 PM ScriptPack.TestCase getIsPassed
INFO: getIsPassed OK
mai 19, 2015 4:13:25 PM ScriptPack.TestCase getIsPassed
INFO: getIsPassed OK
mai 19, 2015 4:13:25 PM ScriptPack.TestCase getIsPassed
INFO: getIsPassed OK
mai 19, 2015 4:13:25 PM ScriptPack.TestCase getIsPassed
INFO: getIsPassed OK
//Error. 
//**********EasyTest Test Report**********
//Test Case: testCase/test1.tc
//Result  : FAILED
//Start at: 2015-05-19-T16:13:25.587
Iteration number : 2
mai 19, 2015 4:13:25 PM ScriptPack.TestCaseList verifyList
INFO: verifyList NOK

以双斜杠开头的行来自inputstream,应该被组装。我试图在每种方法中都使用同步但不起作用。如果我放Thread.sleep(),我应该放哪里?有没有更安全的方式来同步输出?

【问题讨论】:

  • 您的日志记录设置如何。是打印到stdout 还是stderr?关于在日志 API 之外打印的行的相同问题?如果它们不同,则输出的差异可能是因为stdout 被缓冲而stderr 没有。
  • 我在每个类中使用相同的记录器:私有静态记录器 theLogger = Logger.getLogger("File1")。然后将 Logger.info(Thread.currentThread().getStackTrace()[1].getMethodName().toString() + "OK") 放入 ieach 方法中。除了记录,我使用 System.out.println() 打印到控制台。我使用 System.err.println 打印输入流,仍然有同样的问题
  • 如果没有特别配置,记录器通常会打印到stderr。您是否设置了任何特定的日志记录配置?如果没有,并且您不知道如何操作,将System.out.println 更改为System.err.println 以查看您的问题是否消失可能会更容易。
  • System.err.println 完美运行。谢谢

标签: java logging inputstream bufferedreader java.util.logging


【解决方案1】:

如果您知道希望每个线程等待的时间量,则可以使用等待来代替睡眠。 或者使用一个线程来锁定和打开另一个......这一切都取决于您的需求。 使用多线程时,结果将永远不会完全相同,除非它们不同时工作。 如果订单无效,您需要进行一些更改。 尝试使用线程池系列对象之一。 这里有一个可能有帮助的教程 http://www.tutorialspoint.com/java/java_multithreading.htm

【讨论】:

  • 感谢您的建议。我按顺序调用这些方法,所以它们也应该按顺序执行,不是吗?由于多线程同时执行,在我的情况下,我不明白你关于多线程的观点
【解决方案2】:

问题已通过 cmets 中对该问题的讨论得到解决。我发布此信息作为答案,以防其他人遇到相同问题并在搜索时发现此问题。


如果没有进行特定配置,Logger API 通常会将日志输出到stderr。对System.out.println() 的调用当然会转到stdout

当混合使用这两种方法时,每次运行程序时控制台输出不同的问题是由于stdout 通常是缓冲的,而stderr 不是。要解决此类问题,必须确保两种方法都打印到相同类型的输出流,都打印到stdout 或都打印到stderr

要了解如何为记录器 API 执行此操作,您必须查看记录器的文档。对于System.out.println()(和其他打印方法),您必须改用System.err,即System.err.println(),反之亦然。

【讨论】:

    猜你喜欢
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多