Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.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 Log4j性能和对象创建_Java_Logging - Fatal编程技术网

Java Log4j性能和对象创建

Java Log4j性能和对象创建,java,logging,Java,Logging,我对日志的性能有一个疑问,在我的项目中,我在类中看到了很多日志消息。在生产环境中,日志不会打印其中的许多内容(正常行为)。无论如何,每个日志都在创建一个字符串对象。例如: Log.debug("This my debug message 1"); ... Log.debug("This my debug message 400"); 我们为日志创建了很多字符串文本。即使我只显示错误级别,这会对我的生产站点产生很大影响吗 感谢固定字符串文本没有问题,没有与之相关的运行时开销(除了方法调用本身)

我对日志的性能有一个疑问,在我的项目中,我在类中看到了很多日志消息。在生产环境中,日志不会打印其中的许多内容(正常行为)。无论如何,每个日志都在创建一个字符串对象。例如:

Log.debug("This my debug message 1");
...
Log.debug("This my debug message 400");
我们为日志创建了很多字符串文本。即使我只显示错误级别,这会对我的生产站点产生很大影响吗


感谢

固定字符串文本没有问题,没有与之相关的运行时开销(除了方法调用本身)


另一种情况是构造消息,如
“user:+user
。即使日志未处于活动状态,也将执行字符串连接。

固定字符串文本没有问题,没有与此相关的运行时开销(除了方法调用本身)


另一种情况是构造消息,如
“user:+user
。即使日志未处于活动状态,也会进行字符串连接。

如果构建日志字符串相当复杂(例如,在对象上调用复杂的
字符串)

在您的情况下(简单的字符串日志记录),可能不值得编写一个保护:

if (Log.isDebugEnabled()) {
   Log.debug("...");
}

请参阅底部的(“性能”部分)

如果构建日志字符串相当复杂(例如,在对象上调用复杂的
到字符串)

在您的情况下(简单的字符串日志记录),可能不值得编写一个保护:

if (Log.isDebugEnabled()) {
   Log.debug("...");
}

请参阅底部的(“性能”部分)

这是一个性能问题,基本上可以归结为:测量它 我们不知道有多少“很多”日志消息,你的其他代码有多贵等等。太多的因素无法给出一个有根据的答案

我认为一般的理解是,在大多数情况下,合理的日志语句不应该对性能产生可测量的影响,使用更快的硬件比让开发人员删除日志语句更便宜。但这可能不包括你的具体情况

如果日志消息不是一个文本,而是一个生成的字符串(字符串连接或复杂的
toString()
-method),那么日志记录可能会变得更加昂贵。有关详细信息,请参阅手册的性能部分,以获取或

删除日志语句可能是一种情况,尽管尝试最小化开销(至少在关键部分)从来都不是错误的。在log4J中,可以这样做(如建议的):

  • 使用格式模板样式消息(自log4j 2.0起提供):

  • 使用警卫

    if (logger.isDebugEnabled()) {
      logger.debug(expensiveMethodReturningLogString());
    }
    

    • 这是一个性能问题,基本上可以归结为:测量它 我们不知道有多少“很多”日志消息,你的其他代码有多贵等等。太多的因素无法给出一个有根据的答案

      我认为一般的理解是,在大多数情况下,合理的日志语句不应该对性能产生可测量的影响,使用更快的硬件比让开发人员删除日志语句更便宜。但这可能不包括你的具体情况

      如果日志消息不是一个文本,而是一个生成的字符串(字符串连接或复杂的
      toString()
      -method),那么日志记录可能会变得更加昂贵。有关详细信息,请参阅手册的性能部分,以获取或

      删除日志语句可能是一种情况,尽管尝试最小化开销(至少在关键部分)从来都不是错误的。在log4J中,可以这样做(如建议的):

      • 使用格式模板样式消息(自log4j 2.0起提供):

      • 使用警卫

        if (logger.isDebugEnabled()) {
          logger.debug(expensiveMethodReturningLogString());
        }
        

      OP讲的是字符串文字,尽管您的提示是正确的。这就是为什么大多数较新的日志框架(例如Log4J 2.x)允许格式模板样式的消息:
      logger.debug(“条目号:{}是{}”,i,条目[i])。如果你能用这种方式生成日志消息,那可能就是最好的方法了(少一点混乱——仍然是一行代码)。当日志处于非活动状态时,您只需将一个方法调用替换为另一个方法调用,当日志处于活动状态时,您只需执行两个调用,而不是一个调用。@Hanry True,但drkicknrush所说的是复杂的toString()方法,在这些方法中,守卫确实有意义。虽然OP正在编写字符串文本,但他可能仍然拥有昂贵的toString()方法……对于需要花费大量时间和资源来构造的消息,使用保护可能是有意义的。但是标准JavaAPI的
      Java.util.logging.Logger
      已经走过了很长的路,在Java8中有一种方法使防护变得不必要,并使代码更具可读性。遗憾的是,目前主要第三方日志系统的版本还没有做到这一点。虽然您的提示是正确的,但OP说的是字符串文字。这就是为什么大多数较新的日志框架(例如Log4J 2.x)允许格式模板样式的消息:
      logger.debug(“条目号:{}是{}”,i,条目[i])。如果你能用这种方式生成日志消息,那可能就是最好的方法了(少一点混乱——仍然是一行代码)。当日志处于非活动状态时,您只需将一个方法调用替换为另一个方法调用,当日志处于活动状态时,您只需执行两个调用,而不是一个调用。@Hanry True,但drkicknrush所说的是复杂的toString()方法,在这些方法中,守卫确实有意义。虽然OP正在编写字符串文本,但他可能仍然拥有昂贵的toString()方法……对于需要花费大量时间和资源来构造的消息,使用保护可能是有意义的。但是标准JavaAPI的
      Java.util.logging.Logger
      已经走过了很长的路,在Java8中有一种方法使防护变得不必要,并使cod