Python-lokin optimointi virheiden käsittelyä varten
Pythoniin kirjautuminen on välttämätöntä tapahtumien seuraamiseksi ja ongelmien diagnosoimiseksi ohjelman suorittamisen aikana. Tietyt moduulit voivat kuitenkin tuottaa liikaa jäljitystietoja, mikä saattaa sotkea lokit. Tällaisissa tapauksissa sopiva kirjaustaso, kuten esim VIRHE, voi auttaa suodattamaan tarpeettomat yksityiskohdat.
Skenaarioissa, joissa yksi moduuli luo liikaa lokeja, mutta toisessa sitä kutsuvassa moduulissa tapahtuu virheitä, viimeaikaisten lokiviestien käyttäminen tulee ratkaisevan tärkeäksi. Näin on usein, kun etsitään virheen perimmäistä syytä. Tarvitaan tasapaino ylimääräisten lokien huomioimatta jättämisen ja tärkeiden kirjaamisen välillä.
Kirjastot pitävät spdlog C++:ssa on sisäänrakennettu tuki soittopuskurin kautta tapahtuvalle paluulle, jolloin kehittäjät voivat tarkastella viimeisimpiä virheisiin johtaneita lokeja. Pythonin puunkorjuu kirjasto ei kuitenkaan tarjoa tätä ominaisuutta valmiina, mikä herättää kysymyksen samanlaisen mekanismin toteuttamisesta.
Tässä artikkelissa tutkitaan, kuinka Pythonin lokijärjestelmää voidaan mukauttaa niin, että se kaappaa viimeisimmät lokiviestit virheen sattuessa ja varmistaa näin kriittiset tiedot tarkistaja moduuli on käytettävissä diagnoosia varten ilman, että lokit täytetään jälkitiedoilla.
Komento | Esimerkki käytöstä |
---|---|
deque(maxlen=capacity) | Kaksipäinen jono osoitteesta kokoelmat moduuli, jota käytetään tässä luomaan soittopuskuri, joka sisältää kiinteän määrän lokiviestejä ja hylkää vanhimmat, kun uusia viestejä saapuu. Tämä on tärkeä rakenne viimeaikaisten viestien tehokkaan lokin ylläpitämiseksi. |
emit(self, record) | Menetelmä, joka ohitetaan mukautetuissa lokikäsittelijöissä jokaisen lokiviestin käsittelemiseksi sitä luotaessa. Se on vastuussa lokiviestin lisäämisestä deque mukautetussa rengaspuskuriratkaisussamme. |
logging.handlers.MemoryHandler | Tämä on lokikäsittelijä, joka puskuroi lokiviestit muistiin. Se huuhtelee ne, kun tietty lokitaso saavutetaan (tässä tapauksessa VIRHE). Se on hyödyllinen lykätä lokiviestien tulostamista, kunnes tapahtuu vakavampi tapahtuma. |
flushLevel=logging.ERROR | Väite välitettiin Memory Handler määrittää lokitason, joka käynnistää puskuroitujen viestien huuhtelun lopulliseen kohteeseen (kuten konsoliin tai tiedostoon). Se varmistaa, että näemme virheenkorjauslokit vain, jos tapahtuu virhe. |
setTarget(stream_handler) | Vuonna Memory Handler lähestymistapaa, tämä menetelmä asettaa kohdekäsittelijän, johon puskuroidut lokit huuhdellaan. Tässä tapauksessa kohde on a StreamHandler, joka tulostaa lokit konsoliin. |
format(record) | Osa lokimoduulin muotoilujärjestelmää. Mukautetussa käsittelijässä tämä menetelmä muotoilee lokitietueen ennen sen lisäämistä soittopuskuriin, mikä mahdollistaa johdonmukaisen ja luettavan tulosteen. |
logger.addHandler(buffer_handler) | Kiinnittää mukautetun tai muistikäsittelijän loggeriin, jotta se käsittelee lokiviestejä käsittelijän asetusten mukaisesti (esim. puskurointi, kiertotallennus jne.). Tämä komento varmistaa, että puskuriamme käytetään lokiin. |
logger.setLevel(logging.DEBUG) | Määrittää viestien kirjaamisen vähimmäisvakavuustason. Esimerkeissä se on asetettu DEBUGvarmistaen, että kaikki viestit, myös vähemmän vakavat, tallennetaan ja puskuroidaan myöhempää tarkastelua varten. |
Viimeaikaisten lokien tehokas taltiointi Pythonin virheistä
Ensimmäinen esitetty skripti käyttää mukautettua kirjauskäsittelijää, jossa on a deque rakenne Pythonista kokoelmat moduuli. Tämä deque toimii soittopuskurina, joka sisältää kiinteän määrän viimeaikaisia lokiviestejä. Käsittelijä ohittaa päästää menetelmä, jota kutsutaan aina, kun loki luodaan. Tässä menetelmässä jokainen lokiviesti muotoillaan ja liitetään deque-tiedostoon. Koska dequella on enimmäispituus, se hylkää automaattisesti vanhimmat viestit, kun se saavuttaa kapasiteetin. Tämä ratkaisu seuraa tehokkaasti viimeisimmät lokit varmistaen, että tarkistusmoduulin liialliset virheenkorjausviestit eivät ylitä lokitulostusta, vaan ovat silti käytettävissä, kun ajomoduulissa tapahtuu virhe.
Kun ajomoduulissa havaitaan virhe, komentosarja kutsuu mukautetun menetelmän get_logs noutaaksesi deque-kansioon tallennetut lokiviestit. Näin voit tarkastaa välittömästi virhettä edeltäneen tarkistajan lokiviestit. Tämän lähestymistavan ideana on, että lokiviestit tarjoavat ratkaisevan kontekstin vianmääritykseen ja säilyttävät tasapainon lokin sanallisuuden ja hyödyllisyyden välillä. Tämä on yksinkertainen ja tehokas tapa luoda pyöreä lokipuskuri Pythonissa, samanlainen kuin jäljittää ominaisuus löytyy C++:n spdlog-kirjastosta.
Toinen ratkaisu käyttää sisäänrakennettua Memory Handler Pythonin lokimoduulista. MemoryHandler toimii puskuroimalla lokiviestit muistiin ja huuhtelemalla ne vain, kun tietty lokitaso havaitaan, kuten VIRHE. Tässä tapauksessa käsittelijä on määritetty puskuroimaan enintään 10 lokiviestiä ja tyhjentämään ne virheen sattuessa. Tämä lähestymistapa on samanlainen kuin rengaspuskuritekniikka, mutta käyttää Pythonin olemassa olevaa lokiinfrastruktuuria, mikä yksinkertaistaa toteutusta. MemoryHandler on ihanteellinen skenaarioihin, joissa haluat kaapata tilannekuvan lokiviesteistä, jotka johtavat virheeseen sotkematta lokeja normaalin toiminnan aikana.
Molemmat ratkaisut on optimoitu suorituskykyä varten ja suunniteltu rajoittamaan muistin kulutusta. Rajoittamalla muistiin tallennettujen lokien määrää ja tyhjentämällä puskurin vain kriittisten tapahtumien aikana, ne auttavat ylläpitämään puhtaita, hallittavia lokeja. Tämän ansiosta kehittäjät voivat keskittyä todellisen virheen virheenkorjaukseen sen sijaan, että seulottaisiin valtavia määriä tarpeettomia tietoja. Jokainen komentosarja voidaan helposti integroida olemassa oleviin Python-lokikokoonpanoihin yksinkertaisesti lisäämällä mukautetut tai muistikäsittelijät kyseiseen loggeriin, ja molemmat ovat riittävän joustavia mukautettavaksi erilaisiin lokimuotoihin ja -tasoihin.
Viimeaikaisten Python-lokiviestien kaappaaminen virhetilanteessa mukautetulla soittopuskurilla
Python Logging Module - mukautetun rengaspuskurin toteutus
# 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)
MemoryHandlerin käyttäminen puskuroituun kirjaamiseen Pythonissa
Python Logging Module - MemoryHandler Approach
# 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
Vaihtoehtoisten tapojen kaappaaminen lokiviestien tutkimiseen Pythonissa
Toinen lähestymistapa viimeaikaisten lokiviestien kaappaamiseen Pythonissa on käyttää kolmannen osapuolen kirjastoa, kuten loguru. Toisin kuin Pythonin sisäänrakennettu lokimoduuli, Loguru tarjoaa joustavamman ja käyttäjäystävällisemmän käyttöliittymän. Se sisältää sisäänrakennetun tuen lokien pyörittämiseen, lokitasojen suodattamiseen ja lokien sieppaamiseen eri muodoissa. Tämä kirjasto voi olla erityisen hyödyllinen työskenneltäessä sovellusten kanssa, jotka luovat liikaa lokeja, koska se yksinkertaistaa lokien hallintaa ja varmistaa, että kriittisiä viestejä ei jää huomaamatta virheenkäsittelyn aikana.
Loguru mahdollistaa lokien nielujen asettamisen, jotka voidaan mukauttaa tallentamaan lokit muistiin, tiedostoihin tai jopa ulkoisiin palveluihin. Voit luoda väliaikaisen muistin puskurin mukautetun nielun avulla, joka voidaan sitten tyhjentää virheen ilmetessä. Tämä tekee Logurusta tehokkaan vaihtoehdon niille, jotka haluavat enemmän hallita lokijärjestelmäänsä ilman käsittelijöiden manuaalista konfigurointia, kuten tavallisessa lokikirjastossa.
Toinen Logurun etu on, että se mahdollistaa helpon integroinnin olemassa oleviin kirjausjärjestelmiin, mikä tarkoittaa, että voit vaihtaa Loguruun ilman koko kirjausasetuksien uudistamista. Tämä voi olla erityisen hyödyllistä käsiteltäessä monimutkaisia sovelluksia, joissa suorituskyky ja lokien hallinta ovat ratkaisevan tärkeitä. Lopulta vaikka Pythonin lokimoduuli riittää useimpiin käyttötapauksiin, Logurun kaltaisten kirjastojen tutkiminen tarjoaa lisää joustavuutta ja helppokäyttöisyyttä lokiviestien tehokkaaseen kaappaamiseen ja hallintaan.
Yleisiä kysymyksiä lokiviestien tallentamisesta Pythonissa
- Kuinka voin rajoittaa lokiviestien sanallisuutta?
- Käyttää logger.setLevel(logging.ERROR) vaimentaa vähemmän vakavia viestejä, kuten virheenkorjaus ja tiedot, näyttäen vain virheitä.
- Mikä on paras tapa tallentaa viimeisimmät lokit muistiin?
- A deque(maxlen=capacity) voidaan käyttää uusimpien lokiviestien tallentamiseen, jolloin vanhimmat merkinnät hylätään automaattisesti.
- Miten puskuroidut lokit tyhjennetään, kun tapahtuu virhe?
- Kanssa MemoryHandler, lokit tallennetaan muistiin ja tyhjennetään, kun tietty lokitaso laukeaa, kuten esim flushLevel=logging.ERROR.
- Mitä hyötyä Logurun käytöstä on Pythonin kirjaamiseen verrattuna?
- Loguru yksinkertaistaa lokin määritystä vähemmällä pohjakoodilla ja tarjoaa intuitiivisempia ominaisuuksia, kuten helpomman suodatuksen ja lokien kiertämisen.
- Voinko integroida Logurun olemassa oleviin lokikokoonpanoihin?
- Kyllä, Loguru voi integroitua sujuvasti Pythonin sisäänrakennetun lokijärjestelmän kanssa korvaamalla oletusarvoisen kirjauskäsittelijän.
Yhteenveto lokin kaappaustekniikoista
Virhealttiissa tilanteissa Pythonin lokimoduulin tehokas käyttö auttaa kaappaamaan viimeisimmät lokiviestit sotkematta tulosta. Mukautetut käsittelijät, kuten deque ja Memory Handler tarjoavat monipuolisia tapoja tallentaa tärkeitä viestejä virheen sattuessa.
Nämä ratkaisut ovat käytännöllisiä virheiden korjaamiseen monisanaisissa moduuleissa, mikä varmistaa, että kehittäjillä on tarvittavat lokitiedot saatavilla. Integroimalla kolmannen osapuolen työkaluja, kuten Loguru, vielä enemmän joustavuutta on saatavilla, mikä tarjoaa edistyneen lokinhallinnan minimaalisella kokoonpanolla.
Python-lokiratkaisujen lähteet ja viitteet
- Pythonin selitys deque toteutus ja sen käyttö kirjaamisessa: Python-dokumentaatio - kokoelmat
- Yksityiskohdat Pythonista puunkorjuu kirjasto ja MemoryHandler: Python-dokumentaatio - Kirjaaminen
- Yleiskatsaus Loguru edistyneenä Python-lokivaihtoehtona: Loguru dokumentaatio
- Vertailu ja käyttö spdlog C++:ssa paluujäljityksen tuki: spdlog GitHub-arkisto