使用Elasticsearch Java API进行记录器警告

时间:2014-07-03 01:56:24

标签: java elasticsearch log4j elasticsearch-java-api

我正在编写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进行日志记录。

现在我的问题:

  1. 是否可以禁用TransportClient的记录器?我看到了LogConfigurator.configure方法,该方法接受了一个设置对象参数,但我不确定如何使用它。

  2. 我可以以某种方式将自己的记录器注入TransportClient吗?

1 个答案:

答案 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配置文件。我知道这听起来很痛苦,但是有很多例子,并且知道日志框架在你自己的代码中是非常宝贵的。