Kā izgūt jaunākos Python reģistrēšanas ziņojumus kļūdu laikā

Temp mail SuperHeros
Kā izgūt jaunākos Python reģistrēšanas ziņojumus kļūdu laikā
Kā izgūt jaunākos Python reģistrēšanas ziņojumus kļūdu laikā

Python reģistrēšanas optimizēšana kļūdu apstrādei

Pieteikšanās Python ir būtiska notikumu izsekošanai un problēmu diagnosticēšanai programmas izpildes laikā. Tomēr daži moduļi var radīt pārmērīgu izsekošanas informāciju, kas var pārblīvēt žurnālus. Šādos gadījumos iestatot atbilstošu reģistrēšanas līmeni, piemēram, KĻŪDA, var palīdzēt filtrēt nevajadzīgas detaļas.

Gadījumos, kad viens modulis ģenerē pārāk daudz žurnālu, bet kļūdas rodas citā modulī, kas to izsauc, ir svarīgi piekļūt jaunākajiem žurnāla ziņojumiem. Tas bieži notiek, meklējot kļūdas galveno cēloni. Ir nepieciešams līdzsvars starp pārmērīgu baļķu ignorēšanu un svarīgu fiksāciju.

Bibliotēkām patīk spdlog C++ versijā ir iebūvēts atbalsts atgriešanai, izmantojot zvana buferi, ļaujot izstrādātājiem pārskatīt jaunākos žurnālus, kas noveda pie kļūdas. Python's mežizstrāde Tomēr bibliotēka nepiedāvā šo funkciju, radot jautājumu par to, kā ieviest līdzīgu mehānismu.

Šajā rakstā ir apskatīts, kā pielāgot Python reģistrēšanas sistēmu, lai kļūdas gadījumā tvertu jaunākos žurnāla ziņojumus, nodrošinot svarīgu informāciju no pārbaudītājs modulis ir pieejams diagnostikai, nepārslogojot žurnālus ar izsekošanas datiem.

Pavēli Lietošanas piemērs
deque(maxlen=capacity) Divu galu rinda no kolekcijas modulis, ko izmanto šeit, lai izveidotu zvana buferi, kurā ir fiksēts žurnāla ziņojumu skaits, atmetot vecākos ziņojumus, kad tiek saņemti jauni ziņojumi. Šī ir būtiska struktūra, lai efektīvi uzturētu jaunāko ziņojumu žurnālu.
emit(self, record) Metode, kas tiek ignorēta pielāgotajos reģistrēšanas apdarinātājos, lai apstrādātu katru žurnāla ziņojumu, kad tas tiek ģenerēts. Tā ir atbildīga par žurnāla ziņojuma pievienošanu deque mūsu pielāgotajā gredzenu buferšķīdumā.
logging.handlers.MemoryHandler Šis ir reģistrēšanas apdarinātājs, kas buferē žurnāla ziņojumus atmiņā. Tas izskalo tos, kad tiek sasniegts noteikts žurnāla līmenis (šajā gadījumā KĻŪDA). Tas ir noderīgi, lai atliktu žurnāla ziņojumu izvadīšanu, līdz notiek nopietnāks notikums.
flushLevel=logging.ERROR Arguments tika nodots Memory Handler lai norādītu žurnāla līmeni, kas aktivizē buferizēto ziņojumu izskalošanu līdz galamērķim (piemēram, konsolei vai failam). Tas nodrošina, ka mēs redzam tikai atkļūdošanas žurnālus, ja rodas kļūda.
setTarget(stream_handler) In Memory Handler pieeja, šī metode iestata mērķa apdarinātāju, kuram tiks izskaloti buferizētie žurnāli. Šajā gadījumā mērķis ir a StreamHandler, kas izvada žurnālus konsolei.
format(record) Daļa no reģistrēšanas moduļa formatēšanas sistēmas. Pielāgotajā apdarinātājā šī metode formatē žurnāla ierakstu pirms tā pievienošanas zvana buferim, nodrošinot konsekventu un lasāmu izvadi.
logger.addHandler(buffer_handler) Pievieno pielāgoto vai atmiņas apdarinātāju reģistrētājam, lai tas apstrādātu žurnāla ziņojumus atbilstoši apstrādātāja konfigurācijai (piemēram, buferizācija, cirkulārā krātuve utt.). Šī komanda nodrošina, ka mūsu buferis tiek izmantots reģistrēšanai.
logger.setLevel(logging.DEBUG) Definē ziņojumu reģistrēšanas minimālo smaguma līmeni. Piemēros tas ir iestatīts uz ATKLĀŠANA, nodrošinot, ka visi ziņojumi, tostarp mazāk nopietni, tiek uztverti un buferēti vēlākai pārbaudei.

