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

正文

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

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

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

相关内容

热门资讯

蜻蜓订购APP贵金属订购非法期...   蜻蜓订购APP以"投资平台"名义对外宣传,主打贵金属期货(订购)交易。该平台一方面强调自身"正规...
悟空订购APP非法期货交易欺骗...   近期,有投资者反映,“悟空订购APP”等平台以白银、贵金属订购为名,宣传所谓“高收益”“低门槛”...
小赢淘金APP期货投资骗局,平...   “小赢淘金”之流,最擅长的就是用“注册送现金”、“充值返券”的糖衣炮弹来引流。别天真地以为那是福...
八方淘金APP非法期货交易欺骗...   警惕!八方生财、每日淘金、小赢淘金、悟空订购、蜻蜓订购、斗金订购等APP均涉嫌非法期货交易!  ...
智易购APP贵金属订购交易骗局...   很多人看到“3元起投”“充值送福利”“操作简单”“随时提现”这类宣传,很容易把智易购APP当成普...
喜玛银庄APP商品订购投资骗局...   喜玛银庄APP白银、铂金“现货订购”骗局警示:无资质平台涉嫌非法期货交易,投资者爆仓后如何维权?...
吉鑫乐享APP炒贵金属订购交易...   近期,多名投资者反映在“吉鑫乐享APP”进行贵金属投资时遭遇严重亏损,甚至血本无归。看似正规的“...
易掘金APP虚假期货投资骗局,...   “易掘金”的APP它打着“高收益、灵活投资”的旗号,宣称通过“商品订购”就能轻松赚钱,吸引了不少...
在大吉订购APP订购交易亏损被...   近期,不少投资者反映在“大吉订购App”上投资白银、铂金等商品遭遇严重亏损。该平台宣称提供现货订...
铂银壹号APP商品订购交易亏损...   许多中小投资者误以为网上的“商品现货订购”是合规合法的理财渠道,殊不知这背后隐藏着巨大的合规风险...
兴鑫淘金APP贵金属订购交易亏...   白银、贵金属或其他商品类投资,除国家批准的正规期货交易场所及持牌期货公司外,市面上大量第三方交易...
铂银掘金APP无资质的违规平台...   铂银掘金等平台的投资者,往往是被“注册送现金”“充值返现券”“首单免亏”等广告话术吸引,进而下载...
八方淘金APP订购交易不合规,...   “八方淘金APP”“铂银掘金APP”“铂银壹号APP”等软件被指以“现货订购”为名,实际采用高杠...
在指尖订购APP订购商品亏损被...   指尖订购APP这类平台,表面是“订购交易”,实则是披着电商外衣的非法期货陷阱。绝大多数投资者被蒙...
在犀贝易购APP做商品订购交易...   市面上打着“现货投资”“贵金属交易”旗号的APP并不少,但真正合规、受监管的平台并不多。犀贝易购...
易达淘金APP虚假商品订购交易...   易达淘金APP存在严重的虚假宣传与违规交易行为。该平台打着“商品订购”的旗号,实则通过不合规的交...
大浪淘金APP白银订购亏损被骗...   大浪淘金APP最隐蔽的套路,在于其完全封闭的内盘交易系统。表面上,它宣称与国际贵金属市场接轨;实...
一品好购APP上订购白银出现亏...   一品好购APP原名“一品订购”,运营方为上海宝智未来信息技术有限公司。近期不少投资者反映在该平台...
九州订购APP贵金属订购投资骗...   九州订购APP正通过抖.音、快手、今日头条等平台大量投放投资广告,用“5元起投”“充值返现”“0...
坚锅淘金APP交易软件并不正规...   当前,市面上大量所谓的“现货商城订购”交易软件,早已偏离了正常的实物商品买卖,演变为高杠杆、高手...