Как записать имя исходного файла и номер строки в Python
можно ли украсить / расширить стандартную систему ведения журнала python, чтобы при вызове метода ведения журнала он также регистрировал файл и номер строки, где он был вызван, или, возможно, метод, который его вызвал?
3 ответа:
, проверьте форматеры в области лесозаготовок документы. В частности, переменные lineno и pathname.
%(путь) s полный путь к исходному файлу, в котором был выполнен вызов регистрации(если имеется).
%(имя файла) s имя файла часть пути.
%(модуль) s модуль (часть имени файла).
%(funcName) s имя функции содержащий запись разговора клиента с оператором.
%(lineno) d номер исходной строки, где был выполнен вызов регистрации (если имеется).
выглядит так:
formatter = logging.Formatter('[%(asctime)s] p%(process)s {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s','%m-%d %H:%M:%S')
на очень полезный ответ Seb, вот удобный фрагмент кода, который демонстрирует использование регистратора с разумным форматом:
#!/usr/bin/env python import logging logging.basicConfig(format='%(asctime)s,%(msecs)d %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s', datefmt='%d-%m-%Y:%H:%M:%S', level=logging.DEBUG) logger = logging.getLogger('stackoverflow_rocks') logger.debug("This is a debug log") logger.info("This is an info log") logger.critical("This is critical") logger.error("An error occurred")
производит этот выход:
06-06-2017:17:07:02,158 DEBUG [log.py:11] This is a debug log 06-06-2017:17:07:02,158 INFO [log.py:12] This is an info log 06-06-2017:17:07:02,158 CRITICAL [log.py:13] This is critical 06-06-2017:17:07:02,158 ERROR [log.py:14] An error occurred
чтобы построить на вышеизложенном способ, который отправляет журнал отладки в стандартный выход:
import logging import sys root = logging.getLogger() root.setLevel(logging.DEBUG) ch = logging.StreamHandler(sys.stdout) ch.setLevel(logging.DEBUG) FORMAT = "[%(filename)s:%(lineno)s - %(funcName)20s() ] %(message)s" formatter = logging.Formatter(FORMAT) ch.setFormatter(formatter) root.addHandler(ch)
тогда, если вы хотите отключить этот комментарий
root.setLevel(logging.DEBUG)
.для отдельных файлов (например, назначения классов) я нашел это гораздо лучший способ сделать это, а не использовать
print()
заявления. Где это позволяет отключить вывод отладки в одном месте, прежде чем отправить его.