Chcete-li najít umístění souboru protokolu, zkuste vytvořit instanci vašeho log
objekt v shellu Pythonu ve vašem prostředí a podíváte se na hodnotu:
log.handlers[0].stream
logging
modul používá obslužné rutiny připojené k loggerům k rozhodování o tom, jak, kde nebo dokonce jestli se zprávy nakonec uloží nebo zobrazí. Můžete nakonfigurovat logging
ve výchozím nastavení také zapisovat do souboru. Měli byste si opravdu přečíst dokumenty, ale pokud zavoláte logging.basicConfig(filename=log_file_name)
kde log_file_name
je název souboru, do kterého chcete zprávy zapisovat (všimněte si, že to musíte udělat před čímkoli jiným v logging
se vůbec zavolá), pak se tam zapíší všechny zprávy přihlášené do všech loggerů (pokud nedojde později k nějaké další rekonfiguraci). Uvědomte si však, na jakou úroveň je záznamník nastaven; pokud paměť slouží, info
je pod výchozí úrovní protokolu, takže byste museli zahrnout level=logging.INFO
v argumentech basicConfig
stejně tak, aby vaše zpráva skončila v souboru.
Pokud jde o druhou část vaší otázky, logging.getLogger(some_string)
vrátí Logger
objekt vložený na správnou pozici v hierarchii z kořenového loggeru, jehož název má hodnotu some_string
. Volá se bez argumentů a vrací root logger. __name__
vrátí název aktuálního modulu, tedy logging.getLogger(__name__)
vrátí Logger
objekt s názvem nastaveným na název aktuálního modulu. Toto je běžný vzor používaný s logging
, protože to způsobuje, že struktura loggeru zrcadlí strukturu modulu vašeho kódu, což často dělá protokolování zpráv mnohem užitečnějšími při ladění.
Některé dobré odpovědi na to, ale nejlepší odpověď pro mě nefungovala, protože jsem používal jiný typ obslužné rutiny souborů a handler.stream neposkytuje cestu, ale popisovač souboru, a dostat z toho cestu je poněkud nesrozumitelné. Zde je moje řešení:
import logging
from logging import FileHandler
# note, this will create a new logger if the name doesn't exist,
# which will have no handlers attached (yet)
logger = logging.getLogger('<name>')
for h in logger.handlers:
# check the handler is a file handler
# (rotating handler etc. inherit from this, so it will still work)
# stream handlers write to stderr, so their filename is not useful to us
if isinstance(h, FileHandler):
# h.stream should be an open file handle, it's name is the path
print(h.stream.name)
Chcete-li získat umístění protokolu jednoduchého zapisovače souborů, zkuste
logging.getLoggerClass().root.handlers[0].baseFilename