Efektīva jaunāko žurnālu tveršana par kļūdu programmā Python

Pirmajā parādītajā skriptā tiek izmantots pielāgots reģistrēšanas apdarinātājs ar a deque struktūra no Python's kolekcijas modulis. Šis deque darbojas kā zvana buferis, kurā ir fiksēts skaits pēdējo žurnāla ziņojumu. Apdarinātājs ignorē izstaro metode, kas tiek izsaukta katru reizi, kad tiek ģenerēts žurnāls. Izmantojot šo metodi, katrs žurnāla ziņojums tiek formatēts un pēc tam pievienots deque. Tā kā deque ir maksimālais garums, tas automātiski atmet vecākos ziņojumus, kad tas sasniedz ietilpību. Šis risinājums efektīvi izseko jaunākos žurnālus, nodrošinot, ka pārlieku daudz atkļūdošanas ziņojumu no pārbaudītāja moduļa nepārslogo žurnāla izvadi, bet joprojām ir pieejami, ja palaidēja modulī rodas kļūda.

Kad palaidēja modulī tiek atklāta kļūda, skripts izsauc pielāgotu metodi get_logs lai izgūtu dekvē saglabātos žurnāla ziņojumus. Tas ļauj pārbaudīt žurnāla ziņojumus no pārbaudītāja, kas bija tieši pirms kļūdas. Šīs pieejas ideja ir tāda, ka žurnāla ziņojumi nodrošina būtisku problēmu novēršanas kontekstu, vienlaikus saglabājot līdzsvaru starp žurnāla detalizētību un lietderību. Šis ir vienkāršs un efektīvs veids, kā Python izveidot apļveida žurnāla buferi, kas ir līdzīgs šim izsekot atpakaļ funkcija, kas atrodama C++ spdlog bibliotēkā.

Otrais risinājums izmanto iebūvēto Memory Handler no Python reģistrēšanas moduļa. MemoryHandler darbojas, buferējot žurnāla ziņojumus atmiņā un izskalojot tos tikai tad, kad tiek konstatēts konkrēts žurnāla līmenis, piemēram, KĻŪDA. Šajā gadījumā apdarinātājs ir konfigurēts, lai buferētu līdz 10 žurnāla ziņojumiem un izskalotu tos, kad rodas kļūda. Šī pieeja ir līdzīga gredzena bufera tehnikai, taču tajā tiek izmantota Python esošā reģistrēšanas infrastruktūra, kas vienkāršo ieviešanu. MemoryHandler ir ideāli piemērots gadījumiem, kad vēlaties tvert žurnāla ziņojumu momentuzņēmumu, kas rada kļūdu, nepārblīvējot žurnālus parasto darbību laikā.

Abi risinājumi ir optimizēti veiktspējai un paredzēti atmiņas patēriņa ierobežošanai. Ierobežojot atmiņā saglabāto žurnālu skaitu un izskalojot buferi tikai kritisku notikumu laikā, tie palīdz uzturēt tīrus, pārvaldāmus žurnālus. Tas ļauj izstrādātājiem koncentrēties uz faktiskās kļūdas atkļūdošanu, nevis izsijāt milzīgu daudzumu nevajadzīgas informācijas. Katru skriptu var viegli integrēt esošajās Python reģistrēšanas konfigurācijās, attiecīgajam reģistrētājam vienkārši pievienojot pielāgotos vai atmiņas apdarinātājus, un abi ir pietiekami elastīgi, lai tos pielāgotu dažādiem žurnālu formātiem un līmeņiem.

Neseno Python reģistrēšanas ziņojumu tveršana kļūdas gadījumā, izmantojot pielāgotu zvana buferi

Python reģistrēšanas modulis — pielāgota zvana bufera ieviešana

# 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)

MemoryHandler izmantošana buferizētai reģistrēšanai programmā Python

Python reģistrēšanas modulis — MemoryHandler pieeja

# 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

Alternatīvu veidu izpēte žurnāla ziņojumu tveršanai programmā Python

Vēl viena pieeja jaunāko žurnāla ziņojumu tveršanai Python ietver tādas trešās puses bibliotēkas izmantošanu kā loguru. Atšķirībā no Python iebūvētā reģistrēšanas moduļa, Loguru piedāvā elastīgāku un lietotājam draudzīgāku saskarni. Tas ietver iebūvētu atbalstu žurnālu rotēšanai, žurnālu līmeņu filtrēšanai un dažādu formātu žurnālu tveršanai. Šī bibliotēka var būt īpaši noderīga, strādājot ar lietojumprogrammām, kas ģenerē pārāk daudz žurnālu, jo tā vienkāršo žurnālu pārvaldību, vienlaikus nodrošinot, ka kļūdu apstrādes laikā netiek palaisti garām kritiskie ziņojumi.

