Предупреждение логгера с использованием Elasticsearch Java API

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();
}

Все работает хорошо и dandy, и документы добавляются в индекс, когда я вызываю этот код из консольного приложения, но при его запуске я получаю предупреждающие сообщения:

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?

  • 0
    Здравствуй. У меня такая же проблема на данный момент. Погуглив описание проблемы, я попал сюда. Вы решили проблему? Если да, могли бы поделиться решением?
  • 1
    Так что я только что открыл проблему, касающуюся этой проблемы, в GitHub-хранилищеasticsearch. Надеюсь, что ответ придет оттуда ...
Теги:
log4j
elasticsearch

1 ответ

0

Нет никакого Null appender для log4j. Хотя вы можете сделать это с помощью slf4j, я не уверен, что вы можете связать библиотеку, которая ожидает, что log4j будет использовать slf4j. За исключением этого (болезненного) упражнения, я рекомендую вам просто добавить log4j-1.2.jar в свой путь к классам и настроить файл log4j.properties с корневым регистратором, который указывает на stdout:

# 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

Есть куча вариантов, которые будут работать так же хорошо, как использование файла appender и ограничение его размера до 1K или что-то еще.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню