IT俱乐部 Java Java日志框架打印应用程序日志代码的执行情况分析

Java日志框架打印应用程序日志代码的执行情况分析

0 引言

  • 我常以为 配置 INFO 日志级别时, 应用程序代码中日志器(logger) debug 级的日志代码,不会被执行(比如,实验1中的printTestLog函数)。但今天线上的问题,证实了这个思路是错的。

1 验证实验

  • 版本信息
  • jdk : 1.8
  • 日志组件
  • slf4j.version : 1.7.25
  • log4j.version : 2.20.0

org.slf4jslf4j-api${slf4j.version}org.apache.logging.log4jlog4j-api${log4j.version}org.apache.logging.log4jlog4j-core${log4j.version}org.apache.logging.log4jlog4j-slf4j-impl${log4j.version}org.apache.logging.log4jlog4j-jul${log4j.version}compile

实验1:日志框架打印应用程序日志代码的执行情况

日志配置策略: log4j2.properties

  • log4j2.properties
## 日志的等级(自定义配置项)
##property.log.level=ALL,TRACE,DEBUG,INFO,WARN,ERROR,FATAL,OFF
property.log.level=DEBUG
# ------------------- [1.1] 定义 RootLogger 等 全局性配置(不可随意修改) ------------------- #
## rootLogger, 根记录器,所有记录器的父辈
## 指定根日志的级别 | All 

应用程序代码: LogTest

  • LogTest
package test.java.lang;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class LogTest {
    public static String printTestLog(){
        return "HelloWorld";//关键代码行
    }
    public static void main(String[] args) {
        log.debug( "log:{}", printTestLog() );
    }
}

实验结果

  • log.level=INFO
关键代码行 : 被执行
日志输出结果: 空
  • log.level=DEBUG
关键代码行 : 被执行
日志输出结果: 
[20XX/10/16 16:01:28.585] [TID: N/A] [DEBUG] [main] [LogTest.java:12 main] log:HelloWorld

最终结论

  • 无论 应用程序日志代码 logger 使用何种日志级别打印日志,代码行中的程序均会被执行,只是最终输出时由日志框架根据配置logger所属class的日志级别决定是否输出(appender)

  • 解决方法1:应用程序中,如无必要,删除这类日志代码。

  • 解决方法2:log.isDebugEnabled(...)/isInfoEnabled(...)/isWarnEnabled(...)/isErrorEnabled(...)/...

    public static void main(String[] args) {
        if(log.isDebugEnabled()){//将会根据 用户所配置的日志级别(log.level),决定是否执行 IF 内的代码
            log.debug( "log:{}", printTestLog() );
        }
    }

到此这篇关于Java日志框架打印应用程序日志代码的执行情况的文章就介绍到这了,更多相关Java日志框架打印应用程序日志代码内容请搜索IT俱乐部以前的文章或继续浏览下面的相关文章希望大家以后多多支持IT俱乐部!

本文收集自网络,不代表IT俱乐部立场,转载请注明出处。https://www.2it.club/code/java/14366.html
上一篇
下一篇
联系我们

联系我们

在线咨询: QQ交谈

邮箱: 1120393934@qq.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部