Можно ли украсить / расширить стандартную систему ведения журнала Python, чтобы при вызове метода ведения журнала он также регистрировал файл и номер строки, в которой он был вызван, или, возможно, метод, который его вызвал?
123
Конечно, проверьте средства форматирования в документации журнала. В частности, переменные leno и pathname.
% (pathname) s Полный путь к исходному файлу, в котором был выполнен вызов журнала (если доступен).
% (filename) s Часть пути к имени файла.
% (module) s Module (часть имени в имени файла).
% (funcName) s Имя функции, содержащей вызов регистрации.
% (lneno) d Номер исходной строки, в которой был выполнен вызов регистрации (если доступно).
Выглядит примерно так:
formatter = logging.Formatter('[%(asctime)s] p%(process)s {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s','%m-%d %H:%M:%S')
Помимо очень полезного ответа Себа , вот удобный фрагмент кода, который демонстрирует использование регистратора в разумном формате:
Создает этот вывод:
источник
Чтобы развить вышеизложенное таким образом, чтобы журнал отладки отправлялся стандартным образом:
Помещение вышеуказанного в файл с именем
debug_logging_example.py
дает результат:Затем, если вы хотите отключить логирование, комментируйте
root.setLevel(logging.DEBUG)
.Для отдельных файлов (например, назначения классов) я нашел, что это гораздо лучший способ сделать это, чем использование
print()
операторов. Где это позволяет вам отключить вывод отладки в одном месте перед отправкой.источник
Для разработчиков, использующих PyCharm или Eclipse pydev, следующее создаст ссылку на источник оператора журнала в выходных данных журнала консоли:
См. Гиперссылки на исходный файл Pydev в консоли Eclipse для более подробного обсуждения и истории.
источник
В отличие от других ответов, это будет регистрировать полный путь к файлу и имя функции, которая могла вызвать ошибку. Это полезно, если у вас есть проект с более чем одним модулем и несколькими файлами с одинаковыми именами, распределенными в этих модулях.
источник