我正在编写Java控制台应用程序来执行某些文档处理并将文档添加到Elasticsearch索引。 我使用一个简单的包装器类来处理与Elasticsearch的通信。
此包装类的相关摘录是getClientConnection()
方法:
protected Client getClientConnection()
{
if (this.client == null)
{
Settings settings = ImmutableSettings.settingsBuilder()
.put("cluster.name", this.clustername).build();
this.client = new TransportClient(settings)
.addTransportAddresses(new InetSocketTransportAddress(this.hostname, this.port));
}
return this.client;
}
和addToIndex()
方法:
public void addToIndex(List<HashMap<String, Object>> documents, String index, String doctype)
{
Client client = this.getClientConnection();
BulkRequestBuilder bulkRequest = client.prepareBulk();
IndexRequestBuilder requestBuilder = client.prepareIndex(index, doctype);
for (HashMap<String, Object> curDocument : documents)
{
requestBuilder.setSource(curDocument);
bulkRequest.add(requestBuilder);
}
BulkResponse bulkResponse = bulkRequest.execute().actionGet();
this.closeClientConnection();
}
当我从控制台应用程序调用此代码时,一切都工作得很好,并且文档正在添加到索引中,但是在运行它时我收到了一些警告消息:
log4j:WARN No appenders could be found for logger (org.elasticsearch.plugins).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
我知道Elastic正在使用log4j进行日志记录,但我不确定为什么以及它尝试记录的内容。
由于这是一个独立的应用程序,我不想将elasticsearch配置目录添加到类路径中。应用程序应该能够在不运行Elastic的计算机上运行。 同样值得注意的是,在我的应用程序中,我使用log4j2进行日志记录。
现在我的问题:
是否可以禁用TransportClient的记录器?我看到了LogConfigurator.configure方法,该方法接受了一个设置对象参数,但我不确定如何使用它。
我可以以某种方式将自己的记录器注入TransportClient吗?
答案 0 :(得分:0)
log4j没有Null appender。虽然你可以用slf4j做到这一点,但我不确定你是否可以桥接一个希望log4j使用slf4j的库。除了那个(痛苦的)练习之外,我建议你只需将log4j-1.2.jar添加到你的类路径中,并使用指向stdout的根记录器配置log4j.properties文件:
# Set root logger level to FATAL and its only appender to stdout.
log4j.rootLogger=FATAL, stdout
# stdout set to be a ConsoleAppender.
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
现在,从ES发送到记录器的唯一消息将是致命的异常,无论如何您可能想知道这些异常。确实,你可能想要ERROR级别,你应该编写自己的应用程序来使用log4j并记录你自己的客户端调用。在这种情况下,您可能需要滚动文件追加器。如果你真的想扔掉所有日志事件,请将你的stdout和stderr传递给/ dev / null:
$ ./myprog &> /dev/null
有许多变体可以正常工作,例如使用文件追加器并将其大小限制为1K或其他。
log4j是EOL。所以你可以做同样的事情但是使用log4j2 jar和适当的json / xml配置文件。我知道这听起来很痛苦,但是有很多例子,并且知道日志框架在你自己的代码中是非常宝贵的。