Ведение журнала приложений 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
################################################ | Настройка аппендера | |
| Запись в | |
| Использование JSON-разметки. | |
|
| |
| Архивирование логов в | |
| Использование политики архивирования, основанной на времени | |
| Архивирование логов ежедневно | |
| Выравнивание архивирования по границе дня (вместо архивирования каждые 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 | Конфигурация для аппендеров шаблонов |
Парсинг конфигурации 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 | Настройка аппендера | |
| Настройка действия | |
| Базовый путь к логам 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
}
} Другие способы изменения уровней логирования:
-
elasticsearch.yml:logger.org.elasticsearch.discovery: DEBUG
Это наиболее подходит для отладки проблемы на одном узле.
-
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