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

В процессе работы Zeppelin Server генерирует текстовые лог-файлы, которые могут быть полезными для анализа причин различных ошибок, возникающих при работе с интерпретаторами, заметками и так далее. Под капотом Zeppelin использует фреймворк Log4j для ведения логов. Для конфигурации процессов логирования в Zeppelin используйте настройки Custom log4j.properties в ADCM. Более подробная информация об этих настройках доступна в разделе Настройка логирования с помощью ADCM.

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

По умолчанию лог-файлы расположены в директории /var/log/zeppelin на хосте, где установлен компонент Zeppelin Server. Чтобы увидеть логи, выполните следующее:

  1. Присоединитесь к хосту с Zeppelin Server (по SSH либо другим способом) и выполните команду:

    $ ls -la /var/log/zeppelin

    Результат выглядит следующим образом:

    total 1768
    drwxr-xr-x.  2 zeppelin zeppelin   4096 Dec  8 10:22 .
    drwxr-xr-x. 19 root     root       4096 Dec  8 06:10 ..
    -rw-r--r--.  1 root     root        555 Dec  7 06:54 install-interpreter.log
    -rw-r--r--.  1 root     root       1665 Dec  6 16:13 install-interpreter.log.2021-12-06
    -rw-r--r--.  1 zeppelin zeppelin   2656 Dec  8 10:30 zeppelin-interpreter-jdbc-zeppelin-bds-adh-2.ru-central1.internal.log
    -rw-r--r--.  1 zeppelin zeppelin   5918 Dec  6 12:24 zeppelin-interpreter-jdbc-zeppelin-bds-adh-2.ru-central1.internal.log.2021-12-06
    -rw-r--r--.  1 zeppelin zeppelin  82200 Dec  7 18:15 zeppelin-interpreter-jdbc-zeppelin-bds-adh-2.ru-central1.internal.log.2021-12-07
    -rw-r--r--.  1 zeppelin zeppelin   2376 Dec  7 17:27 zeppelin-interpreter-phoenix2-zeppelin-bds-adh-2.ru-central1.internal.log
    -rw-r--r--.  1 zeppelin zeppelin   4638 Dec  8 10:31 zeppelin-interpreter-phoenix-zeppelin-bds-adh-2.ru-central1.internal.log
    -rw-r--r--.  1 zeppelin zeppelin 112258 Dec  6 16:11 zeppelin-interpreter-phoenix-zeppelin-bds-adh-2.ru-central1.internal.log.2021-12-06
    -rw-r--r--.  1 zeppelin zeppelin  17404 Dec  7 17:27 zeppelin-interpreter-phoenix-zeppelin-bds-adh-2.ru-central1.internal.log.2021-12-07
    -rw-r--r--.  1 zeppelin zeppelin   3951 Dec  7 18:15 zeppelin-interpreter-python-zeppelin-bds-adh-2.ru-central1.internal.log
    -rw-r--r--.  1 zeppelin zeppelin   4134 Dec  6 16:01 zeppelin-interpreter-sh-zeppelin-bds-adh-2.ru-central1.internal.log
    -rw-r--r--.  1 zeppelin zeppelin  61835 Dec  8 12:09 zeppelin-zeppelin-bds-adh-2.ru-central1.internal.log
    -rw-r--r--.  1 zeppelin zeppelin 722037 Dec  6 16:30 zeppelin-zeppelin-bds-adh-2.ru-central1.internal.log.2021-12-06
    -rw-r--r--.  1 zeppelin zeppelin 662981 Dec  7 18:15 zeppelin-zeppelin-bds-adh-2.ru-central1.internal.log.2021-12-07
    -rw-r--r--.  1 zeppelin zeppelin  78400 Dec  8 06:11 zeppelin-zeppelin-bds-adh-2.ru-central1.internal.out
    ПРИМЕЧАНИЕ
    Логи хранятся в локальной файловой системе, а не в HDFS.
  2. Чтобы увидеть содержимое конкретного лог-файла, выполните следующее:

    $ tail /var/log/zeppelin/<log_file_name>.log

    Вывод имеет следующий вид:

     INFO [2021-12-08 10:31:02,382] ({pool-2-thread-4} RemoteInterpreterManagedProcess.java[start]:115) - Thrift server for callback will start. Port: 38183
     INFO [2021-12-08 10:31:02,882] ({pool-2-thread-4} RemoteInterpreterManagedProcess.java[start]:190) - Run interpreter process [/usr/lib/zeppelin/bin/interpreter.sh, -d, /usr/lib/zeppelin/interpreter/jdbc, -c, 10.92.6.9, -p, 38183, -r, :, -l, /usr/lib/zeppelin/local-repo/phoenix, -g, phoenix]
     INFO [2021-12-08 10:31:04,138] ({pool-11-thread-1} RemoteInterpreterManagedProcess.java[callback]:123) - RemoteInterpreterServer Registered: CallbackInfo(host:10.92.6.9, port:34481)
     INFO [2021-12-08 10:31:04,140] ({pool-2-thread-4} RemoteInterpreter.java[call]:168) - Create RemoteInterpreter org.apache.zeppelin.jdbc.JDBCInterpreter
     INFO [2021-12-08 10:31:04,239] ({pool-2-thread-4} RemoteInterpreter.java[call]:142) - Open RemoteInterpreter org.apache.zeppelin.jdbc.JDBCInterpreter
     INFO [2021-12-08 10:31:04,240] ({pool-2-thread-4} RemoteInterpreter.java[pushAngularObjectRegistryToRemote]:436) - Push local angular object registry from ZeppelinServer to remote interpreter group phoenix:shared_process
     INFO [2021-12-08 10:31:04,830] ({pool-2-thread-4} NotebookServer.java[afterStatusChange]:2314) - Job 20211207-082338_940138511 is finished successfully, status: FINISHED
     INFO [2021-12-08 10:31:04,836] ({pool-2-thread-4} VFSNotebookRepo.java[save]:196) - Saving note:2GS5T8MS7
     INFO [2021-12-08 10:31:04,838] ({pool-2-thread-4} SchedulerFactory.java[jobFinished]:120) - Job 20211207-082338_940138511 finished by scheduler org.apache.zeppelin.interpreter.remote.RemoteInterpreter-phoenix:shared_process-shared_session
     INFO [2021-12-08 12:09:00,355] ({qtp837764579-66} NotebookServer.java[onClose]:372) - Closed connection to 10.92.2.6 : 54643. (1001) null

