代码之家  ›  专栏  ›  技术社区  ›  Liz Lamperouge

何时以及为什么在打印日志时使用字符串格式更好?

  •  1
  • Liz Lamperouge  · 技术社区  · 6 年前

    我想使用log4j在日志应用程序中打印一些值(字符串、日期、ecc)。 例如:

    Sting idUser="Test123";
    String name="Jack";
    int age=22;
    
    applicationlog.info("The selected user has this value :\n");
    applicationlog.info("name :"+name+ "id: "+idUser+" age :"+age);
    

    但我知道,在某些应用程序中,有这样一句话:

    applicationlog.info(String.format("name :%s id :%s age :%d",name,idUser,age));
    

    所以我的问题是: 何时以及为什么在打印日志中使用字符串格式而不是仅使用“+”更好?我知道使用带串联的字符串时最好使用“+”,但我不认为是这种情况,实际上这里只有打印。 非常感谢。

    2 回复  |  直到 6 年前
        1
  •  4
  •   OldCurmudgeon    6 年前

    性能上存在差异。

    applicationlog.info("name :"+name+ "id: "+idUser+" age :"+age);
    

    在您的特定情况下,您不会注意到,因为您正在使用 String 但是如果要记录的对象更复杂,但包含 toString 方法,在这种情况下 toString公司 方法将 总是 被调用,无论日志级别如何。

    applicationlog.info(String.format("name :%s id :%s age :%d",name,idUser,age));
    

    在这种情况下,如果例如关闭了日志记录,则 toString公司 对象的方法将 被呼叫。

    这更适用于 DEBUG TRACE 但这是一个值得养成的习惯。

    许多记录器还将提供参数替换机制,这可能是实现此功能的更好方法。

    applicationlog.info("name: {} id: {} age: {}", name, idUser, age);
    
        2
  •  1
  •   Sharon Ben Asher    6 年前

    log4j v2内置支持 Substituting Parameters

    applicationlog.info("name: {} id: {} age: {}", name, idUser, age);
    

    以及 printf 支持。。。printf样式

    applicationlog.printf("name: %s id: %s age: %d", name, idUser, age);