Логирование в Solr

Под капотом Solr использует фреймворк Log4j 2 для ведения логов. Сервис генерирует несколько типов лог-файлов, а также предоставляет Logging UI для просмотра и анализа логов Solr. Все настройки логирования указываются через конфигурационные файлы Log4j2, которые можно редактировать через ADCM.

Расположение и формат лог-файлов

Solr генерирует несколько типов логов для сохранения всех событий в системе. В файловой системе эти логи хранятся в виде обычных текстовых файлов с расширением .log в директории /var/log/solr/ (локация по умолчанию). Большинство лог-событий Solr имеют следующую структуру:

2024-10-21 15:04:36.923 INFO  (coreLoadExecutor-27-thread-1-processing-n:ka-adh-3.ru-central1.internal:8983_solr) [c:test_collection s:shard1 r:core_node2 x:test_collection_shard1_replica_n1] o.a.s.c.CoreContainer Creating SolrCore 'test_collection_shard1_replica_n1' using configuration from configset test_collection, trusted=true

Путь к лог-файлам настраивается индивидуально и может быть изменен путем редактирования конфигурации log4j2.xml через ADCM. Пример содержимого директории /var/log/solr/ показан ниже:

-rw-r--r-- 1 solr solr    3141 Nov  6 12:50 solr-8983-console.log (1)
-rw-r--r-- 1 solr solr  703758 Nov 10 20:11 solr_gc.log.0.current (2)
-rw-r--r-- 1 solr solr 4686227 Nov  9 13:00 solr.log (3)
-rw-r--r-- 1 solr solr  113261 Oct 21 15:23 solr.log.1
-rw-r--r-- 1 solr solr 9054280 Oct 28 23:32 solr.log.10
-rw-r--r-- 1 solr solr  178374 Oct 21 15:52 solr.log.2
-rw-r--r-- 1 solr solr 1829020 Oct 22 19:02 solr.log.3
-rw-r--r-- 1 solr solr   40809 Oct 22 19:10 solr.log.4
-rw-r--r-- 1 solr solr   53809 Oct 22 19:14 solr.log.5
-rw-r--r-- 1 solr solr  463368 Oct 22 19:43 solr.log.6
-rw-r--r-- 1 solr solr   68754 Oct 22 19:50 solr.log.7
-rw-r--r-- 1 solr solr   57230 Oct 22 19:54 solr.log.8
-rw-r--r-- 1 solr solr  234734 Oct 22 20:31 solr.log.9
-rw-r--r-- 1 solr solr       0 Oct 21 14:21 solr_slow_requests.log (4)
1 Хранит вывод консоли Solr, перенаправленный в STDOUT.
2 Хранит информацию о вызовах GC в Solr.
3 Основные файлы логов, в которых хранятся записи событий. По умолчанию файлы solr.log.{n} ротируются по достижении определенного размера.
4 Хранит информацию о медленных запросах.

Настройка логирования

При использовании Log4j2 настройка процесса логирования в Solr сводится к редактированию соответствующих конфигурационных файлов Log4j2:

  • log4j2.xml — основной конфигурационный файл, отвечающий за логирование всех событий Solr Server.

  • log4j2-console.xml — конфигурационный файл, отвечающий за логирование активности консольного клиента.

Данные файлы хранятся в директории /usr/lib/solr/server/resources и Solr считывает их при запуске. ADCM предоставляет редактор, в котором вы можете изменить содержимое этих файлов. Чтобы отредактировать конфигурацию Log4j2 с помощью ADCM:

  1. В ADCM перейдите на страницу Clusters → <clusterName> → Services → Solr → Components → Solr Server → Primary configuration.

  2. Выберите нужный файл конфигурации Log4j2 (например, log4j2.xml).

  3. Измените конфигурацию. Ниже в статье представлен дефолтный файл log4j2.xml, в котором описаны основные конфигурационные параметры. Подробная информация о конфигурационных свойствах Log4j доступна в документации Log4j 2.

  4. Сохраните конфигурацию сервиса Solr.

  5. Выполните рестарт сервиса Solr.

Стандартный файл log4j2.xml

Ниже приведена стандартная конфигурация log4j2.xml, используемая Solr. Основные параметры конфигурации выделены комментариями.