Типы логов Zeppelin

Существует несколько типов лог-файлов, генерируемых Zeppelin. Их описания приведены ниже.

Имя лог-файла Атрибуты Описание

zeppelin-zeppelin-<host_name>.log

<host_name> — имя хоста Zeppelin

Содержит информацию о базовых операциях с соединением, задачами, заметками, такими как открытие, закрытие, сохранение и другие

zeppelin-zeppelin-<host_name>.out

<host_name> — имя хоста Zeppelin

Содержит вывод выполненных операций, например ошибки, возвращаемые в веб-интерфейсе

zeppelin-interpreter-<interpreter_name>-zeppelin-<host_name>.log

  • <host_name> — имя хоста Zeppelin.

  • <interpreter_name> — имя интерпретатора.

Содержит информацию об указанном интерпретаторе

install-interpreter.log

 — 

Содержит данные об установке новых интерпретаторов

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

С использованием Log4j настройка процессов логирования в Zeppelin сводится к модификации конфигурационных параметров в файле log4j.properties. Этот файл находится в директории /etc/zeppelin/conf на хосте, где установлен компонент Zeppelin Server, и Zeppelin считывает его при старте. Однако, чтобы не редактировать данный файл вручную на каждом хосте, ADCM предоставляет удобные настройки для изменения конфигураций Log4j на всех хостах кластера ADH. Для этого:

  1. В ADCM перейдите на страницу Clusters → <your_cluster_name> → Services → Zeppelin → Primary Configuration и включите опцию Show advanced.

  2. Выберите Custom log4j.properties для редактирования конфигурации Log4j. Конфигурация Log4j, указанная через ADCM UI, перезапишет содержимое файла /etc/zeppelin/conf/log4j.properties при рестарте сервиса Zeppelin. Подробная информация о конфигурационных свойствах Log4j доступна в документации Log4j.

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

  4. Перезапустите сервис Zeppelin.

Стандартная конфигурация log4j.properties

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

#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
log4j.rootLogger = INFO, dailyfile (1)

log4j.appender.stdout = org.apache.log4j.ConsoleAppender (2)
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%d] ({%t} %F[%M]:%L) - %m%n (5)

log4j.appender.dailyfile.DatePattern=.yyyy-MM-dd
log4j.appender.dailyfile.Threshold = INFO
log4j.appender.dailyfile = org.apache.log4j.DailyRollingFileAppender (3)
log4j.appender.dailyfile.File = ${zeppelin.log.file} (4)
log4j.appender.dailyfile.layout = org.apache.log4j.PatternLayout
log4j.appender.dailyfile.layout.ConversionPattern=%5p [%d] ({%t} %F[%M]:%L) - %m%n (5)
1 Установка базового уровня логирования. События с меньшим уровнем не попадают в лог. Например, при использовании DEBUG генерируются более детальные и объемные логи, а при уровне ERROR Zeppelin будет записывать в лог только ошибки и более критичные события.
2 Использование ConsoleAppender, который выводит события логов в STDOUT.
3 Использование DailyRollingFileAppender, который записывает события в файл, ротируемый ежедневно.
4 Путь к лог-файлу. По умолчанию переменная ${zeppelin.log.file} указывает на директорию /var/log/zeppelin.
5 Шаблон для преобразования объекта события в строку. Шаблон по умолчанию имеет следующую структуру:
[Уровень] [Дата] ([Поток] [Имя файла][Метод][Строка]) [Сообщение]

