1

ドキュメント処理を実行し、Elasticsearch インデックスにドキュメントを追加する Java コンソール アプリケーションを作成しています。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 を使用して独自のクライアント呼び出しをログに記録するように独自のアプリケーションをコーディングする必要があります。その場合、おそらくローリング ファイル アペンダが必要になるでしょう。本当にすべてのログ イベントを破棄したい場合は、stdout と stderr を /dev/null にパイプします。

$ ./myprog &> /dev/null

ファイルアペンダーを使用してサイズを1Kなどに制限するなど、同様に機能するバリアントがたくさんあります。

そしてlog4jはEOLです。したがって、同じことを行うことができますが、log4j2 jar とそれに適切な json/xml 構成ファイルを使用します。面倒に聞こえるかもしれませんが、たくさんの例があり、ロギング フレームワークを知っていることは、独自のコードで非常に貴重です。

于 2015-09-15T20:15:04.320 に答える