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

Обзор

ZooKeeper записывает выходные данные и события процессов файловой системы в текстовые логи. Эта информация может быть полезна при диагностике технических проблем в системе.

Каждый компонент ZooKeeper хранит логи локально, на хосте, на котором он установлен. Логи имеют расширение .log и расположены в директории /var/log/zookeeper/. Здесь же находятся файлы .out, содержащие информацию о запуске компонентов.

Имена файлов с логами имеют следующий формат: zookeeper-<пользователь>-<компонент>-<хост>.log.

Здесь:

  • <пользователь> — пользователь, запускающий ZooKeeper;

  • <компонент> — имя компонента, например, сервер ZooKeeper;

  • <хост> — FQDN хоста компонента.

ZooKeeper использует для логирования библиотеки SLF4J и Log4J.

Поиск по логам

Чтобы найти в логах интересующую вас информацию, например, сообщения об ошибках, подключитесь к хосту с компонентом, логи которого вы хотите просмотреть, и воспользуйтесь командой grep.

Например:

$ cat /var/log/zookeeper/zookeeper-zookeeper-cli-elenas-adh3.ru-central1.internal.log | grep -i -A3 -B1 error

Эта команда просматривает лог ZooKeeper CLI на хосте elenas-adh3.ru-central1.internal и ищет сообщения, содержащие слово error. Опция i позволяет игнорировать различия в регистре, а опции -A3 -B1 добавляют к найденной строке с ошибкой одну строчку до нее и три строчки после.

Пример вывода команды:

2023-11-28 12:39:02,986 [myid:] - INFO  [main:ClientCnxn@1681] - zookeeper.request.timeout value is 0. feature enabled=
2023-11-28 12:39:02,991 [myid:elenas-adh3.ru-central1.internal:2181] - INFO  [main-SendThread(elenas-adh3.ru-central1.internal:2181):ClientCnxn$SendThread@1125] - Opening socket connection to server elenas-adh3.ru-central1.internal/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
2023-11-28 12:39:03,041 [myid:elenas-adh3.ru-central1.internal:2181] - INFO  [main-SendThread(elenas-adh3.ru-central1.internal:2181):ClientCnxn$SendThread@972] - Socket connection established, initiating session, client: /127.0.0.1:53166, server: elenas-adh3.ru-central1.internal/127.0.0.1:2181
2023-11-28 12:39:03,065 [myid:elenas-adh3.ru-central1.internal:2181] - INFO  [main-SendThread(elenas-adh3.ru-central1.internal:2181):ClientCnxn$SendThread@1415] - Session establishment complete on server elenas-adh3.ru-central1.internal/127.0.0.1:2181, sessionid = 0x1000010f7e50000, negotiated timeout = 30000
2023-11-28 12:39:03,855 [myid:] - INFO  [main:Environment@109] - Client environment:zookeeper.version=3.5.10-c4d50586fc8f6fdbdc95b05e9b21b49ec0bd8566, built on 11/03/2022 08:23 GM

Уровни логирования

ZooKeeper поддерживает следующие уровни логирования (от наименее информативного к наиболее информативному):

  1. FATAL — сообщает, что операция не может быть выполнена и будет завершена.

  2. ERROR — уведомляет, что программа работает неправильно или прекратила работу.

  3. WARN — предупреждает о потенциальных проблемах. Это означает, что программа работает не по стандартному сценарию и в будущем могут возникнуть проблемы.

  4. INFO — передает информацию о жизненном цикле или состоянии программы.

  5. DEBUG — выводит отладочную информацию о внутренних состояниях программы.

  6. TRACE — выводит сообщения, отслеживающие ход выполнения программы.

Logger Log4j также принимает значения уровня логирования: OFF — для отключения логирования, и ALL — для разрешения всех типов сообщений.

Включение одного уровня логирования включит этот уровень и все уровни до него. Например, если установлен уровень логирования WARN, то в логи будут попадать только WARN, ERROR и FATAL, но не INFO, DEBUG и TRACE.

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

Настроить параметры логирования в ZooKeeper можно в файле конфигурации log4j.properties, который расположен на каждом хосте ZooKeeper в директории etc/zookeeper/conf/.

Файл log4j.properties содержит общие настройки логирования, а также настройки компонентов логирования: logger и appender. Параметры, которые вы устанавливаете для logger-компонентов, влияют на то, что программы сообщают системе. Параметры, которые вы устанавливаете для appender-компонентов, влияют на то, какая информация от logger-компонентов попадает в логи.

