Ведение журнала
Вы можете использовать системные журналы Elasticsearch для мониторинга кластера и диагностики проблем. Если Elasticsearch запущен как служба, расположение журналов по умолчанию зависит от вашей платформы и метода установки:
В Docker журналы отображаются в консоли и обрабатываются настроенным драйвером ведения журналов Docker. Для доступа к логам выполните docker logs.
Для установок Debian, Elasticsearch записывает журналы в /var/log/elasticsearch.
Для установок RPM, Elasticsearch записывает журналы в /var/log/elasticsearch.
Для установок macOS .tar.gz, Elasticsearch записывает журналы в $ES_HOME/logs.
Файлы в $ES_HOME могут быть удалены при обновлении. В рабочей среде настоятельно рекомендуется установить path.logs в расположение, отличное от $ES_HOME. См. Настройки путей.
Для установок macOS Homebrew, Elasticsearch записывает журналы в /usr/local/var/log/elasticsearch.
Для установок Linux .tar.gz, Elasticsearch записывает журналы в $ES_HOME/logs.
Файлы в $ES_HOME могут быть удалены при обновлении. В рабочей среде настоятельно рекомендуется установить path.logs в расположение, отличное от $ES_HOME. См. Настройки путей.
Для установок Windows .zip, 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 = ESJsonLayout
appender.rolling.layout.type_name = 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.
Настройка уровней ведения журнала
Каждый пакет Java в исходном коде Elasticsearch имеет соответствующий логгер. Например, пакет org.elasticsearch.discovery содержит logger.org.elasticsearch.discovery для журналов, связанных с процессом дискoвери.
Чтобы получить более или менее подробные журналы, используйте API настроек обновления кластера, чтобы изменить уровень журналов соответствующего регистратора. Каждый регистратор принимает встроенные в Log4j 2 уровни журналов, от наименее до наиболее подробных: OFF, FATAL, ERROR, WARN, INFO, DEBUG и TRACE. По умолчанию уровень журнала равен INFO. Сообщения, записанные на более высоких уровнях подробности (DEBUG и TRACE), предназначены только для опытных пользователей.
PUT /_cluster/settings
{
"persistent": {
"logger.org.elasticsearch.discovery": "DEBUG"
}
} Другие способы изменения уровней журналов:
-
elasticsearch.yml:logger.org.elasticsearch.discovery: DEBUG
Это наиболее подходящий вариант при отладке проблемы на одном узле.
-
log4j2.properties:logger.discovery.name = org.elasticsearch.discovery logger.discovery.level = debug
Это наиболее подходящий вариант, когда вам уже необходимо изменить конфигурацию Log4j 2 по другим причинам. Например, вы можете направить журналы для определенного регистратора в другой файл. Однако такие случаи встречаются редко.
Журналирование устаревания
Elasticsearch также записывает журналы устаревания в директорию журналов. Эти журналы записывают сообщение, когда вы используете устаревшую функциональность Elasticsearch. Вы можете использовать журналы устаревания для обновления своего приложения перед обновлением Elasticsearch до новой основной версии.
По умолчанию Elasticsearch выполняет сворачивание и сжатие журналов устаревания при достижении 1 ГБ. По умолчанию сохраняется максимум пять файлов журналов: четыре свернутых журнала и активный журнал.
Elasticsearch выводит сообщения журналов устаревания на уровне CRITICAL. Эти сообщения указывают, что используемая устаревшая функция будет удалена в следующей основной версии. Сообщения журналов устаревания на уровне WARN указывают, что была использована менее критическая функция, она не будет удалена в следующей основной версии, но может быть удалена в будущем.
Чтобы прекратить запись сообщений журналов устаревания, установите logger.deprecation.level на OFF в log4j2.properties:
logger.deprecation.level = OFF
В качестве альтернативы можно динамически изменить уровень ведения журнала:
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. См. RateLimitingFilter
Формат JSON-журнала
Для облегчения парсинга журналов Elasticsearch журналы теперь выводятся в формате JSON. Это настраивается свойством макета Log4J appender.rolling.layout.type = ESJsonLayout. Этот макет требует наличия атрибута type_name, который используется для различения потоков журналов при парсинге.
appender.rolling.layout.type = ESJsonLayout appender.rolling.layout.type_name = server
Каждая строка содержит один JSON-документ со свойствами, настроенными в ESJsonLayout. Более подробные сведения см. в документации этого класса. Однако, если 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/7.17/logging.html