详解如何查看Elasticsearch的Debug日志
admin
2024-01-22 22:55:35
0

正文

当我们遇到问题或者需要深入了解 Elasticsearch 的运行机制时,调整日志等级( logging level )到更详细的级别,比如 DEBUGTRACE ,会是一个有效且必须要掌握的方法。

Elasticsearch 提供了如下的接口来支持动态变更 logging level,logger 后面是 package name 或者 class name。

1

2

3

4

5

6

7

8

PUT _cluster/settings

{

  "persistent": {

    "logger": {

      "org.elasticsearch.action": "DEBUG"

    }

  }

}

 当然,你也可以去修改配置目录下面的 log4j2.properties,然后重启节点,但这种方法太过笨重,建议你不要用。

如果后续想要调整回默认设置,操作也简单,如下所示:

1

2

3

4

5

6

7

8

PUT _cluster/settings

{

  "persistent": {

    "logger": {

      "org.elasticsearch.action": null

    }

  }

}

上面的示例只是指定了一个 logger,当然也可以在一次请求中设定多个 logger,如下所示:

1

2

3

4

5

6

7

8

9

10

PUT _cluster/settings

{

  "persistent": {

    "logger": {

      "_root": "INFO",

      "org.elasticsearch.action": "DEBUG",

      "org.elasticsearch.action.admin.cluster.health": "TRACE"

    }

  }

}

上面的设定中,调用者的意图可能如下:

  • root 的日志等级(默认所有 logger 的日志级别)设定为 INFO,虽然 log4j2.properties 中已经设定过了,保险起见,这里再指定一次。
  • 设定 org.elasticsearch.action 这个 package 下所有 logger 的日志级别都为 DEBUG,需要查看下 transport action 的执行日志。
  • 设定 org.elasticsearch.action.admin.cluster.health 这个 package 下所有 logger 的日志级别都为 TRACE,需要查看 Cluster Health 执行的更多日志。

但实际去运行时,Elasticsearch 并没有按照预期的结果去执行,没有相关 DEBUG 和 TRACE 级别的日志输出。这里直接给出原因和解决方案。

原因是 elasticsearch 在设定 logging level 时,会优先采用 _root 和 parent logger 的设定,这里和 log4j2.properties 中的设定有所差异。

上面的调用,最终结果是采用 _root 的设定,所有 logger 都是 INFO ,其他的设定都无效了。

解决方案如下,去除 _root 设定和 parent logger 的设定。

1

2

3

4

5

6

7

8

9

10

PUT _cluster/settings

{

  "persistent": {

    "logger": {

      "_root": null,

      "org.elasticsearch.action": null,

      "org.elasticsearch.action.admin.cluster.health": "TRACE"

    }

  }

}

下面就是源码分析了,感兴趣的可以继续看下去~

源码分析

相关实现逻辑在 ClusterSetting.LoggingSettingUpdater 里面,这里简单给下定位的思路,感兴趣的同学可以自己去翻下源码。

  • rest 请求的入口是 RestClusterUpdateSettingsAction,这里会转发请求到 master 节点
  • master 处理的入口是 TransportClusterUpdateSettingsAction,这里会去 update Cluster Setting,关键词为 updater.updateSettings
  • 在 updateSettings的时候会调用所有的 ClusterSettingUpdater,Logging 就是其中之一。

apply setting 代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

for (String key : value.keySet()) {

    assert loggerPredicate.test(key);

    String component = key.substring("logger.".length());

    if ("level".equals(component)) {

        continue;

    }

    if ("_root".equals(component)) {

        final String rootLevel = value.get(key);

        if (rootLevel == null) {

            Loggers.setLevel(LogManager.getRootLogger(), Loggers.LOG_DEFAULT_LEVEL_SETTING.get(settings));

        } else {

            Loggers.setLevel(LogManager.getRootLogger(), rootLevel);

        }

    } else {

        Loggers.setLevel(LogManager.getLogger(component), value.get(key));

    }

}

浅显易懂,不废话,而且这里的逻辑看起来很正常,那么继续来看下 Loggers.setLevel代码。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

public static void setLevel(Logger logger, Level level) {

    if (!LogManager.ROOT_LOGGER_NAME.equals(logger.getName())) {

        Configurator.setLevel(logger.getName(), level);

    } else {

        final LoggerContext ctx = LoggerContext.getContext(false);

        final Configuration config = ctx.getConfiguration();

        final LoggerConfig loggerConfig = config.getLoggerConfig(logger.getName());

        loggerConfig.setLevel(level);

        ctx.updateLoggers();

    }

    // we have to descend the hierarchy

    final LoggerContext ctx = LoggerContext.getContext(false);

    for (final LoggerConfig loggerConfig : ctx.getConfiguration().getLoggers().values()) {

        if (LogManager.ROOT_LOGGER_NAME.equals(logger.getName()) || loggerConfig.getName().startsWith(logger.getName() + ".")) {

            Configurator.setLevel(loggerConfig.getName(), level);

        }

    }

}