Конфигурация log4j.properties начинается с параметров по умолчанию для root logger. Он обрабатывает все сообщения в ZooKeeper, поскольку это единственный обработчик сообщений. Настройки root logger по умолчанию: INFO, CONSOLE, ROLLINGFILE. Это означает, что сообщения ниже уровня INFO отбрасываются, а остальные сообщения попадают как в консоль (CONSOLE appender), так и в логи (ROLLINGFILE appender).

Appender-компоненты по умолчанию:

  • CONSOLE — выводит сообщения в консоль (например, информацию о работе команды CLI);

  • ROLLINGFILE — сохраняет сообщения в логи и периодически обновляет их.

Вы можете использовать класс appenders layout, чтобы изменить формат сообщений в логах. Кроме самого сообщения шаблон сообщений по умолчанию включает: уровень логирования, дату, информацию о выполнении команды и ее вызове.

Более подробно об архитектуре Log4j читайте в документации Apache Logging Services.

Файл ZooKeeper log4j.properties по умолчанию
# Define some default values that can be overridden by system properties
zookeeper.root.logger="{{ services.zookeeper.config['zookeeper_env_content']['ZOO_LOG4J_PROP'] }}"
zookeeper.console.threshold=INFO
zookeeper.log.dir="{{ services.zookeeper.config['zookeeper_env_content']['ZOO_LOG_DIR'] }}"
zookeeper.log.file=zookeeper.log
zookeeper.log.threshold=INFO
zookeeper.tracelog.dir="{{ services.zookeeper.config['zookeeper_env_content']['ZOO_LOG_DIR'] }}"
zookeeper.tracelog.file=zookeeper.log

#
# ZooKeeper Logging Configuration
#

# Format is "<default threshold> (, <appender>)+

# DEFAULT: console appender only
log4j.rootLogger=${zookeeper.root.logger}

# Example with rolling log file
#log4j.rootLogger=DEBUG, CONSOLE, ROLLINGFILE

# Example with rolling log file and tracing
#log4j.rootLogger=TRACE, CONSOLE, ROLLINGFILE, TRACEFILE

#
# Log INFO level and above messages to the console
#
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=${zookeeper.console.threshold}
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n

#
# Add ROLLINGFILE to rootLogger to get log file output
#    Log DEBUG level and above messages to a log file
log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLINGFILE.Threshold=${zookeeper.log.threshold}
log4j.appender.ROLLINGFILE.File=${zookeeper.log.dir}/${zookeeper.log.file}

# Max log file size of 10MB
log4j.appender.ROLLINGFILE.MaxFileSize=10MB
# uncomment the next line to limit number of backup files
#log4j.appender.ROLLINGFILE.MaxBackupIndex=10

log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n


#
# Add TRACEFILE to rootLogger to get log file output
#    Log DEBUG level and above messages to a log file
log4j.appender.TRACEFILE=org.apache.log4j.FileAppender
log4j.appender.TRACEFILE.Threshold=TRACE
log4j.appender.TRACEFILE.File=${zookeeper.tracelog.dir}/${zookeeper.tracelog.file}

log4j.appender.TRACEFILE.layout=org.apache.log4j.PatternLayout
### Notice we are including log4j's NDC here (%x)
log4j.appender.TRACEFILE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L][%x] - %m%n

Чтобы изменить log4j.properties на всех хостах одновременно, используйте ADCM:

  1. На странице Clusters выберите нужный кластер.

  2. Перейдите на вкладку Services и нажмите на ZooKeeper.

  3. Выберите Components и затем Zookeeper Server.

  4. Включите опцию Show Advanced и найдите поле log4j.properties template.

  5. Внесите необходимые изменения в файл по умолчанию.

  6. Подтвердите изменения в конфигурации ZooKeeper, нажав Save.

  7. В раскрывающемся меню Actions выберите Restart, убедитесь, что для параметра Apply configs from ADCM установлено значение true, и нажмите Run.

ПРИМЕЧАНИЕ

Файл log4j.properties содержит значения по умолчанию для параметров логирования. Они могут быть перезаписаны компонентами ZooKeeper при перезапуске. Чтобы этого избежать, можно установить значения параметров через переменные среды в файле zookeeper-env.sh.

Чтобы изменить настройки логирования в файле zookeeper-env.sh через ADCM:

  1. На странице Clusters выберите нужный кластер.

  2. Перейдите на вкладку Services и нажмите на ZooKeeper.

  3. Включите опцию Show Advanced и найдите поле zookeeper-env.sh.

  4. Выберите нужный параметр, например, ZOO_LOG4J_PROP, и внесите изменения.

  5. Подтвердите изменения в конфигурации ZooKeeper, нажав Save.

  6. В раскрывающемся меню Actions выберите Restart, убедитесь, что для параметра Apply configs from ADCM установлено значение true, и нажмите Run.

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней