12

这类似于这个问题,它是关于一个 bash 文件

我们创建了一个在运行 TestNG 测试时输出到控制台的日志:

private Log log = LogFactory.getLog(xyz.class);

稍后,在测试期间,日志中充满了详细信息,让我们知道到底在做什么:

log.info("Setting browser...");
this.browser = browser;
log.info("Completed.");

现在它正在像您期望的那样打印出来:

Setting browser...
Completed.

我想在同一行打印出来:

Setting browser...

几毫秒后:

Setting browser...Completed.

这对 LogFactory 可行吗?

4

3 回答 3

9

在不确切知道您使用的是哪个日志库的情况下,我猜答案几乎肯定不是,除非您想在其他任何地方明确指定换行符

( java.util.loggingand Log4J) 框架允许您插入格式化程序来格式化您的语句。您需要指定不以换行符结尾的格式。例如,在Log4J中。他们给出了一个示例模式

 %-5p [%t]: %m%n

因此,如果您删除了除了%m(换行符和其他内容包括时间和%n日志级别;我认为分别)之外的所有内容,换行符不会自动附加到每个语句。%t%p

但是,这意味着在其他任何地方,您的其他日志语句必须如下所示:

log.info("I want this on one line\n");
于 2012-06-25T19:39:33.480 回答
4

不理会日志。如果您希望它更具可读性,请对其进行后处理。

除非您小心,否则弄乱日志文件会丢失信息。以时间戳为例。如果您的Setting browswer..日志语句包含时间戳,那么completed不带时间戳的语句会丢失信息,并且在同一行上有两个时间戳似乎并不自然。

于 2012-06-25T20:29:47.563 回答
0

slf4j-api这是一个简单的替代方案,如果您将与实现一起使用,则不需要对记录器配置进行任何更改logback

它可以通过使用该Logger.printf方法来实现,如下所示:

进口

import org.slf4j.Logger
import org.slf4j.LoggerFactory

...

记录器实例

private static final Logger log = LoggerFactory.getLogger(YourClass.class)

...

循环内

...

log.printf("> Processed %d/%d\r", ++yourCounter, maxCounter) // Will log in the same line due to \r

...

样本输出

22:12:15.169 [main] INFO  your.package.YourClass - Previous log output a...
22:12:15.170 [main] INFO  your.package.YourClass - Previous log output b...
22:12:15.170 [main] INFO  your.package.YourClass - Previous log output c...
> Processed 1398/4096
于 2019-03-07T03:29:55.070 回答