优秀的编程知识分享平台

网站首页 > 技术文章 正文

惊!部分日志为何不打印?排查过程大揭秘

nanyue 2024-12-29 04:53:28 技术文章 3 ℃

一、问题背景

在研究spring boot项目内嵌tomcat运行模式的时候发现,AbstractProtocol类中的start方法有日志未打印。

    @Override
    public void start() throws Exception {
        if (getLog().isInfoEnabled()) {
            getLog().info(sm.getString("abstractProtocolHandler.start", getName()));
            logPortOffset();
        }

        endpoint.start();
        monitorFuture = getUtilityExecutor().scheduleWithFixedDelay(
                () -> {
                    if (!isPaused()) {
                        startAsyncTimeout();
                    }
                }, 0, 60, TimeUnit.SECONDS);
    }

该方法会将当前的运行模式打印出来,类似于:

o.a.coyote.http11.Http11NioProtocol      : Starting ProtocolHandler ["http-nio-8080"]

但是,实际启动的时候未找到该日志。

二、项目版本

项目使用spring boot 2.3.12.RELEASE版本,未修改spring boot配置的版本依赖,也未引入其他额外的依赖。

三、问题排查

1、在AbstractProtocol类的start方法增加断点,查看对应的logger信息。

通过查看信息,发现logger的levelIntValue = 900,这表明当时的logger的日志等级为warn,因此这条日志未打印符合程序逻辑。

但是springboot的项目默认等级为info,同时项目并未修改任何日志的打印配置,那为什么这个logger的日志等级为warn呢?

2、通过跟踪代码,找到logger创建的地方(LogManager类的demandLogger方法),发现刚刚创建的logger的日志等级确实为info,因此推断肯定被修改了日志等级。


3、在Logger类的setLevel方法增加断点,确认确实被人修改了日志等级。


4、追述代码,发现在DefaultLogbackConfiguration这个类里面,自定义了部分类的日志打印级别。

	private void base(LogbackConfigurator config) {
		config.conversionRule("clr", ColorConverter.class);
		config.conversionRule("wex", WhitespaceThrowableProxyConverter.class);
		config.conversionRule("wEx", ExtendedWhitespaceThrowableProxyConverter.class);
		config.logger("org.apache.catalina.startup.DigesterFactory", Level.ERROR);
		config.logger("org.apache.catalina.util.LifecycleBase", Level.ERROR);
		config.logger("org.apache.coyote.http11.Http11NioProtocol", Level.WARN);
		config.logger("org.apache.sshd.common.util.SecurityUtils", Level.WARN);
		config.logger("org.apache.tomcat.util.net.NioSelectorPool", Level.WARN);
		config.logger("org.eclipse.jetty.util.component.AbstractLifeCycle", Level.ERROR);
		config.logger("org.hibernate.validator.internal.util.Version", Level.WARN);
		config.logger("org.springframework.boot.actuate.endpoint.jmx", Level.WARN);
	}

四、解决方案

因为日志不打印的原因是被修改了日志等级,因为只需要修改其日志打印级别即可。

在application.properties增加如下配置:

logging.level.org.apache.coyote.http11.Http11NioProtocol=INFO

启动项目,查看打印的日志,确实出现这个日志打印。


最近发表
标签列表