<?xml version="1.0" encoding="UTF-8"?>
<!-- Configuration for asynchronous logging -->
<Configuration>
<Appenders>
    <Console name="STDOUT" target="SYSTEM_OUT"> (1)
      <PatternLayout>
        <Pattern> (2)
          %maxLen{%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p (%t) [%X{collection} %X{shard} %X{replica} %X{core}] %c{1.} %m%notEmpty{ =>%ex{short}}}{10240}%n
        </Pattern>
      </PatternLayout>
    </Console>

    <RollingRandomAccessFile (3)
        name="MainLogFile"
        fileName="/var/log/solr/solr.log" (4)
        filePattern="/var/log/solr/solr.log.%i" > (5)
      <PatternLayout>
        <Pattern>
          %maxLen{%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p (%t) [%X{collection} %X{shard} %X{replica} %X{core}] %c{1.} %m%notEmpty{ =>%ex{short}}}{10240}%n
        </Pattern>
      </PatternLayout>
      <Policies>
        <OnStartupTriggeringPolicy /> (6)
        <SizeBasedTriggeringPolicy size="32 MB"/> (7)
      </Policies>
      <DefaultRolloverStrategy max="10"/> (8)
    </RollingRandomAccessFile>

    <RollingRandomAccessFile (9)
        name="SlowLogFile"
        fileName="/var/log/solr/solr_slow_requests.log"
        filePattern="/var/log/solr/solr_slow_requests.log.%i" >
      <PatternLayout>
        <Pattern>
          %maxLen{%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p (%t) [%X{collection} %X{shard} %X{replica} %X{core}] %c{1.} %m%notEmpty{ =>%ex{short}}}{10240}%n
        </Pattern>
      </PatternLayout>
      <Policies>
        <OnStartupTriggeringPolicy />
        <SizeBasedTriggeringPolicy size="32 MB"/>
      </Policies>
      <DefaultRolloverStrategy max="10"/>
    </RollingRandomAccessFile>

  </Appenders>
  <Loggers> (10)
    <AsyncLogger name="org.apache.hadoop" level="warn"/>
    <AsyncLogger name="org.apache.solr.update.LoggingInfoStream" level="off"/>
    <AsyncLogger name="org.apache.zookeeper" level="warn"/>
    <AsyncLogger name="org.apache.solr.core.SolrCore.SlowRequest" level="info" additivity="false">
      <AppenderRef ref="SlowLogFile"/>
    </AsyncLogger>

    <AsyncRoot level="info">
      <AppenderRef ref="MainLogFile"/>
      <AppenderRef ref="STDOUT"/>
    </AsyncRoot>
  </Loggers>
</Configuration>

<!-- Configuration for synchronous logging
there _may_ be a very small window where log messages will not be flushed
to the log file on abnormal shutdown. If even this risk is unacceptable, use
the configuration below
-->
<!--Configuration>
    ...
</Configuration-->
1 Консольный аппендер (appender) с именем STDOUT, который направляет логи в стандартный вывод.
2 Шаблон, используемый для формирования отдельных лог-записей, сохраняемых в файл аппендером. Подробная информация о синтаксисе PatternLayout доступна на странице Log4j2 layouts.
3 Использование аппендера RollingRandomAccessFile, который записывает Solr-логи в файлы, ротируемые по размеру.
4 Указание имени лог-файла.
5 Указание шаблона имен лог-файлов при выполнении переноса (rollover).
6 Политика, выполняющая перенос при каждом запуске Solr.
7 Политика, выполняющая перенос при достижении файлом размера 32 МБ.
8 Определяет максимальное количество архивных логов. Когда этот предел достигнут, самые старые файлы удаляются.
9 Использование аппендера RollingRandomAccessFile, который записывает информацию о медленных запросах.
10 Список всех логеров (loggers), которые логируют события Solr.
ПРИМЕЧАНИЕ
По умолчанию файл log4j2.xml имеет две конфигурации — для синхронного и асинхронного логирования. Синхронная конфигурация отключена по умолчанию, так как асинхронное логирование Log4j обеспечивает лучшую производительность, выполняя все операции ввода-вывода в отдельном потоке. Однако в случае нештатного завершения работы Solr существует вероятность, что некоторые события могут не записаться на диск и, таким образом, могут быть потеряны. Если это неприемлемо, используйте синхронную конфигурацию Logj2. Для этого в файле _log4j2.xml закомментируйте блок с асинхронной конфигурацией, затем раскомментируйте блок с синхронной конфигурацией и перезапустите Solr.

Loglevel API

Solr предоставляет REST-эндпойнт для обновления конфигурации логирования компонентов Solr. Например, чтобы установить новый уровень логирования для отдельного компонента Solr (org.apache.solr.security), отправьте следующий запрос:

