Spec-Zone.ru › Elasticsearch 8
›Руководство по Elasticsearch [8.17] ›Мониторинг кластера

Ведение журнала приложений Elasticsearch

Вы можете использовать журналы приложений Elasticsearch для мониторинга кластера и диагностики проблем. Если Elasticsearch запущен как служба, то стандартное расположение журналов зависит от вашей платформы и метода установки:

В Docker сообщения журналов отправляются в консоль и обрабатываются с помощью настроек драйвера ведения журнала Docker. Для доступа к журналам выполните команду docker logs.

В Debian, Elasticsearch записывает журналы в /var/log/elasticsearch.

В RPM установках, Elasticsearch записывает журналы в /var/log/elasticsearch.

В macOS установках, Elasticsearch записывает журналы в $ES_HOME/logs.

Файлы в $ES_HOME могут быть удалены во время обновления. В рабочей среде настоятельно рекомендуется установить path.logs в расположение вне $ES_HOME. См. Настройки пути.

В Linux установках, Elasticsearch записывает журналы в $ES_HOME/logs.

Файлы в $ES_HOME могут быть удалены во время обновления. В рабочей среде настоятельно рекомендуется установить path.logs в расположение вне $ES_HOME. См. Настройки пути.

В Windows установках, Elasticsearch записывает журналы в %ES_HOME%\logs.

