我有一个使用 Log4J 打印其输出的控制台应用程序。这很有用,因为我可以轻松地实现一个开关,以选择性地显示调试消息,即使它们默认是隐藏的。
此应用程序有一些长时间运行的操作,进度条适合这些操作。
使用Log4J 或 LogBack实现这一点的最佳方法是什么?
我有一个使用 Log4J 打印其输出的控制台应用程序。这很有用,因为我可以轻松地实现一个开关,以选择性地显示调试消息,即使它们默认是隐藏的。
此应用程序有一些长时间运行的操作,进度条适合这些操作。
使用Log4J 或 LogBack实现这一点的最佳方法是什么?
要将进度条或任何类型的更新文本写入控制台,只需使用\r
(carriage return) 而不是\n
(new line) 结束输出,以便下一行覆盖它。这个问题更详细。F-ANSI库使您能够轻松生成漂亮的控制台输出,包括覆盖前一行。
但是,如果您打算使用日志框架,这不仅是不可能的,而且也不是您想要的。正如 ChrisM 所建议的那样,记录进度的正确方法是每隔一段时间记录一个新行,其中包含到目前为止完成的百分比。通过这种方式,您可以看到您的程序正在做什么以及它在上下文中走了多远。
听起来您想要做的是将日志记录与程序的实际输出分开(这通常是个好主意,即使忽略进度条问题)。使用您的日志框架来记录有关程序执行的信息;您或调试人员会感兴趣的事情。实际程序的输出应直接写入stdout
via System.out
。
然后,您可以单独决定要对日志记录执行什么操作。它也可以写入stdout
,并且您的日志和输出可以一起存在,但更好的是写入stderr
(这使得重定向更容易)或日志文件(这使您的程序的输出更清晰,并保留您的日志以供参考之后)。
此外,如果 Java 不是先决条件,则该pv
命令会根据通过它传输的数据量提供强大的、可自定义的进度条。