Как записать имя исходного файла и номер строки в Python - PullRequest
87 голосов
/ 10 февраля 2009

Можно ли украсить / расширить стандартную систему регистрации Python, чтобы при вызове метода регистрации он также регистрировал файл и номер строки, в которой он был вызван, или, возможно, метод, который его вызвал?

Ответы [ 3 ]

166 голосов
/ 10 февраля 2009

Конечно, отметьте форматеры в документации. В частности, переменные linen и pathname.

% (pathname) 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')
50 голосов
/ 07 июня 2017

Помимо Очень полезный ответ Себа , вот удобный фрагмент кода, который демонстрирует использование логгера в разумном формате:

#!/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
0 голосов
/ 19 сентября 2018

Чтобы использовать вышесказанное так, чтобы отправлять ведение журнала отладки на стандартный выход:

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() операторов. Где это позволяет отключить вывод отладочной информации в одном месте, прежде чем вы отправите его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...