Предупреждение регистратора с использованием 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?


person Ruben    schedule 03.07.2014    source источник
comment
Привет. У меня такая же проблема на данный момент. Гугление описания проблемы привело меня сюда. Вы решили проблему? Если да, то не могли бы поделиться решением?   -  person Ghost93    schedule 02.04.2015
comment
Поэтому я только что открыл проблему, касающуюся этой проблемы, в репозитории elasticsearch github. Надеюсь ответ придет оттуда...   -  person Ghost93    schedule 03.04.2015


Ответы (1)


Для log4j нет нулевого приложения. Хотя вы могли бы сделать это с помощью slf4j, я не уверен, что вы можете связать библиотеку, которая ожидает, что log4j вместо этого будет использовать slf4j. За исключением этого (болезненного) упражнения, я рекомендую вам просто добавить log4j-1.2.jar в ваш путь к классам и настроить файл 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

Существует множество вариантов, которые будут работать так же хорошо, например, использование файлового приложения и ограничение его размера до 1 КБ или что-то в этом роде.

А log4j — это EOL. Таким образом, вы можете сделать то же самое, но использовать для него jar log4j2 и соответствующий файл конфигурации json/xml. Я знаю, это звучит болезненно, но есть масса примеров, и знание структуры ведения журнала будет бесценным в вашем собственном коде.

person Robin Coe    schedule 15.09.2015