Настройка логирования через REST API

Сервис Zeppelin предоставляет REST API, с помощью которого вы можете взаимодействовать с Zeppelin, включая настройку логирования. Запрос к REST-эндпойнту для изменения уровня логирования выглядит следующим образом:

PUT http://<zeppelin-host>:<zeppelin-port>/api/log/level/<LOG_LEVEL>

Где:

  • <zeppelin-host> — адрес хоста, на котором установлен компонент Zeppelin Server.

  • <zeppelin-port> — номер порта, который используется для Zeppelin REST API. Номер порта можно изменить с помощью свойства zeppelin.server.port в ADCM. Порт по умолчанию: 8180.

  • <LOG_LEVEL> — желаемый уровень логирования. Допустимые уровни: ALL, TRACE, DEBUG, INFO, WARN, ERROR, FATAL и OFF.

Пример:

$ curl -X PUT http://localhost:8180/api/log/level/WARN

Ответ от сервера:

{"status":"OK"}

Типовые задачи

Ниже описаны типовые кейсы, которые могут возникнуть при настройке логирования Zeppelin с помощью Log4j.

Изменение стандартного уровня логирования

 
Чтобы изменить корневой уровень логирования (по умолчанию INFO), используйте свойство log4j.rootLogger=<LEVEL>,<APPENDER>. Вы можете указать корневой уровень, который будет наследоваться другими логерами Log4j, либо установить необходимый уровень для конкретного логера, например log4j.logger.org.apache.zeppelin.interpreter=<OTHER_LEVEL>.

Изменение местоположения логов по умолчанию

 
По умолчанию логи Zeppelin хранятся в директории /var/log/zeppelin. Чтобы изменить стандартную директорию, используйте свойство log4j.appender.<appender-name>.File, где <appender-name> — это имя аппендера Log4j, привязанного к корневому логеру.

Добавление кастомного логера

 
В следующем примере используется кастомный логер (Logger), который записывает логи в отдельную директорию. Также пример показывает генерацию лог-событий в коде интерпретатора.

  1. Добавьте следующие конфигурационные свойства в раздел Custom log4j.properties в ADCM. Основные свойства выделены комментариями.

    # ...
    # New logger definition:
    log4j.logger.MyCustomLogger=DEBUG, mycustomappender (1)
    log4j.appender.mycustomappender=org.apache.log4j.RollingFileAppender (2)
    log4j.appender.mycustomappender.File = /var/log/zeppelin/customlogger/test.log (3)
    log4j.appender.mycustomappender.rollingPolicy.FileNamePattern=/var/log/zeppelin/customlogger/test.%i.log (4)
    log4j.appender.mycustomappender.layout=org.apache.log4j.PatternLayout
    log4j.appender.mycustomappender.layout.conversionPattern=[%p] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{10} - %m %n
    log4j.appender.mycustomappender.MaxFileSize=10MB (5)
    log4j.appender.mycustomappender.MaxBackupIndex=10 (6)
    {% endraw %}
    1 Объявление нового логера и аппендера.
    2 Использование RollingFileAppender, который ротирует файлы логов при достижении определенного размера.
    3 Путь к лог-файлу, генерируемому пользовательским логером.
    4 Шаблон, используемый для именования лог-файлов при выполнении переноса (rollover).
    5 Максимальный размер лог-файла для выполнения переноса.
    6 Максимальное количество лог-файлов, хранимых в директории.
  2. Сохраните конфигурацию и перезапустите сервис Zeppelin.

  3. Запустите тестовую заметку Spark, чтобы сгенерировать записи логов. Для этого создайте новую заметку Spark с использованием Zeppelin UI и выполните в ней следующий код:

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    val logger: Logger = LoggerFactory.getLogger("MyCustomLogger");
    logger.info("Test info message");
  4. Проверьте логи, сгенерированные кастомным логером. Для этого подключитесь к хосту с компонентом Zeppelin Server и выполните команду:

    $ ls -l /var/log/zeppelin/customlogger

    Вывод:

    -rw-r--r-- 1 zeppelin zeppelin 114 Nov 25 13:14 test.log

    Файл test.log содержит единственную запись, сгенерированную заметкой Spark:

    [INFO] 2024-11-22 13:14:28.569 [FIFOScheduler-interpreter_453440904-Worker-1] MyCustomLogger - Test info message
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней