Как сохранить / записать сообщение об ошибке Spark в файл журнала в программном скрипте Python?

В моем сценарии программы Python / Spark у меня есть

logger = logging.getLogger(results.app_name)
logger.setLevel(logging.DEBUG)
# Create file handler which logs even debug messages
fh = logging.FileHandler(outputPath+".log")
fh.setLevel(logging.DEBUG)
# Create console handler with a higher log level
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)

sc = spark.sparkContext
sc.setLogLevel("WARN")
log4jLogger = sc._jvm.org.apache.log4j
LOGGER = log4jLogger.LogManager.getLogger(__name__)

для добавления информации регистратора (logger.info()) и ошибок ожидал при определенных обстоятельствах (logger.error()) в консоль и в пользовательский файл журнала (например, outputPath+".log"). Однако, когда я получаю неожиданные ошибки (например, сбой программы, какая-либо ошибка в строке, проблемы с истекшим временем ожидания, наборы данных не совпадают), они печатаются только на консоли.

Как мне также добавить отладочные / неожиданные ошибки в пользовательский файл журнала?

например, я получил сообщение об ошибке, напечатанное на консоли, но мне нравится, чтобы оно также автоматически записывалось в файл журнала сценарием:

Traceback (most recent call last): File "/Users/lc/Documents/sparkprogram.py", line 747, in phenotypes, thresholds, r2All, pAll=regression(prsDict,pheno_file, pheno_delim, pheno_columns, pheno_no_header, covarColumns=covar_columns, outputName=outputPath, logger=logger) File "/Users/lc/Documents/sparkprogram.py", line 298, in regression assert samplesize==phenodata.shape[0], "Unequal sample size in pheno file and genotype data" AssertionError: Unequal sample size in pheno file and genotype data

Вы явно печатаете на консоли или оставляете их как необработанные ошибки, а консоль представляет вам ошибки?

K. Alan Bates 13.09.2018 18:53

Если вы явным образом обрабатываете свои ошибки, вы должны просто зарегистрировать ошибку в своем обработчике ошибок. Если вы не обрабатываете свои ошибки, защитите свой код с помощью правил проверки, а при обнаружении ошибки проверки запишите ее в журнал. Основная идея заключается в том, что вы должны превратить неожиданные ошибки в ожидаемые. «Сбои программы» были бы исключением.

K. Alan Bates 13.09.2018 18:55

"тайм-аут" можно ожидать. "наборы данных не совпадают" можно ожидать. «ошибка в строке x» - это то, что никогда не должно попадать в продакшн. Это не ошибка для регистрации. Это дефект в вашем коде. «Сбой программы», скорее всего, должен быть обработан контекстом, в котором выполнялось приложение.

K. Alan Bates 13.09.2018 18:58

Привет, @ K.AlanBates, спасибо за отзыв. Я не очень хорошо знаком с терминологией (и я все еще любитель Python / Spark) ... что такое необработанные ошибки, ошибки защиты и проверки? Я понимаю вашу точку зрения - лучше быть готовым к разного рода проблемам, чтобы не было ничего неожиданного. Единственный способ, которым я могу думать о том, чтобы быть полностью подготовленным, - это вручную создать все возможные ситуации, которые я могу придумать, которые могут сломать мой код, но всегда будут какие-то неожиданные ошибки, которые будут пропущены.

LC-datascientist 13.09.2018 19:29

Эти неожиданные ошибки явно выводятся на консоль. Я хотел бы, чтобы они также автоматически включались в пользовательские файлы журнала, чтобы, например, когда другой пользователь обнаружил ошибку, он мог отправить мне файл журнала, и я мог попытаться выяснить, что пошло не так (например, недавно коллега сказал, что файл не печатается. Другой коллега дважды проверил файл журнала и сообщил, что проблем нет, поэтому код должен быть неправильным, и мы должны его удалить. После повторной проверки выяснилось, что консоль сообщили о проблеме с неравным размером выборки в своих наборах данных.

LC-datascientist 13.09.2018 19:37

Я бы хотел, чтобы это было в файле журнала, чтобы отчеты сохранялись.)

LC-datascientist 13.09.2018 19:37

"автоматическая" часть вашего желания - это проблемное место. Поскольку вы добровольно заявляете, что являетесь разработчиком-любителем на Python (вы также являетесь разработчиком-любителем в целом?), Вы, вероятно, получите больше удовольствия, если явным образом доставляете сообщения журнала в регистратор, когда сообщение будет идентифицировано. Вы можете поискать в Интернете «Обработка исключений Python» для получения более подробной информации.

K. Alan Bates 14.09.2018 19:25
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
7
877
0

Другие вопросы по теме