Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA日志记录的最佳方法/性能是什么?字符串或StringBuilder或StringBuffer_Java_Logging_Log4j - Fatal编程技术网

JAVA日志记录的最佳方法/性能是什么?字符串或StringBuilder或StringBuffer

JAVA日志记录的最佳方法/性能是什么?字符串或StringBuilder或StringBuffer,java,logging,log4j,Java,Logging,Log4j,问题是:我想改进我们应用程序中的日志记录系统 我们在云上运行多个服务(不相关) 这些服务都会在其日志中记录所有内容,例如: public class class1 { protected Logger logger = Logger.getLogger(Service1 .class.getName()); public method1 (){ ... logger.info("....."); //It creates a new String ... l

问题是:我想改进我们应用程序中的日志记录系统

我们在云上运行多个服务(不相关)

这些服务都会在其日志中记录所有内容,例如:

public class class1 {

protected Logger logger = 
Logger.getLogger(Service1 .class.getName());


  public method1 (){

   ...
   logger.info("....."); //It creates a new String
   ...
   logger.debug("..."); //It creates a new String
   .
   .
   .
  }

  public method2 (){

   ...
   logger.info("....."); //It creates a new String
   ...
   logger.debug("..."); //It creates a new String
   .
   .
   .
  }
}
我想改进这段代码并使日志系统标准化,但我不是Java专家,我需要帮助来了解实现这一点的最佳方法是什么

我有个主意,我来了:

我正在考虑创建一个实用程序类来管理所有日志消息传递(我认为这种方法将使用StringBuffer进行同步),或者在每个方法上创建一个StringBuilder并重用它,如下所示:

public class class1 {

  protected Logger logger = 
  Logger.getLogger(Service1 .class.getName());


  public method1 (){
    StringBuilder msg = new StringBuilder();

    msg.append(" ...").append(" xx ").append(" yy "); //new message
    logger.info(msg); 
    ...
    msg.setLength(0); //Reset
    msg.append(" ...").append(" xx ").append(" yy "); //new message
    logger.debug("..."); 
    .
    .
    .
  }

  public method2 (){

    StringBuilder msg = new StringBuilder();

    msg.append(" ...").append(" xx ").append(" yy "); //new message 
    reusing builder
    logger.info(msg); 
    ...
    msg.setLength(0); //Reset
    msg.append(" ...").append(" xx ").append(" yy "); //new message 
    reusing builder
    logger.debug(msg);
    .
    .
    .
  }
}
你觉得怎么样

我们用的是Log4j,我的英语不是很好。这种方法是为了避免声纳无法做到这一点:

logger.debug("..." + " " + someVariable + " " + otherVariable);

我希望您能理解我=)

如果您能够使用log4j 2.x,您可以使用参数让库处理它:

logger.debug("... {} {}", someVariable, otherVariable);
有关更多信息,请参阅javadocs


请注意,即使您有一个绑定到1.x的依赖项,log4j团队也显式地更改了2.x的包结构,以避免冲突。您可以自由地同时使用这两个选项,而不必担心兼容性问题(只需确保您导入的是正确的
Logger
类)。

所有建议的选项仍然会创建字符串。例如,
“xx”
“yy”
。我最喜欢的是使用
String.format(“来自%s类的错误:%s”,“MyClass”,例如getMessage())
,因为它允许一次查看所有日志消息,并且是NPE免费的。您将重新发明轮子,并使用反模式修复反模式。我建议您使用某种面向方面的机制来记录日志,同时利用日志框架的格式驱动功能来标准化格式。你只会让事情变得更糟。@Kayaman这就是我问的原因,对吧?谢谢,这很有帮助。