详解如何查看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 的修改逻辑就不一致了,难免带来困扰。

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

相关内容

热门资讯

1282列!石家庄国际陆港20... (来源:河北新闻网) 转自:河北新闻网 长城网·冀云客户端1月15日讯(记者 袁立朋 通讯员 余陈军...
原创 1... 周五早盘,沪深A股主要的大盘指数高开幅度明显,最终高开低走。盘面上看,多数个股下跌,人气一般。周五午...
康希诺生物:创新支撑盈利拐点已... 新年伊始,港股与A股市场迎来了一波“开门红”行情。步入2026年,多家头部外资机构在年度展望中释放积...
Omdia:AI推动半导体行业... 机构 Omdia 在英国伦敦当地时间昨日的新闻稿中表示,根据其最新市场分析,在人工智能市场的巨大需求...
OPPO总裁陈明永入选“202... 瑞财经1月13日,由瑞财经推出的“2025年度手机行业六大杰出人物”榜单揭晓,OPPO总裁陈明永入选...
国联民生证券董事长顾伟入选“2... 瑞财经1月15日,由瑞财经推出的“2025年度证券行业十大杰出人物”榜单揭晓,国联民生证券董事长顾伟...
南昌第五医院甲状腺科江辉科普:... 甲亢甲亢,作为一种生活中频发的疾病,已成为常见的病症之一。根据一项流行病学调查的数据显示,我国甲亢的...
A股异动丨年度预亏,昆仑万维午... 昆仑万维(300418.SZ)午间收跌8.6%报56.95元,总市值715亿元。消息上,昆仑万维昨日...
当千问能帮你“一句话出游”时,... 千问(房煜摄) 1月15日,在阿里巴巴西溪园区的会议大厅,当两名淘宝闪购配送员提着40杯霸王茶姬走进...
国家电网“十五五”计划投资4万... 国家电网1月15日宣布,“十五五”期间公司固定资产投资预计达到4万亿元,较“十四五”投资增长40%,...
乘联会:12月车市“减速蓄势”... 在政策调整与市场博弈的双重影响下,2025年12月全国乘用车市场迎来年末收官。尽管受以旧换新补贴退坡...
青岛国恩股份通过港交所聆讯,青... 齐鲁晚报·齐鲁壹点记者 尚青龙 日前,青岛国恩科技股份有限公司通过港交所聆讯,向港股上市迈出关键一步...
共商产权市场发展大计 常修泽建... ■ 中国经济时报记者 刘慧 2026年1月13日,“十五五”产权市场高质量发展研讨会在江苏省常州市举...
银行股年内跌幅居首,结构性降息... 开年以来,A股市场整体表现回暖,但银行板块却未能延续此前涨势,走势明显偏弱。Wind数据显示,截至1...
鸣鸣很忙上市背后:万店连锁告别... ▲这是灵兽第1748篇原创文章 万店之后拼的不是胆量,而是效率优势。 作者/十里 ID/lingsh...
以价代税,中欧电动汽车博弈新起... 中欧电动汽车案“软着陆”,以最低进口价格替代“反补贴”税;具体价格形成方式将成为后续磋商的关键点 文...
4万亿投资创纪录,国家电网布局... 国家电网于1月15日公布,“十五五”时期的固定资产投资预计将达4万亿元,较“十四五”期间投资规模增长...
黄金价格飙升,银行保管箱“一箱... 在黄金价格持续走高的背景下,黄金投资与储备需求加剧,银行保管箱租赁业务随之火爆。 据中国证券报,记者...
原创 年... “突然剧烈头痛,像被重锤击中!”“一侧肢体麻木无力,说话也含糊不清……”这些可能是大脑发出的求救信号...