Loguru ļauj iestatīt žurnālu izlietnes, kuras var pielāgot žurnālu glabāšanai atmiņā, failos vai pat ārējos pakalpojumos. Varat izveidot pagaidu buferi atmiņā, izmantojot pielāgotu izlietni, kuru pēc tam var izskalot, ja rodas kļūda. Tas padara Loguru par jaudīgu alternatīvu tiem, kas vēlas vairāk kontrolēt savu reģistrēšanas sistēmu, manuāli nekonfigurējot apstrādātājus, piemēram, standarta reģistrēšanas bibliotēkā.

Vēl viens Loguru ieguvums ir tas, ka tas ļauj viegli integrēties ar esošajām reģistrēšanas sistēmām, kas nozīmē, ka varat pārslēgties uz Loguru, nepārveidojot visu reģistrēšanas iestatījumu. Tas var būt īpaši noderīgi, strādājot ar sarežģītām lietojumprogrammām, kur veiktspējai un žurnālu pārvaldībai ir izšķiroša nozīme. Galu galā, lai gan Python reģistrēšanas modulis ir pietiekams vairumam lietošanas gadījumu, tādu bibliotēku izpēte kā Loguru nodrošina papildu elastību un ērtu lietošanu, lai efektīvi tvertu un pārvaldītu žurnāla ziņojumus.

Bieži uzdotie jautājumi par žurnāla ziņojumu tveršanu programmā Python

  1. Kā es varu ierobežot žurnāla ziņojumu detalizētību?
  2. Izmantot logger.setLevel(logging.ERROR) lai izslēgtu zemākas nopietnības ziņojumus, piemēram, atkļūdošanu un informāciju, rādot tikai kļūdas.
  3. Kāds ir labākais veids, kā saglabāt atmiņā jaunākos žurnālus?
  4. A deque(maxlen=capacity) var izmantot, lai saglabātu jaunākos žurnāla ziņojumus, automātiski atmetot vecākos ierakstus.
  5. Kā izskalot buferizētos žurnālus, ja rodas kļūda?
  6. Ar MemoryHandler, žurnāli tiek saglabāti atmiņā un izskaloti, kad tiek aktivizēts noteikts žurnāla līmenis, piemēram, flushLevel=logging.ERROR.
  7. Kāda ir Loguru izmantošanas priekšrocība salīdzinājumā ar Python reģistrēšanu?
  8. Loguru vienkāršo žurnāla iestatīšanu ar mazāku standarta koda skaitu un nodrošina intuitīvākas funkcijas, piemēram, vieglāku žurnālu filtrēšanu un rotēšanu.
  9. Vai es varu integrēt Loguru ar esošajām reģistrēšanas konfigurācijām?
  10. Jā, Loguru var nevainojami integrēties ar Python iebūvēto reģistrēšanas sistēmu, aizstājot noklusējuma reģistrēšanas apdarinātāju.

Apkopojot baļķu uztveršanas metodes

Situācijās, kurās ir iespējamas kļūdas, Python reģistrēšanas moduļa izmantošana efektīvi palīdz tvert jaunākos žurnāla ziņojumus, nepārblīvējot izvadi. Pielāgoti apstrādātāji, piemēram, deque un Memory Handler nodrošina daudzpusīgus veidus, kā saglabāt svarīgus ziņojumus, ja rodas kļūda.

Šie risinājumi ir praktiski, lai atkļūdotu kļūdas moduļos ar ļoti detalizētu informāciju, nodrošinot, ka izstrādātājiem ir pieejami nepieciešamie žurnāla dati. Integrējot trešo pušu rīkus, piemēram Loguru, ir pieejama vēl lielāka elastība, piedāvājot uzlabotu žurnālu pārvaldību ar minimālu konfigurāciju.

Python reģistrēšanas risinājumu avoti un atsauces
  1. Python skaidrojums deque ieviešana un tā izmantošana reģistrēšanā: Python dokumentācija — kolekcijas
  2. Sīkāka informācija par Python's mežizstrāde bibliotēka un MemoryHandler: Python dokumentācija — reģistrēšana
  3. Pārskats par Loguru kā uzlabota Python reģistrēšanas alternatīva: Loguru dokumentācija
  4. Salīdzinājums un lietošana spdlog valodā C++ atpakaļsekošanas atbalstam: spdlog GitHub repozitorijs