Как записать имя исходного файла и номер строки в Python


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

3 69

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