Jak zarejestrować nazwę pliku źródłowego i numer linii w Pythonie
123
Czy jest możliwe udekorowanie / rozszerzenie standardowego systemu logowania w Pythonie, tak aby przy wywoływaniu metody rejestrowania rejestrował również plik i numer wiersza, w którym został wywołany, a może metodę, która go wywołała?
#!/usr/bin/env pythonimport 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")
Generuje ten wynik:
2017-06-06:17:07:02,158 DEBUG [log.py:11]Thisis a debug log
2017-06-06:17:07:02,158 INFO [log.py:12]Thisis an info log
2017-06-06:17:07:02,158 CRITICAL [log.py:13]Thisis critical
2017-06-06:17:07:02,158 ERROR [log.py:14]An error occurred
Użyj tego, aby uzyskać więcej informacji: formatter = logging.Formatter ('% (asctime) s,% (levelname) -8s [% (filename) s:% (module) s:% (funcName) s:% (lineno) d] % (wiadomość) s ')
Girish Gupta
czy istnieje sposób, aby zmienić tylko w jednym miejscu na górze kodu, niezależnie od tego, czy komunikaty logowania są drukowane, czy nie? Chciałbym mieć dwa tryby, jeden z dużą ilością wydruków, aby zobaczyć, co dokładnie robi program; i jeden, kiedy jest wystarczająco stabilny, gdzie nie jest pokazywany wynik.
Marie. P.
3
@ Marie.P. nie zadawaj różnych pytań w komentarzach. Odpowiedzią jest jednak rejestrowanie poziomów.
bugmenot123
4
Aby zbudować na powyższym w sposób, który wysyła logowanie debugowania do standardowego wyjścia:
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.")
Umieszczenie powyższego w pliku o nazwie debug_logging_example.pydaje wynik:
[debug_logging_example.py:14-<module>()] I am sent to standard out.
Następnie, jeśli chcesz wyłączyć wylogowywanie, komentuj root.setLevel(logging.DEBUG).
W przypadku pojedynczych plików (np. Zadań klasowych) stwierdziłem, że jest to o wiele lepszy sposób robienia tego w przeciwieństwie do używania print()instrukcji. Gdzie pozwala wyłączyć wyjście debugowania w jednym miejscu przed wysłaniem.
# your imports above ...
logging.basicConfig(
format='%(asctime)s,%(msecs)d %(levelname)-8s [%(pathname)s:%(lineno)d in
function %(funcName)s] %(message)s',
datefmt='%Y-%m-%d:%H:%M:%S',
level=logging.DEBUG
)
logger = logging.getLogger(__name__)# your classes and methods below ...# An naive Sample of usage:try:
logger.info('Sample of info log')# your code hereexceptExceptionas e:
logger.error(e)
Inaczej niż w przypadku innych odpowiedzi, spowoduje to zarejestrowanie pełnej ścieżki pliku i nazwy funkcji, w przypadku której mógł wystąpić błąd. Jest to przydatne, jeśli masz projekt z więcej niż jednym modułem i kilkoma plikami o tej samej nazwie rozpowszechnianymi w tych modułach.
Oprócz bardzo przydatnej odpowiedzi Seba , oto przydatny fragment kodu, który demonstruje użycie rejestratora w rozsądnym formacie:
Generuje ten wynik:
źródło
Aby zbudować na powyższym w sposób, który wysyła logowanie debugowania do standardowego wyjścia:
Umieszczenie powyższego w pliku o nazwie
debug_logging_example.py
daje wynik:Następnie, jeśli chcesz wyłączyć wylogowywanie, komentuj
root.setLevel(logging.DEBUG)
.W przypadku pojedynczych plików (np. Zadań klasowych) stwierdziłem, że jest to o wiele lepszy sposób robienia tego w przeciwieństwie do używania
print()
instrukcji. Gdzie pozwala wyłączyć wyjście debugowania w jednym miejscu przed wysłaniem.źródło
W przypadku programistów korzystających z PyCharm lub Eclipse pydev poniższe łącze do źródła instrukcji log w danych wyjściowych dziennika konsoli:
Zobacz hiperłącza do plików źródłowych Pydev w konsoli Eclipse, aby uzyskać dłuższą dyskusję i historię.
źródło
Inaczej niż w przypadku innych odpowiedzi, spowoduje to zarejestrowanie pełnej ścieżki pliku i nazwy funkcji, w przypadku której mógł wystąpić błąd. Jest to przydatne, jeśli masz projekt z więcej niż jednym modułem i kilkoma plikami o tej samej nazwie rozpowszechnianymi w tych modułach.
źródło