Можно ли украсить/расширить стандартную систему ведения журнала python, чтобы при вызове метода ведения журнала он также регистрировал файл и номер строки, в которой он был вызван, или, возможно, метод, который его вызывал?
Как зарегистрировать имя исходного файла и номер строки в Python
Ответ 1
Конечно, проверьте форматеры в журнале документов. В частности, переменные белья и пути.
% (путь) s Полный путь к исходному файлу, из которого был сделан вызов журнала (если доступен).
% (имя файла) s Часть имени файла пути.
% (module) 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')
Ответ 2
В дополнение к очень полезному ответу Seb, вот удобный фрагмент кода, который демонстрирует использование логгера в разумном формате:
#!/usr/bin/env python
import logging
logging.basicConfig(format='%(asctime)s,%(msecs)d %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s',
datefmt='%Y-%m-%d:%H:%M:%S',
level=logging.DEBUG)
logger = logging.getLogger(__name__)
logger.debug("This is a debug log")
logger.info("This is an info log")
logger.critical("This is critical")
logger.error("An error occurred")
Создает этот вывод:
2017-06-06:17:07:02,158 DEBUG [log.py:11] This is a debug log
2017-06-06:17:07:02,158 INFO [log.py:12] This is an info log
2017-06-06:17:07:02,158 CRITICAL [log.py:13] This is critical
2017-06-06:17:07:02,158 ERROR [log.py:14] An error occurred
Ответ 3
Чтобы опираться на вышесказанное таким образом, чтобы отправлять ведение журнала отладки на стандартный выход:
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)
logging.debug("I am sent to standard out.")
Помещение вышеупомянутого в файл с именем debug_logging_example.py
производит вывод:
[debug_logging_example.py:14 - <module>() ] I am sent to standard out.
Затем, если вы хотите отключить ведение журнала, закомментируйте root.setLevel(logging.DEBUG)
.
Для отдельных файлов (например, присвоений классов) я нашел этот способ гораздо лучше, чем использование операторов print()
. Где это позволяет отключить вывод отладочной информации в одном месте, прежде чем вы отправите его.