Pythoni logimise optimeerimine vigade käsitlemiseks
Pythoni sisselogimine on programmi täitmise ajal sündmuste jälgimiseks ja probleemide diagnoosimiseks hädavajalik. Teatud moodulid võivad aga tekitada liigset jälgimisteavet, mis võib logisid segamini ajada. Sellistel juhtudel sobiva logimistaseme määramine, nt VIGA, aitab välja filtreerida mittevajalikud üksikasjad.
Stsenaariumide korral, kus üks moodul genereerib liigseid logisid, kuid teises seda kutsuvas moodulis ilmnevad vead, muutub hiljutistele logiteadetele juurdepääsemine ülioluliseks. See juhtub sageli vea algpõhjuse leidmisel. Vaja on tasakaalu liigsete logide ignoreerimise ja oluliste jäädvustamise vahel.
Raamatukogudele meeldib spdlog C++-s on sisseehitatud tugi tagasiliikumiseks ringpuhvri kaudu, mis võimaldab arendajatel vaadata üle hiljutisi logisid, mis viivad veani. Pythoni oma metsaraie raamatukogu aga seda funktsiooni karbist välja ei paku, mis tõstatab küsimuse, kuidas sarnast mehhanismi rakendada.
Selles artiklis uuritakse, kuidas kohandada Pythoni logimissüsteemi tõrke korral viimaste logiteadete jäädvustamiseks, tagades kriitilise teabe kabe moodul on diagnoosimiseks saadaval ilma logisid jälgimisandmetega üle koormamata.
Käsk | Kasutusnäide |
---|---|
deque(maxlen=capacity) | Kahe otsaga järjekord aadressilt kollektsioonid moodul, mida kasutatakse siin helipuhvri loomiseks, mis sisaldab kindlat arvu logisõnumeid, jättes uute sõnumite saabudes vanimad kõrvale. See on ülioluline struktuur hiljutiste sõnumite logi tõhusaks pidamiseks. |
emit(self, record) | Meetod, mis on kohandatud logitöötlejates alistatud, et töödelda iga logiteadet selle loomisel. Ta vastutab logiteate lisamise eest deque meie kohandatud ringpuhvri lahenduses. |
logging.handlers.MemoryHandler | See on logitöötleja, mis puhverdab logiteateid mällu. See loputab need, kui on saavutatud teatud logi tase (antud juhul VIGA). See on kasulik logiteadete väljastamise edasilükkamiseks kuni tõsisema sündmuse toimumiseni. |
flushLevel=logging.ERROR | Vaidlus läks edasi Mäluhaldur et määrata logitase, mis käivitab puhverdatud sõnumite loputamise lõppsihtkohta (nt konsooli või faili). See tagab, et näeme silumisloge ainult tõrke korral. |
setTarget(stream_handler) | Aastal Mäluhaldur See meetod määrab sihtkäitleja, kuhu puhverdatud logid loputatakse. Sel juhul on sihtmärk a StreamHandler, mis väljastab logid konsooli. |
format(record) | Osa logimismooduli vormindussüsteemist. Kohandatud töötlejas vormindab see meetod logikirje enne selle lisamist helinapuhvrisse, võimaldades ühtlast ja loetavat väljundit. |
logger.addHandler(buffer_handler) | Kinnitab kohandatud või mälutöötleja logija külge, nii et see töötleb logiteateid vastavalt töötleja konfiguratsioonile (nt puhverdamine, ringmälu jne). See käsk tagab, et meie puhvrit kasutatakse logimiseks. |
logger.setLevel(logging.DEBUG) | Määrab sõnumite logimise minimaalse raskusastme. Näidetes on see seatud SILUtagades, et kõik sõnumid, sealhulgas vähem tõsised teated, jäädvustatakse ja puhverdatakse hilisemaks kontrollimiseks. |
Hiljutiste logide tõhus jäädvustamine Pythoni tõrke korral
Esimene esitatud skript kasutab kohandatud logitöötlejat koos a deque Pythoni struktuur kollektsioonid moodul. See deque toimib helipuhvrina, mis sisaldab fikseeritud arvu hiljutisi logiteateid. Käsitleja alistab kiirgama meetod, mida kutsutakse välja iga kord, kui logi luuakse. Selle meetodi puhul vormindatakse iga logiteade ja lisatakse seejärel deque'i. Kuna deque'il on maksimaalne pikkus, hülgab see automaatselt vanimad sõnumid, kui see mahutab. See lahendus jälgib tõhusalt uusimaid logisid, tagades, et kontrollimooduli liigsed silumissõnumid ei koorma logiväljundit, vaid on siiski saadaval, kui käitajamoodulis ilmneb tõrge.
Kui jooksjamoodulis tuvastatakse viga, kutsub skript välja kohandatud meetodi hanki_logid deque'i salvestatud logiteadete toomiseks. See võimaldab teil kontrollida kontrollija logiteateid, mis eelnesid vahetult veale. Selle lähenemisviisi idee seisneb selles, et logiteated pakuvad tõrkeotsingu jaoks üliolulist konteksti, säilitades samal ajal tasakaalu logi paljusõnalisuse ja kasulikkuse vahel. See on lihtne ja tõhus viis Pythonis ringikujulise logipuhvri loomiseks, mis on sarnane tagajälg funktsioon, mis on leitud C++ spdlogi teegist.
Teine lahendus kasutab sisseehitatud Mäluhaldur Pythoni logimismoodulist. MemoryHandler töötab logiteateid mällu puhverdades ja neid ainult siis, kui ilmneb konkreetne logitase, näiteks VIGA. Sel juhul on töötleja konfigureeritud puhverdama kuni 10 logiteadet ja tühjendama need vea ilmnemisel. See lähenemine sarnaneb ringpuhvri tehnikaga, kuid kasutab Pythoni olemasolevat logimise infrastruktuuri, mis lihtsustab rakendamist. MemoryHandler on ideaalne stsenaariumide jaoks, kus soovite jäädvustada hetktõmmise logiteadetest, mis viivad tõrkeni, ilma logisid tavatoimingute ajal segamata.
Mõlemad lahendused on optimeeritud jõudluse jaoks ja mõeldud mälutarbimise piiramiseks. Piirates mällu salvestatavate logide arvu ja loputades puhvrit ainult kriitiliste sündmuste ajal, aitavad need säilitada puhtaid ja hallatavaid logisid. See võimaldab arendajatel keskenduda tegeliku vea silumisele, selle asemel, et läbi sõeluda tohutul hulgal tarbetut teavet. Iga skripti saab hõlpsasti integreerida olemasolevatesse Pythoni logimise konfiguratsioonidesse, lisades kõnealusesse logijasse lihtsalt kohandatud või mälukäitlejad, ja mõlemad on piisavalt paindlikud, et neid kohandada erinevate logivormingute ja tasemetega.
Hiljutiste Pythoni logimissõnumite jäädvustamine tõrke korral kohandatud helinapuhvriga
Pythoni logimismoodul – kohandatud helinapuhvri rakendamine
# 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)
MemoryHandleri kasutamine Pythonis puhverdatud logimiseks
Pythoni logimismoodul – MemoryHandleri lähenemine
# 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
Alternatiivsete viiside uurimine logisõnumite jäädvustamiseks Pythonis
Teine võimalus Pythonis viimaste logisõnumite jäädvustamiseks hõlmab kolmanda osapoole teegi kasutamist, näiteks loguru. Erinevalt Pythoni sisseehitatud logimismoodulist pakub Loguru paindlikumat ja kasutajasõbralikumat liidest. See sisaldab sisseehitatud tuge logide pööramiseks, logitasemete filtreerimiseks ja logide hõivamiseks erinevates vormingutes. See teek võib olla eriti kasulik, kui töötate rakendustega, mis genereerivad liigseid logisid, kuna see lihtsustab logide haldamist, tagades samal ajal, et kriitilised teated ei jää vigade käsitlemise ajal märkamata.
Loguru võimaldab seadistada logivalud, mida saab kohandada logide mällu, failidesse või isegi välistesse teenustesse salvestamiseks. Saate luua kohandatud valamu abil ajutise mälus oleva puhvri, mille saab seejärel tõrke ilmnemisel tühjendada. See muudab Loguru võimsaks alternatiiviks neile, kes soovivad rohkem kontrollida oma logisüsteemi, ilma töötlejaid käsitsi konfigureerimata nagu tavalises logiteegis.
Loguru teine eelis on see, et see võimaldab hõlpsat integreerimist olemasolevate logimissüsteemidega, mis tähendab, et saate Logurule lülituda ilma kogu logiseadistust uuendamata. See võib olla eriti kasulik keeruliste rakenduste puhul, kus jõudlus ja logihaldus on üliolulised. Lõppkokkuvõttes, kuigi Pythoni logimoodul on enamiku kasutusjuhtude jaoks piisav, pakub selliste teekide nagu Loguru uurimine täiendavat paindlikkust ja kasutuslihtsust logiteadete tõhusaks hõivamiseks ja haldamiseks.
Levinud küsimused Pythonis logisõnumite hõivamise kohta
- Kuidas ma saan piirata logisõnumi paljusõnalisust?
- Kasutage logger.setLevel(logging.ERROR) madalama raskusastmega sõnumite (nt silumine ja teave) mahasurumiseks, kuvades ainult vead.
- Milline on parim viis viimaste logide mällu salvestamiseks?
- A deque(maxlen=capacity) saab kasutada viimaste logiteadete salvestamiseks, kusjuures vanimad kirjed tühistatakse automaatselt.
- Kuidas tõrke ilmnemisel puhverdatud logisid tühjendada?
- Koos MemoryHandler, logid salvestatakse mällu ja kustutatakse teatud logitaseme käivitamisel, nt flushLevel=logging.ERROR.
- Mis on Loguru kasutamise eelis Pythoni logimise ees?
- Loguru lihtsustab logi seadistamist vähema standardkoodiga ja pakub intuitiivsemaid funktsioone, nagu logide lihtsam filtreerimine ja pööramine.
- Kas ma saan Loguru integreerida olemasolevate logiseadistustega?
- Jah, Loguru saab sujuvalt integreeruda Pythoni sisseehitatud logisüsteemiga, asendades vaikelogimise töötleja.
Palkide püüdmise tehnikate kokkuvõte
Veaohtlikes olukordades aitab Pythoni logimooduli kasutamine tõhusalt jäädvustada hiljutisi logiteateid ilma väljundit segamata. Kohandatud töötlejad nagu deque ja Mäluhaldur pakuvad mitmekülgseid viise oluliste sõnumite salvestamiseks tõrke ilmnemisel.
Need lahendused on praktilised suure sõnasõnalisusega moodulite vigade silumiseks, tagades, et arendajatel on saadaval vajalikud logiandmed. Integreerides kolmandate osapoolte tööriistu nagu Loguru, on saadaval veelgi suurem paindlikkus, pakkudes täiustatud logihaldust minimaalse konfiguratsiooniga.
Pythoni logimislahenduste allikad ja viited
- Pythoni seletus deque juurutamine ja selle kasutamine logimisel: Pythoni dokumentatsioon – kogud
- Üksikasjad Pythoni kohta metsaraie raamatukogu ja MemoryHandler: Pythoni dokumentatsioon – logimine
- Ülevaade Loguru täiustatud Pythoni logimise alternatiivina: Loguru dokumentatsioon
- Võrdlus ja kasutamine spdlog keeles C++ tagasijälituse toe jaoks: spdlog GitHubi hoidla