最后的处理逻辑会在每个 logger 设定完成后,去重新刷一遍现有的 logger,应用 root 或者 parent logger 的设定。

顺着代码的修改记录,找到了当初的修改 PR 如下:

[https://github.com/elastic/el...]()

其中也描述了修改的原因:

Today when setting the logging level via the command-line or an API
call, the expectation is that the logging level should trickle down the
hiearchy to descendant loggers. However, this is not necessarily the
case. For example, if loggers x and x.y are already configured then
setting the logging level on x will not descend to x.y. This is because
the logging config for x.y has already been forked from the logging
config for x. Therefore, we must explicitly descend the hierarchy when
setting the logging level and that is what this commit does.

从这段描述看,当时要解决的问题是 x.y 没有继承 x logging level 的问题,所以加了这段显示继承的逻辑。

虽然这解决了继承的问题,但其行为本身与 log4j2.properties 中 logger 的修改逻辑就不一致了,难免带来困扰。

但考虑到这个配置是一个专家级别的配置,很少用户会使用,自己心里明白正确的使用方法就好了^_^

相关内容

热门资讯

28家企业排队,美妆IPO迎来... 沉寂三年后,美妆IPO重新热了起来。 2020年至2021年,是中国美妆企业上市的“黄金窗口”。贝泰...
原创 套... #格力第一大股东套现近 15.9 亿 #,格力电器正式发布减持结果公告,公司第一大股东珠海明骏(高瓴...
原创 昆... 6月23日,昆仑行机器人宣布,公司自2026年3月注册成立不足90天内,接连完成三轮融资,累计规模达...
心智观察所:从磷化铟的故事看中... 【文/观察者网 心智观察所 】 云南锗业的股价在2026年4月跑出了一波让人困惑的行情。 这家以锗为...
马云带着一群阿里合伙人,下田插... “马云带着一群阿里合伙人下田插秧,此次插秧团建的“同事们”阵容强大,吴泳铭、邵晓锋、蒋凡、吴泽明、蒋...
胖东来近半年累计销售额超139... 上证报中国证券网讯 6月22日晚,胖东来创始人于东来通过社交平台分享了集团近半年的经营情况。数据显示...
原创 帮... 达沃斯开幕+长川/卫星中报开门红:今天A股走“业绩提纯”,别蹭概念刀口舔血 老铁们,今天的早观察关键...
原创 腾... 原创首发 | 金角财经(ID: F-Jinjiao) 作者 | 田羽 “中国AMD”准备登陆A股了。...
于东来:胖东来拟制定夫妻或孩子... 来源:快科技 6月22日晚,胖东来创始人于东来通过个人账号“傻坏蛋于东来”透露多项员工福利升级计划。...
原创 纸... 作者 | 林洛栩 编辑 | 魏樊曦 6月18日,纸尿裤甲酰胺风波突然冲上热搜。 据《经济参考报》报道...
女子去世房贷逾期,银行起诉其子... 女子不幸去世,生前贷款57万元购买的房产开始逾期。银行将其儿子起诉至法院,提出在继承遗产范围内偿还贷...
4球-2球-4球-3球!姆巴佩... 姆巴佩距离“GOAT”还有多远?这是一个美加墨世界杯上无可避免的话题,有趣的是,这一距离似乎随着比赛...
原创 特... 文|两分钟 本文为深度观点解读,仅供交流学习 6月19日,美国总统特朗普在安德鲁斯联合基地的记者会公...
六旬老汉抱孙胳膊疼,庞继军不拍... 现代保健报讯:六十来岁的老汉,干了一辈子体力活。进了新城扶华诊所,见着庞继军就说:“我这脖子、肩膀、...
2026成都企业迎审融资:短期... 近期成都不少制造、工贸企业都卡在同一个关键节点:第三方验厂审核、银行授信、投资方现场尽调扎堆到来。但...
不断升级链博会“找朋友”模式 当“脱钩断链”的杂音不时泛起之际,第四届中国国际供应链促进博览会汇聚85个国家、地区及国际组织的67...
拼多多罕见买楼 活跃的自用型买... 观点网 全球总部也是靠租的拼多多,近期在雄安新区买了一栋办公楼。 6月21日消息,拼多多与中国电建旗...
SpaceX首发投资级债券,强... ,正在为市场对美国长端实际利率走高的判断提供新的佐证。这笔融资不仅折射出美国资本市场对超长期增长项目...