有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

日志如何在Java中继续登录同一行?

这类似于this question, which is about a bash file

我们已经创建了一个日志,在运行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中是可能的吗


共 (3) 个答案

  1. # 1 楼答案

    如果不知道您使用的是哪个日志库,我想答案几乎肯定是不是,除非您想在其他地方显式指定换行符

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

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

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

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

    log.info("I want this on one line\n");
    
  2. # 2 楼答案

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

    它可以通过使用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
    
  3. # 3 楼答案

    别碰木头。如果您想让它更具可读性,请对其进行后期处理

    如果不小心弄乱日志文件,将丢失信息。以时间戳为例。如果Setting browswer..log语句包含一个时间戳,那么将completed语句放在没有时间戳的地方会丢失信息,并且在同一行上有两个时间戳似乎是不自然的