GNU/Linux >> Znalost Linux >  >> Linux

Protokolování Pythonu - zkontrolovat umístění souborů protokolu?

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

Linux
  1. Protokolovat pouze přenesené soubory pomocí Rsync?

  2. Soubory protokolu Linux

  3. Jak používat Logrotate ke správě souborů protokolu

  1. 20 Soubory protokolu Linux, které jsou umístěny v adresáři /var/log

  2. Jak otočit soubory protokolu Apache v Linuxu

  3. Umístění souborů ini/config v linux/unix?

  1. Jak povolit protokolování dotazů MySQL/MariaDB

  2. Jak spravovat soubory protokolu pomocí Logrotate v Linuxu

  3. Odstraňte soubory protokolu pomocí úlohy cron