Как записывать сообщения в журнал вывода на AWS Glue?

Выходные данные и ошибки заданий AWS Glue записываются в два разных журнала CloudWatch, /aws-glue/jobs/error и /aws-glue/jobs/output по умолчанию. Когда я включаю операторы print() в свои сценарии для отладки, они записываются в журнал ошибок (/aws-glue/jobs/error).

Я пробовал использовать:

log4jLogger = sparkContext._jvm.org.apache.log4j 
log = log4jLogger.LogManager.getLogger(__name__) 
log.warn("Hello World!")

но "Привет, мир!" не отображается ни в одном из журналов выполненного мной тестового задания.

Кто-нибудь знает, как записывать операторы журнала отладки в выходной журнал (/aws-glue/jobs/output)?

TIA!

РЕДАКТИРОВАТЬ:

Оказывается, вышесказанное действительно работает. Произошло то, что я выполнял задание в окне редактора сценариев AWS Glue Script, которое фиксирует комбинации клавиш Command-F и выполняет поиск только в текущем сценарии. Поэтому, когда я попытался найти на странице вывод журнала, мне показалось, что он не был зарегистрирован.

ПРИМЕЧАНИЕ. Во время тестирования предложения первого респондента я обнаружил, что скрипты AWS Glue, похоже, не выводят никаких сообщений журнала с уровнем ниже WARN!


person Jesse Clark    schedule 21.02.2018    source источник
comment
Вам нужно импортировать что-нибудь, чтобы использовать log4jLogger? Каким-то образом добавив эти три строки в мой скрипт, моя работа зависла там. Статус показывает running, но журнал не создается   -  person cozyss    schedule 24.07.2018
comment
У меня это не работает в Glue Job. Я вывожу журналы уровня WARN и не вижу мин. Cloud Watch. Есть ли что-нибудь еще, что вам нужно, чтобы это работало? Спасибо   -  person padr    schedule 06.09.2018
comment
@padr У меня была такая же проблема. При просмотре журналов необходимо искать текст журнала в поле поиска событие фильтра. зарегистрируйте какой-нибудь бессмысленный текст, который не появится ни в каких других записях журнала, чтобы проверить это.   -  person Arran Duff    schedule 01.08.2019


Ответы (6)


Попробуйте использовать встроенный логгер python из модуля logging, по умолчанию он записывает сообщения в стандартный поток вывода.

import logging

MSG_FORMAT = '%(asctime)s %(levelname)s %(name)s: %(message)s'
DATETIME_FORMAT = '%Y-%m-%d %H:%M:%S'
logging.basicConfig(format=MSG_FORMAT, datefmt=DATETIME_FORMAT)
logger = logging.getLogger(<logger-name-here>)

logger.setLevel(logging.INFO)

...

logger.info("Test log message")
person Alexey Bakulin    schedule 22.02.2018
comment
Оказывается, то, как я изначально пытался вести журнал, тоже работает. Я также обнаружил, что сценарии pyspark AWS Glue не выводят ничего ниже уровня WARN (см. Правки выше). Я приму твой ответ, так как он тоже работает. Спасибо! - person Jesse Clark; 26.02.2018
comment
Какое ‹logger-name-here› я пишу, чтобы облачные часы видели мой журнал? - person Marcel Bezerra; 21.02.2019
comment
Любая значимая строка, которую вы хотите, например. Имя приложения. Это значение будет использоваться вместо %(name)s в сообщении журнала. - person Alexey Bakulin; 22.02.2019
comment
Можно ли в s3 писать только кастомные сообщения? - person anidev711; 05.05.2020
comment
Привет, у меня есть небольшой вопрос, logging.basicConfig (filename = 's3: // ‹bucketname› /spark.logs',level=logging.INFO) Могу ли я сохранить журнал в ведре s3 Я устал от конфигурации выше, это не сработало @ АлексейБакулин - person JP Jack; 02.07.2020
comment
Что, если я хочу распечатать промежуточное значение данных, такое как входные данные, чтобы я мог отлаживать? Я использовал logger.info(input_data) похоже не работает .. - person Cecilia; 15.04.2021

Я знаю, что статья не нова, но, возможно, она может быть кому-то полезна: для меня вход в glue работает со следующими строками кода:

# create glue context
glueContext = GlueContext(sc)
# set custom logging on
logger = glueContext.get_logger()
...
#write into the log file with:
logger.info("s3_key:" + your_value)
person Lars    schedule 09.07.2019
comment
что здесь означает этот ключ s3? @Lars, можно ли в s3 записывать сообщения об ошибках в файл? - person anidev711; 05.05.2020
comment
Официальная документация по теме docs.aws.amazon .com / glue / latest / dg / - person selle; 14.05.2020
comment
Несколько замечаний: 1. Glue logger не принимает строки формата msg, вместо этого он ожидает полные строки (так что вы должны обрабатывать аргументы). 2. Похоже, что Glue logger не может транслироваться рабочим, поэтому, если вы пытаетесь войти из UDF, вам нужно будет использовать Python logger. - person aiguofer; 01.06.2020
comment
Что, если я хочу распечатать промежуточное значение данных, такое как входные данные, чтобы я мог отлаживать? Я использовал logger.info(input_data) похоже не работает .. - person Cecilia; 15.04.2021

Я заметил, что приведенные выше ответы написаны на Python. Для Scala вы можете сделать следующее

import com.amazonaws.services.glue.log.GlueLogger

object GlueApp {
  def main(sysArgs: Array[String]) {
    val logger = new GlueLogger
    logger.info("info message")
    logger.warn("warn message")
    logger.error("error message")
  }
}

Вы можете найти решение как для Python, так и для Scala в официальном документе здесь

person RobotCharlie    schedule 26.04.2020

Я столкнулся с той же проблемой. Я решил это, добавив logging.getLogger().addHandler(logging.StreamHandler(sys.stdout))

Раньше вообще не было отпечатков, даже уровня ОШИБКИ

Идея взята отсюда https://medium.com/tieto-developers/how-to-do-application-logging-in-aws-745114ac6eb7

Другой вариант - войти в стандартный вывод и привязать ведение журнала AWS к стандартному выводу (использование стандартного вывода на самом деле является одним из лучших методов ведения журнала в облаке).

Обновление: работает только для setLevel (ПРЕДУПРЕЖДЕНИЕ) и при выводе ERROR или WARING. Не нашел как управлять для уровня ИНФОРМАЦИИ :(

person feechka    schedule 04.03.2020
comment
Вы проверяли журнал ошибок? Вот где заканчиваются мои события журнала stderr - person selle; 14.05.2020
comment
... то же самое для моих событий журнала stdout с использованием logging.basicConfig - person selle; 14.05.2020
comment
моих отпечатков нет в stderr - person feechka; 18.08.2020

На всякий случай это поможет. Это работает для изменения уровня журнала.

sc = SparkContext()
sc.setLogLevel('DEBUG')
glueContext = GlueContext(sc)
logger = glueContext.get_logger()
logger.info('Hello Glue')
person Simon77    schedule 22.01.2021

Это работало для уровня INFO в задании Glue Python:

import sys

root = logging.getLogger()
root.setLevel(logging.DEBUG)

handler = logging.StreamHandler(sys.stdout)
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
root.addHandler(handler)
root.info("check")

исходный код

person Masi N.    schedule 29.04.2021