1

我正在编写一个 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 中吗?

4

1 回答 1

0

log4j 没有 Null 附加程序。虽然您可以使用 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 并记录您自己的客户端调用。在这种情况下,您可能需要一个滚动文件附加程序。如果您真的想丢弃所有日志事件,请将您的标准输出和标准错误通过管道传输到 /dev/null:

$ ./myprog &> /dev/null

有很多变体也可以正常工作,比如使用文件追加器并将其大小限制为 1K 或其他东西。

log4j 是 EOL。所以你可以做同样的事情,但使用 log4j2 jar 和适当的 json/xml 配置文件。我知道这听起来很痛苦,但是有大量示例,并且知道日志记录框架在您自己的代码中将是无价的。

于 2015-09-15T20:15:04.320 回答