我想在调试日志中写一些日志,这些日志在具有信息日志级别的生产日志中将不可用。那么,这些额外的调试日志将如何影响性能?我的意思是,如果我们将日志级别设置为INFO,则记录器必须检查日志级别是什么,并发现log.debug需要忽略。
那么这种额外的日志级别检查是否会影响性能?
部署时是否有任何自动删除log.debug()语句的方法?我的意思是在开发期间,log.debug将在那里,我们可以进行调试。但是在生产部署期间,自动魔术机制将删除所有log.debug()消息。我不确定这些是否可行。
那么这些额外的调试日志将如何影响性能呢?
它会影响应用程序的性能,因为记录器是磁盘 I/O 调用(假设您正在写入文件系统),并且DEBUG严格不建议将日志级别用于生产环境。
在部署时是否有任何自动删除 log.debug() 语句的方法?
不,没有删除log.debug()语句的神奇方法,但是当您将日志记录级别设置为 INFO 时,只要您在将参数传递给debug()方法时不进行大量计算,就应该没问题。例如,如果您将记录器级别设置为 INFO 并假设您的代码中有以下两个记录器:
logger.debug(" Entry:: "); //this logger is fine, no calculations
//Below logger, you are doing computations to print i.e., calling to String methods
logger.debug(" Entry : product:"+product+" dept:"+dept);//overhead toString() calls
Run Code Online (Sandbox Code Playgroud)
我建议使用SLF4J,这样就可以通过避免第二记录计算开销{}(与使用它的实际值替换这些MessageFormatter)如下图所示:
//Below logger product and dept toString() NOT invoked
logger.debug(" Entry : product:{} dept{}", product, dept);
Run Code Online (Sandbox Code Playgroud)
更重要的一点是,slf4j 只是一个抽象,您可以在任何日志框架之间切换,您可以查看下面从这里截取的文本。
Java 的 Simple Logging Facade (SLF4J) 充当各种日志框架(例如 java.util.logging、logback、log4j)的简单外观或抽象,允许最终用户在部署时插入所需的日志框架。
您可以将“调试”语句包装在对 isDebugEnabled()
if (log.isDebugEnabled()) {
log.debug("my debug statement");
}
Run Code Online (Sandbox Code Playgroud)
同样,将您的“信息”语句包装在对isInfoEnabled()等的调用中。
这样做背后的想法是检查是否启用了日志记录级别是一种廉价(固定成本)的操作。生成正在记录的语句的成本将因您正在执行的操作而异。
您可以通过编写日志语句的方式将这种情况最小化。如果你写
Object a = ....
log.debug("I have an a: " + a);
Run Code Online (Sandbox Code Playgroud)
然后,无论您使用的日志记录框架如何,都必须在运行调试函数之前对参数进行评估。这意味着即使您处于该级别,您也要付出调用和构建参数字符串INFO的性能成本。如果您改为编写例如(取决于您的日志框架使用的格式,这适用于 log4j 和 slf4j)toStringa
log.debug("I have an a: {}", a);
Run Code Online (Sandbox Code Playgroud)
您不需要支付此费用,而只需支付记录器检查您是否处于调试模式的费用 - 除非您需要它,否则您不需要支付参数评估费用。
另一件要检查的事情是您正在缓冲输出(同样,在 slf4j 中,有缓冲附加程序),这将最大限度地减少写入。