elasticsearch,log4j,Java,elasticsearch,Log4j" /> elasticsearch,log4j,Java,elasticsearch,Log4j" />

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

Java 在嵌入式模式下启动elasticsearch时如何设置日志记录,java,elasticsearch,log4j,Java,elasticsearch,Log4j,出于测试目的,我在“嵌入式模式”中使用ElasticSearch,即。E我正在编写Java代码,并通过org.elasticsearch.node.NodeBuilder启动ES节点。看起来,在log4j之上有一个(yaml-)配置层并没有那么舒适,因为命令行设置就是这样 但是,我不想保持两个单独的配置同步来配置log4j,而是想在我的嵌入式世界中使用现有的logging.yml文件 有没有一种简单的方法可以从命令行设置代码中提取日志设置?在研究了在命令行启动时引导系统的实际ES代码后,我提出了

出于测试目的,我在“嵌入式模式”中使用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类将记录的级别