Файлы в %ES_HOME% могут быть удалены во время обновления. В рабочей среде настоятельно рекомендуется установить path.logs в расположение вне %ES_HOME%`. См. Настройки пути.

Если вы запускаете Elasticsearch из командной строки, Elasticsearch выводит журналы в стандартный вывод (stdout).

Настройка ведения журнала

Elastic настоятельно рекомендует использовать конфигурацию Log4j 2, поставляемую по умолчанию.

Elasticsearch использует Log4j 2 для ведения журнала. Log4j 2 можно настроить с помощью файла log4j2.properties. Elasticsearch предоставляет три свойства, ${sys:es.logs.base_path}, ${sys:es.logs.cluster_name} и ${sys:es.logs.node_name}, которые можно использовать в конфигурационном файле для определения расположения файлов журналов. Свойство ${sys:es.logs.base_path} будет определять директорию журналов, ${sys:es.logs.cluster_name} будет определять имя кластера (используется в качестве префикса имен файлов журналов в стандартной конфигурации), а ${sys:es.logs.node_name} будет определять имя узла (если имя узла явно задано).

Например, если ваша директория журналов (path.logs) это /var/log/elasticsearch, а имя вашего кластера production, то ${sys:es.logs.base_path} будет равняться /var/log/elasticsearch, а ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}.log будет равняться /var/log/elasticsearch/production.log.

######## Server JSON ############################
appender.rolling.type = RollingFile 
appender.rolling.name = rolling
appender.rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_server.json 
appender.rolling.layout.type = ECSJsonLayout 
appender.rolling.layout.dataset = elasticsearch.server 
appender.rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}-%i.json.gz 
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy 
appender.rolling.policies.time.interval = 1 
appender.rolling.policies.time.modulate = true 
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy 
appender.rolling.policies.size.size = 256MB 
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.fileIndex = nomax
appender.rolling.strategy.action.type = Delete 
appender.rolling.strategy.action.basepath = ${sys:es.logs.base_path}
appender.rolling.strategy.action.condition.type = IfFileName 
appender.rolling.strategy.action.condition.glob = ${sys:es.logs.cluster_name}-* 
appender.rolling.strategy.action.condition.nested_condition.type = IfAccumulatedFileSize 
appender.rolling.strategy.action.condition.nested_condition.exceeds = 2GB 
################################################

Настройка аппендера RollingFile

Запись в /var/log/elasticsearch/production_server.json

Использование JSON-разметки.

dataset — это флаг, заполняющий поле event.dataset в ECSJsonLayout. Это полезно для различения разных типов журналов при их парсинге.

Архивирование логов в /var/log/elasticsearch/production-yyyy-MM-dd-i.json; лог будет сжат при каждом архивировании и i будет инкрементировано

Использование политики архивирования, основанной на времени

Архивирование логов ежедневно

Выравнивание архивирования по границе дня (вместо архивирования каждые 24 часа)

Использование политики архивирования, основанной на размере

Архивирование логов после 256 МБ

Использование действия удаления при архивировании логов

Удаление только логов, соответствующих шаблону файла

Шаблон для удаления только основных логов

Удаление только в случае накопления большого количества сжатых логов

Условие размера для сжатых логов — 2 ГБ

######## Server -  old style pattern ###########
appender.rolling_old.type = RollingFile
appender.rolling_old.name = rolling_old
appender.rolling_old.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_server.log 
appender.rolling_old.layout.type = PatternLayout
appender.rolling_old.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] [%node_name]%marker %m%n
appender.rolling_old.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}-%i.old_log.gz

Конфигурация для аппендеров шаблонов old style. Эти лог-файлы будут сохранены в файлах *.log, и при архивировании — в файлах * .log.gz. Обратите внимание, что они считаются устаревшими и будут удалены в будущем.

Парсинг конфигурации Log4j может нарушиться из-за лишних пробелов; если вы копируете и вставляете настройки Log4j с этой страницы или вводите любую конфигурацию Log4j, убедитесь, что удалены все начальные и конечные пробелы.

Обратите внимание, что вы можете заменить .gz на .zip в appender.rolling.filePattern, чтобы сжать архивированные лог-файлы в формате zip. Если вы удалите расширение .gz, лог-файлы не будут сжиматься при архивировании.

Если вы хотите сохранить файлы журналов в течение определенного периода времени, вы можете использовать стратегию перекачки с действием удаления.

appender.rolling.strategy.type = DefaultRolloverStrategy 
appender.rolling.strategy.action.type = Delete 
appender.rolling.strategy.action.basepath = ${sys:es.logs.base_path} 
appender.rolling.strategy.action.condition.type = IfFileName 
appender.rolling.strategy.action.condition.glob = ${sys:es.logs.cluster_name}-* 
appender.rolling.strategy.action.condition.nested_condition.type = IfLastModified 
appender.rolling.strategy.action.condition.nested_condition.age = 7D 

Настройка аппендера DefaultRolloverStrategy

Настройка действия Delete для обработки перекачки

Базовый путь к логам Elasticsearch

Условие для применения при обработке перекачки

Удаление файлов из базового пути, соответствующих глобу ${sys:es.logs.cluster_name}-*; это глоб, к которому файлы логов перекачиваются; это необходимо для удаления только архивированных логов Elasticsearch, а не удаления логов устаревших и медленных операций

Вложенное условие для применения к файлам, соответствующим глобу

Сохранение логов в течение семи дней

Можно загрузить несколько конфигурационных файлов (они будут объединены), если они имеют имя log4j2.properties и являются подкаталогами директории конфигурации Elasticsearch; это полезно для плагинов, которые предоставляют дополнительные логгеры. Раздел logger содержит java-пакеты и их соответствующий уровень ведения журнала. Раздел appender содержит пункты назначения для логов. Подробную информацию о настройке ведения журнала и всех поддерживаемых аппендерах можно найти в документации Log4j.

Настройка уровней ведения журнала

Сообщения журнала Log4J 2 включают поле level, которое может принимать следующие значения (в порядке возрастания подробности):

  • FATAL
  • ERROR
  • WARN
  • INFO
  • DEBUG
  • TRACE

По умолчанию Elasticsearch включает все сообщения на уровнях INFO, WARN, ERROR и FATAL в своих логах, но фильтрует сообщения на уровнях DEBUG и TRACE. Это рекомендуемая конфигурация. Не фильтруйте сообщения на уровнях INFO или выше, иначе вы можете не понять поведение вашего кластера или не сможете устранить распространённые проблемы. Не включайте логирование на уровнях DEBUG или TRACE, если это не указано в другом месте этого руководства, или вы не являетесь экспертом, который будет читать исходный код Elasticsearch для определения смысла логов.

Сообщения регистрируются иерархией логгеров, которая соответствует иерархии Java-пакетов и классов в исходном коде Elasticsearch. Каждый логгер имеет соответствующее динамическое свойство, которое можно использовать для управления объёмом своих логов. Имя свойства — полное имя пакета или класса, префикс которого logger..

Вы можете установить объём каждого логгера в имя уровня логирования, например, DEBUG, что означает, что сообщения от этого логгера на уровнях до указанного будут включены в логи. Вы также можете использовать значение OFF для подавления всех сообщений от логгера.

Например, пакет org.elasticsearch.discovery содержит функциональность, связанную с процессом открытия, и вы можете контролировать объём своих логов с помощью свойства logger.org.elasticsearch.discovery. Чтобы включить логирование DEBUG для этого пакета, используйте API настроек кластера следующим образом:

resp = client.cluster.put_settings(
    persistent={
        "logger.org.elasticsearch.discovery": "DEBUG"
    },
)
print(resp)
response = client.cluster.put_settings(
  body: {
    persistent: {
      'logger.org.elasticsearch.discovery' => 'DEBUG'
    }
  }
)
puts response
const response = await client.cluster.putSettings({
  persistent: {
    "logger.org.elasticsearch.discovery": "DEBUG",
  },
});
console.log(response);
PUT /_cluster/settings
{
  "persistent": {
    "logger.org.elasticsearch.discovery": "DEBUG"
  }
}

Чтобы сбросить объём логирования этого пакета до его значения по умолчанию, установите свойство логгера в null:

resp = client.cluster.put_settings(
    persistent={
        "logger.org.elasticsearch.discovery": None
    },
)
print(resp)
response = client.cluster.put_settings(
  body: {
    persistent: {
      'logger.org.elasticsearch.discovery' => nil
    }
  }
)
puts response
const response = await client.cluster.putSettings({
  persistent: {
    "logger.org.elasticsearch.discovery": null,
  },
});
console.log(response);
PUT /_cluster/settings
{
  "persistent": {
    "logger.org.elasticsearch.discovery": null
  }
}

Другие способы изменения уровней логирования:

  1. elasticsearch.yml:

    logger.org.elasticsearch.discovery: DEBUG

    Это наиболее подходит для отладки проблемы на одном узле.

  2. log4j2.properties:

    logger.discovery.name = org.elasticsearch.discovery
    logger.discovery.level = debug

    Это наиболее подходит, когда вам уже необходимо изменить конфигурацию Log4j 2 по другим причинам. Например, вы можете направить логи для определённого логгера в другой файл. Однако такие случаи встречаются редко.

Прикладные логи Elasticsearch предназначены для чтения и интерпретации человеком. Разные версии Elasticsearch могут сообщать информацию в этих логах по-разному, возможно, добавляя дополнительные детали, удаляя ненужную информацию, форматируя одинаковую информацию по-разному, переименовывая логгер или изменяя уровень логирования для определённых сообщений. Не полагайтесь на то, что содержимое прикладных логов останется неизменным между версиями.

Чтобы предотвратить утечку конфиденциальной информации в логах, Elasticsearch по умолчанию подавляет некоторые сообщения в логах, даже при самых высоких уровнях детализации. Чтобы отключить эту защиту на узле, установите системную переменную Java es.insecure_network_trace_enabled в значение true. Эта функция предназначена в первую очередь для тестовых систем, не содержащих конфиденциальной информации. Если вы установите эту переменную в системе, содержащей конфиденциальную информацию, необходимо защитить ваши логи от несанкционированного доступа.

Логирование устаревания

Elasticsearch также записывает логи устаревания в каталог логов. Эти логи записывают сообщение, когда вы используете устаревшую функциональность Elasticsearch. Вы можете использовать логи устаревания для обновления своего приложения перед обновлением Elasticsearch до новой основной версии.

По умолчанию Elasticsearch архивирует и сжимает логи устаревания через 1 ГБ. По умолчанию сохраняется максимум пять файлов логов: четыре архивированных лога и активный лог.

Elasticsearch генерирует сообщения об устаревании на уровне CRITICAL. Эти сообщения указывают на то, что используемая функция устаревания будет удалена в следующей основной версии. Сообщения об устаревании на уровне WARN указывают, что была использована менее важная функция, она не будет удалена в следующей основной версии, но может быть удалена в будущем.

Чтобы прекратить запись сообщений об устаревании, установите logger.deprecation.level в значение OFF в log4j2.properties:

logger.deprecation.level = OFF

В качестве альтернативы, вы можете изменить уровень логирования динамически:

resp = client.cluster.put_settings(
    persistent={
        "logger.org.elasticsearch.deprecation": "OFF"
    },
)
print(resp)
response = client.cluster.put_settings(
  body: {
    persistent: {
      'logger.org.elasticsearch.deprecation' => 'OFF'
    }
  }
)
puts response
const response = await client.cluster.putSettings({
  persistent: {
    "logger.org.elasticsearch.deprecation": "OFF",
  },
});
console.log(response);
PUT /_cluster/settings
{
  "persistent": {
    "logger.org.elasticsearch.deprecation": "OFF"
  }
}

См. Настройка уровней логирования.

Вы можете определить, что вызывает устаревшую функциональность, если X-Opaque-Id использовался в качестве заголовка HTTP. Идентификатор пользователя включён в поле X-Opaque-ID в JSON-логах устаревания.

{
  "type": "deprecation",
  "timestamp": "2019-08-30T12:07:07,126+02:00",
  "level": "WARN",
  "component": "o.e.d.r.a.a.i.RestCreateIndexAction",
  "cluster.name": "distribution_run",
  "node.name": "node-0",
  "message": "[types removal] Using include_type_name in create index requests is deprecated. The parameter will be removed in the next major version.",
  "x-opaque-id": "MY_USER_ID",
  "cluster.uuid": "Aq-c-PAeQiK3tfBYtig9Bw",
  "node.id": "D7fUYfnfTLa2D7y-xw6tZg"
}

Логи устаревания могут быть индексированы в .logs-deprecation.elasticsearch-default поток данных cluster.deprecation_indexing.enabled свойство установлено в true.

Управление потоком логов устаревания

Логи устаревания дедуплицируются на основе ключа устаревшей функции и x-opaque-id, чтобы в случае многократного использования функции не перегружать логи устаревания. Это относится как к индексируемым логам устаревания, так и к логам, отправляемым в файлы логов. Вы можете отключить использование x-opaque-id в ограничении, изменив cluster.deprecation_indexing.x_opaque_id_used.enabled на false. Обратитесь к классу javadoc для получения более подробной информации.

Формат логов JSON

Для упрощения анализа логов Elasticsearch логи теперь выводятся в формате JSON. Это настраивается свойством макета Log4J appender.rolling.layout.type = ECSJsonLayout. Этот макет требует установки атрибута dataset, который используется для различения потоков логов при анализе.

appender.rolling.layout.type = ECSJsonLayout
appender.rolling.layout.dataset = elasticsearch.server

Каждая строка содержит один JSON-документ со свойствами, настроенными в ECSJsonLayout. См. javadoc для получения более подробной информации. Однако, если JSON-документ содержит исключение, он будет выведен на нескольких строках. Первая строка будет содержать обычные свойства, а последующие строки — стек исключений, отформатированный в виде JSON-массива.

Вы по-прежнему можете использовать собственный пользовательский макет. Для этого замените строку appender.rolling.layout.type другим макетом. Пример ниже:

appender.rolling.type = RollingFile
appender.rolling.name = rolling
appender.rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_server.log
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] [%node_name]%marker %.-10000m%n
appender.rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}-%i.log.gz

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/logging.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API