在嵌入式模式下启动 elasticsearch 时如何设置日志记录

How to setup logging when starting elasticsearch in embedded mode

出于测试目的,我在 "embedded mode" 中使用 ElasticSearch,即。 e.我正在编写 Java 代码并通过 org.elasticsearch.node.NodeBuilder 启动 ES 节点。看起来,在 log4j 之上有一个 (yaml-) 配置层并不像开箱即用的命令行设置那样令人舒服。

但是我不想让两个单独的配置保持同步来配置 log4j,我还想在我的嵌入式世界中使用现有的 logging.yml 文件。

是否有一种简单的方法可以从命令行设置代码中提取日志记录设置?

在查看了在命令行启动时引导系统的实际 ES 代码后,我想出了以下解决方法:

final NodeBuilder nodeBuilder = new NodeBuilder();
Settings settings = InternalSettingsPreparer.prepareSettings(ImmutableSettings.Builder.EMPTY_SETTINGS, true).v1();
LogConfigurator.configure(settings);
node = nodeBuilder.build();
client = node.client();

假设我做对了,这基本上会额外解析配置文件并将如此检索的 org.elasticsearch.common.settings.Settings 传递给 LogConfigurator

注意,这必须在调用 NodeBuilder.build 之前完成。

(我意识到我的回答并不能满足问题的精确要求,但它可能对其他人在这个问题的标题中有更高级别的问题和不同的详细要求有用。)

在嵌入 Elasticsearch 节点时想要配置 Elasticsearch 日志记录的另一种可能情况是,当您希望它使用要将其嵌入其中的程序的现有日志记录框架时。

如果您使用 log4j 作为您的日志记录框架,并希望将 Elasticsearch 节点嵌入到同一程序中以通过您的 log4j 进行记录,那么请尝试这样的事情:

     ESLoggerFactory.setDefaultFactory(new Log4jESLoggerFactory());
     Node node = NodeBuilder.nodeBuilder()
             .settings(mySettings).client(true)
             .clusterName(elasticSearchClusterName).node();

这假定您已经设置了自己的 log4j 记录器。 (显然构建节点的具体细节会有所不同,但关键是在构建之前调用 ESLoggerFactory.setDefaultFactory。)

您为此需要的额外导入是:

import org.elasticsearch.common.logging.ESLoggerFactory;
import org.elasticsearch.common.logging.log4j.Log4jESLoggerFactory;

请注意,Elasticsearch 将使用您的 log4j 的根记录器进行记录,因此为您的根记录器设置的日志记录级别是 Elasticsearch 类 将记录的级别。