В моем сценарии программы 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
Если вы явным образом обрабатываете свои ошибки, вы должны просто зарегистрировать ошибку в своем обработчике ошибок. Если вы не обрабатываете свои ошибки, защитите свой код с помощью правил проверки, а при обнаружении ошибки проверки запишите ее в журнал. Основная идея заключается в том, что вы должны превратить неожиданные ошибки в ожидаемые. «Сбои программы» были бы исключением.
"тайм-аут" можно ожидать. "наборы данных не совпадают" можно ожидать. «ошибка в строке x» - это то, что никогда не должно попадать в продакшн. Это не ошибка для регистрации. Это дефект в вашем коде. «Сбой программы», скорее всего, должен быть обработан контекстом, в котором выполнялось приложение.
Привет, @ K.AlanBates, спасибо за отзыв. Я не очень хорошо знаком с терминологией (и я все еще любитель Python / Spark) ... что такое необработанные ошибки, ошибки защиты и проверки? Я понимаю вашу точку зрения - лучше быть готовым к разного рода проблемам, чтобы не было ничего неожиданного. Единственный способ, которым я могу думать о том, чтобы быть полностью подготовленным, - это вручную создать все возможные ситуации, которые я могу придумать, которые могут сломать мой код, но всегда будут какие-то неожиданные ошибки, которые будут пропущены.
Эти неожиданные ошибки явно выводятся на консоль. Я хотел бы, чтобы они также автоматически включались в пользовательские файлы журнала, чтобы, например, когда другой пользователь обнаружил ошибку, он мог отправить мне файл журнала, и я мог попытаться выяснить, что пошло не так (например, недавно коллега сказал, что файл не печатается. Другой коллега дважды проверил файл журнала и сообщил, что проблем нет, поэтому код должен быть неправильным, и мы должны его удалить. После повторной проверки выяснилось, что консоль сообщили о проблеме с неравным размером выборки в своих наборах данных.
Я бы хотел, чтобы это было в файле журнала, чтобы отчеты сохранялись.)
"автоматическая" часть вашего желания - это проблемное место. Поскольку вы добровольно заявляете, что являетесь разработчиком-любителем на Python (вы также являетесь разработчиком-любителем в целом?), Вы, вероятно, получите больше удовольствия, если явным образом доставляете сообщения журнала в регистратор, когда сообщение будет идентифицировано. Вы можете поискать в Интернете «Обработка исключений Python» для получения более подробной информации.
Вы явно печатаете на консоли или оставляете их как необработанные ошибки, а консоль представляет вам ошибки?