Optimiziranje beleženja Python za obravnavanje napak
Prijava v Python je bistvena za sledenje dogodkov in diagnosticiranje težav med izvajanjem programa. Vendar pa lahko določeni moduli proizvedejo preveč informacij o sledenju, kar lahko povzroči nered v dnevnikih. V takih primerih nastavitev ustrezne ravni beleženja, kot je npr NAPAKA, lahko pomaga filtrirati nepotrebne podrobnosti.
V scenarijih, kjer en modul ustvari preveč dnevnikov, vendar pride do napak v drugem modulu, ki ga kliče, postane ključnega pomena dostop do zadnjih sporočil dnevnika. To se pogosto zgodi pri iskanju vzroka napake. Potrebno je ravnotežje med ignoriranjem odvečnih dnevnikov in zajemanjem pomembnih.
Knjižnice kot spdlog v C++ imajo vgrajeno podporo za sledenje nazaj prek obročnega medpomnilnika, ki razvijalcem omogoča pregled nedavnih dnevnikov, ki vodijo do napake. Pythonov sečnja knjižnica pa te funkcije ne ponuja takoj, kar postavlja vprašanje, kako implementirati podoben mehanizem.
Ta članek raziskuje, kako lahko Pythonov sistem beleženja prilagodite tako, da zajame nedavna sporočila dnevnika, ko pride do napake, in tako zagotovi kritične informacije iz dama modul je na voljo za diagnozo brez preobremenitve dnevnikov s podatki sledenja.
Ukaz | Primer uporabe |
---|---|
deque(maxlen=capacity) | Čakalna vrsta z dvojnim koncem iz zbirke modul, ki se tukaj uporablja za ustvarjanje obročnega medpomnilnika, ki vsebuje določeno število dnevniških sporočil, pri čemer zavrže najstarejša, ko prispejo nova sporočila. To je ključna struktura za učinkovito vzdrževanje dnevnika nedavnih sporočil. |
emit(self, record) | Metoda, preglasena v obdelovalcih beleženja po meri za obdelavo vsakega sporočila dnevnika, ko je ustvarjeno. Odgovoren je za dodajanje sporočila dnevnika v deque v naši rešitvi medpomnilnika zvonjenja po meri. |
logging.handlers.MemoryHandler | To je urejevalnik beleženja, ki shranjuje sporočila dnevnika v pomnilnik. Odplakne jih, ko je dosežena določena raven dnevnika (v tem primeru NAPAKA). Uporabno je za odložitev izpisa dnevniških sporočil, dokler ne pride do resnejšega dogodka. |
flushLevel=logging.ERROR | Argument prenesen na MemoryHandler da določite raven dnevnika, ki sproži izpiranje sporočil v medpomnilniku do končnega cilja (kot je konzola ali datoteka). Zagotavlja, da vidimo samo dnevnike odpravljanja napak, če pride do napake. |
setTarget(stream_handler) | V MemoryHandler Ta metoda nastavi ciljni upravljalnik, v katerega se bodo spraznili medpomnilniki. V tem primeru je cilj a StreamHandler, ki izpisuje dnevnike na konzolo. |
format(record) | Del sistema oblikovanja modula za beleženje. V obdelovalniku po meri ta metoda oblikuje zapis dnevnika, preden ga doda v medpomnilnik obroča, kar omogoča dosleden in berljiv izhod. |
logger.addHandler(buffer_handler) | Priključi obdelovalnik po meri ali pomnilnika v zapisovalnik, tako da obdeluje sporočila dnevnika glede na konfiguracijo obdelovalnika (npr. medpomnjenje, krožno shranjevanje itd.). Ta ukaz zagotavlja, da se naš medpomnilnik uporablja za beleženje. |
logger.setLevel(logging.DEBUG) | Določa najmanjšo stopnjo resnosti za beleženje sporočil. V primerih je nastavljeno na DEBUG, ki zagotavlja, da so vsa sporočila, vključno z manj resnimi, zajeta in shranjena v medpomnilnik za poznejši pregled. |
Učinkovito zajemanje nedavnih dnevnikov ob napaki v Pythonu
Prvi predstavljeni skript uporablja upravljalnik beleženja po meri z a deque struktura iz Pythona zbirke modul. Ta deque deluje kot medpomnilnik zvonjenja, ki hrani fiksno število nedavnih dnevniških sporočil. Upravljavec preglasi oddajajo metoda, ki se pokliče vsakič, ko se ustvari dnevnik. Pri tej metodi je vsako sporočilo dnevnika oblikovano in nato dodano deque. Ker ima deque največjo dolžino, samodejno zavrže najstarejša sporočila, ko doseže zmogljivost. Ta rešitev učinkovito sledi najnovejšim dnevnikom in zagotavlja, da prekomerna sporočila o odpravljanju napak iz modula za preverjanje ne preobremenijo izpisa dnevnika, ampak so še vedno na voljo, ko pride do napake v modulu izvajalca.
Ko je v modulu runner zaznana napaka, skript pokliče metodo po meri get_logs za pridobitev sporočil dnevnika, shranjenih v deque. To vam omogoča, da pregledate sporočila dnevnika iz preverjevalnika, ki je neposredno pred napako. Ideja za tem pristopom je, da sporočila dnevnika zagotavljajo ključni kontekst za odpravljanje težav, hkrati pa ohranjajo ravnovesje med podrobnostjo dnevnika in uporabnostjo. To je preprost in učinkovit način za ustvarjanje krožnega medpomnilnika dnevnika v Pythonu, podobnega povratna sled funkcijo, ki jo najdete v knjižnici spdlog C++.
Druga rešitev uporablja vgrajeno MemoryHandler iz Pythonovega modula za beleženje. MemoryHandler deluje tako, da medpomni sporočila dnevnika v pomnilniku in jih izprazni le, ko naleti na določeno raven dnevnika, kot je NAPAKA. V tem primeru je upravljalnik konfiguriran tako, da shrani do 10 dnevniških sporočil in jih izprazni, ko pride do napake. Ta pristop je podoben tehniki medpomnilnika obroča, vendar uporablja Pythonovo obstoječo infrastrukturo za beleženje, kar poenostavi izvedbo. MemoryHandler je idealen za scenarije, v katerih želite zajeti posnetek dnevniških sporočil, ki vodijo do napake, ne da bi med običajnim delovanjem zmešali dnevnike.
Obe rešitvi sta optimizirani za zmogljivost in zasnovani tako, da omejita porabo pomnilnika. Z omejevanjem števila dnevnikov, shranjenih v pomnilniku, in izpiranjem medpomnilnika samo med kritičnimi dogodki pomagajo vzdrževati čiste dnevnike, ki jih je mogoče upravljati. To razvijalcem omogoča, da se osredotočijo na odpravljanje napak pri dejanski napaki, namesto da prebirajo ogromne količine nepotrebnih informacij. Vsak skript je mogoče enostavno integrirati v obstoječe konfiguracije beleženja Python, tako da zadevnemu zapisovalniku preprosto dodate obdelovalce po meri ali pomnilnik, oba pa sta dovolj prilagodljiva, da ju je mogoče prilagoditi različnim formatom in nivojem dnevnika.
Zajem nedavnih sporočil beleženja Pythona ob napaki z medpomnilnikom zvonjenja po meri
Modul za beleženje Python – implementacija obročnega medpomnilnika po meri
# Approach 1: Using a custom handler with a deque (ring buffer) to store recent logs
import logging
from collections import deque
# Custom log handler to store recent log messages
class BufferingHandler(logging.Handler):
def __init__(self, capacity):
super().__init__()
self.log_buffer = deque(maxlen=capacity) # Circular buffer
def emit(self, record):
self.log_buffer.append(self.format(record)) # Store formatted log messages
def get_logs(self):
return list(self.log_buffer) # Retrieve recent log messages
# Configure logging with custom handler
logger = logging.getLogger('checker')
buffer_handler = BufferingHandler(capacity=10)
logger.addHandler(buffer_handler)
logger.setLevel(logging.DEBUG)
# Example log generation
for i in range(20):
logger.debug(f"Debug message {i}")
# Simulate an error in runner and print the last few log messages
try:
1 / 0 # Simulate error
except ZeroDivisionError:
print("Error occurred, recent log messages:")
for log in buffer_handler.get_logs():
print(log)
Uporaba MemoryHandlerja za beleženje medpomnilnika v Pythonu
Modul za beleženje Python – pristop MemoryHandler
# Approach 2: Using MemoryHandler to buffer log messages
import logging
# MemoryHandler buffers log records in memory and flushes them when conditions are met
memory_handler = logging.handlers.MemoryHandler(capacity=10, flushLevel=logging.ERROR)
# Configuring logging with a stream handler for output
stream_handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
stream_handler.setFormatter(formatter)
# Attach the memory handler and stream handler to logger
logger = logging.getLogger('checker')
logger.setLevel(logging.DEBUG)
memory_handler.setTarget(stream_handler)
logger.addHandler(memory_handler)
# Generating some debug messages
for i in range(15):
logger.debug(f"Debug message {i}")
# Simulate an error that will trigger the buffer to flush
logger.error("An error occurred in runner")
# The memory handler will now flush its buffer and show the last 10 messages
Raziskovanje alternativnih načinov zajemanja dnevniških sporočil v Pythonu
Drug pristop za zajemanje nedavnih dnevniških sporočil v Pythonu vključuje uporabo knjižnice tretje osebe, kot je loguru. Za razliko od Pythonovega vgrajenega modula za beleženje Loguru ponuja bolj prilagodljiv in uporabniku prijazen vmesnik. Vključuje vgrajeno podporo za rotiranje dnevnikov, filtriranje ravni dnevnikov in zajemanje dnevnikov v različnih formatih. Ta knjižnica je lahko še posebej uporabna pri delu z aplikacijami, ki ustvarjajo preveč dnevnikov, saj poenostavlja upravljanje dnevnikov, hkrati pa zagotavlja, da kritična sporočila med obravnavanjem napak niso spregledana.
Loguru omogoča nastavitev ponorov dnevnikov, ki jih je mogoče prilagoditi za shranjevanje dnevnikov v pomnilnik, datoteke ali celo zunanje storitve. Ustvarite lahko začasni vmesni pomnilnik v pomnilniku z uporabo ponora po meri, ki ga je mogoče nato izprazniti, ko naletite na napako. Zaradi tega je Loguru zmogljiva alternativa za tiste, ki želijo več nadzora nad svojim sistemom beleženja brez ročne konfiguracije upravljavcev, kot je v standardni knjižnici beleženja.
Druga prednost Loguruja je, da omogoča preprosto integracijo z obstoječimi sistemi beleženja, kar pomeni, da lahko preklopite na Loguru, ne da bi prenovili celotno nastavitev beleženja. To je lahko še posebej koristno pri delu s kompleksnimi aplikacijami, kjer sta zmogljivost in upravljanje dnevnikov ključnega pomena. Medtem ko Pythonov modul za beleženje zadostuje za večino primerov uporabe, raziskovanje knjižnic, kot je Loguru, zagotavlja dodatno prilagodljivost in enostavnost uporabe za učinkovito zajemanje in upravljanje dnevniških sporočil.
Pogosta vprašanja o zajemanju dnevniških sporočil v Pythonu
- Kako lahko omejim podrobnost sporočil dnevnika?
- Uporaba logger.setLevel(logging.ERROR) za zavrnitev sporočil nižje resnosti, kot sta debug in info, ki prikazujejo samo napake.
- Kateri je najboljši način za shranjevanje zadnjih dnevnikov v pomnilnik?
- A deque(maxlen=capacity) se lahko uporablja za shranjevanje zadnjih dnevniških sporočil s samodejnim zavračanjem najstarejših vnosov.
- Kako izpraznim medpomnjene dnevnike, ko pride do napake?
- z MemoryHandler, se dnevniki shranijo v pomnilnik in izpraznijo, ko se sproži določena raven dnevnika, kot je npr flushLevel=logging.ERROR.
- Kakšna je prednost uporabe Loguru pred beleženjem Pythona?
- Loguru poenostavlja nastavitev dnevnika z manj šablonske kode in zagotavlja bolj intuitivne funkcije, kot sta lažje filtriranje in rotiranje dnevnikov.
- Ali lahko integriram Loguru z obstoječimi konfiguracijami beleženja?
- Da, Loguru se lahko gladko integrira z Pythonovim vgrajenim sistemom beleženja tako, da zamenja privzeti upravljalnik beleženja.
Povzetek tehnik zajemanja dnevnikov
V situacijah, ki so nagnjene k napakam, uporaba Pythonovega modula za beleženje učinkovito pomaga zajeti nedavna sporočila dnevnika, ne da bi pri tem povzročila nered. Obdelovalci po meri, kot je npr deque in MemoryHandler zagotavlja vsestranske načine za shranjevanje ključnih sporočil, ko pride do napake.
Te rešitve so praktične za odpravljanje napak v modulih z visoko podrobnostjo, kar zagotavlja, da imajo razvijalci na voljo potrebne podatke dnevnika. Z integracijo orodij tretjih oseb, kot je Loguru, je na voljo še večja prilagodljivost, ki ponuja napredno upravljanje dnevnikov z minimalno konfiguracijo.
Viri in reference za rešitve za beleženje Python
- Razlaga Pythona deque implementacija in njena uporaba pri beleženju: Dokumentacija Python – Zbirke
- Podrobnosti o Pythonu sečnja knjižnica in MemoryHandler: Dokumentacija Python - beleženje
- Pregled Loguru kot napredna alternativa za beleženje Python: Dokumentacija Loguru
- Primerjava in uporaba spdlog v C++ za podporo povratnega sledenja: Repozitorij spdlog GitHub