$ curl http://ka-adh-3.ru-central1.internal:8983/solr/admin/info/logging --data-binary "set=org.apache.solr.security:WARN"

Запрос на установку уровня логирования сразу для нескольких компонентов Solr (например, для всех дочерних компонентов org.apache.zookeeper) выглядит следующим образом:

$ curl http://ka-adh-3.ru-central1.internal:8983/solr/admin/info/logging --data-binary "set=org.apache.zookeeper:WARN"

В качестве ответа Solr возвращает JSON-документ, отражающий текущие уровни Log4j2 для каждого компонента Solr. Пример ответа приведен ниже.

Ответ Solr-сервера

 

{
  "responseHeader":{
    "status":0,
    "QTime":1},
  "watcher":"Log4j2",
  "levels":["ALL",
    "TRACE",
    "DEBUG",
    "INFO",
    "WARN",
    "ERROR",
    "FATAL",
    "OFF"],
  "loggers":[{
      "name":"root",
      "level":"INFO",
      "set":true},
    {
      "name":"com",
      "level":null,
      "set":false},
    {
      "name":"com.codahale",
      "level":null,
      "set":false},
    {
      "name":"com.codahale.metrics",
      "level":null,
      "set":false},
    {
      "name":"com.codahale.metrics.jmx",
      "level":null,
      "set":false},
    {
      "name":"com.codahale.metrics.jmx.JmxReporter",
      "level":"INFO",
      "set":true},
    {
      "name":"org",
      "level":"INFO",
      "set":true},
    {
      "name":"org.apache",
      "level":null,
      "set":false},
    {
      "name":"org.apache.calcite",
      "level":null,
      "set":false},
    {
      "name":"org.apache.calcite.avatica",
      "level":null,
      "set":false},
    {
      "name":"org.apache.calcite.avatica.remote",
      "level":null,
      "set":false},
    {
      "name":"org.apache.calcite.avatica.remote.Driver",
      "level":"INFO",
      "set":true},
    {
      "name":"org.apache.hadoop",
      "level":"WARN",
      "set":true},
    ....

Логирование медленных запросов

В приложениях, которые часто отправляют поисковые запросы Solr, логирование каждого запроса может привести к избыточному количеству лог-данных и, в зависимости от объема, может негативно отразиться на производительности. Когда подробные логи необходимы (например, для автоматического анализа логов или раннего обнаружения возможных проблем), логирование каждого запроса может быть полезным. С другой стороны, если вас интересуют только предупреждения и ошибки, связанные с запросами, вы можете установить уровень WARN для ведения логов. Однако в этом случае возникает потенциальная проблема — Solr не будет выдавать предупреждения о запросах, которые выполняются длительное время, поскольку такие запросы будут логироваться с уровнем INFO.

Если вы хотите использовать уровень логирования WARN, но при этом также иметь возможность обнаруживать медленные запросы, Solr предоставляет возможность установить тайм-аут, при превышении которого запрос будет считаться медленным. Такие запросы будут логироваться с уровнем WARN, что позволит легко выявить медленные запросы в системе. Чтобы включить эту функцию, добавьте параметр slowQueryThresholdMillis в solrconfig.xml. Например:

<requestHandler name="/select" class="solr.SearchHandler">
  <int name="slowQueryThresholdMillis">3000</int>
</requestHandler>

Все запросы, которые выполняются дольше указанного периода, будут логироваться как медленные на уровне WARN. Такие события записываются в отдельный лог-файл, который по умолчанию называется solr_slow_requests.log.

Logging UI

Вы можете увидеть логи Solr на странице Logging в Solr Admin UI, как показано ниже.

Logging
Страница Logging
Logging
Страница Logging

Кроме того, используя вкладку Level, можно контролировать объем информации, генерируемой отдельными компонентами и классами Solr. Для этого установите желаемый уровень логирования для компонентов Solr, доступных на странице. Обратите внимание, что узлы компонентов имеют иерархичную структуру, то есть вы можете установить уровень логирования для одного узла, и он будет унаследован всеми его дочерними компонентами. Это позволяет изменить сразу несколько категорий, изменяя уровень логирования одного родительского элемента.

Страница Level
Страница Level
Страница Level
Страница Level
ПРИМЕЧАНИЕ
На этой странице можно изменить настройки логирования только для запущенного экземпляра Solr Server. Эти настройки не сохраняются для следующего запуска Solr.
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней