Πώς να ανακτήσετε πρόσφατα μηνύματα καταγραφής Python κατά τη διάρκεια σφαλμάτων

Temp mail SuperHeros
Πώς να ανακτήσετε πρόσφατα μηνύματα καταγραφής Python κατά τη διάρκεια σφαλμάτων
Πώς να ανακτήσετε πρόσφατα μηνύματα καταγραφής Python κατά τη διάρκεια σφαλμάτων

Βελτιστοποίηση καταγραφής Python για χειρισμό σφαλμάτων

Η σύνδεση στην Python είναι απαραίτητη για την παρακολούθηση συμβάντων και τη διάγνωση προβλημάτων κατά την εκτέλεση ενός προγράμματος. Ωστόσο, ορισμένες λειτουργικές μονάδες μπορούν να παράγουν υπερβολικές πληροφορίες ίχνους, οι οποίες μπορεί να γεμίσουν τα αρχεία καταγραφής. Σε τέτοιες περιπτώσεις, ορίζοντας ένα κατάλληλο επίπεδο καταγραφής, όπως π.χ ΣΦΑΛΜΑ, μπορεί να βοηθήσει στο φιλτράρισμα περιττών λεπτομερειών.

Σε σενάρια όπου μια λειτουργική μονάδα δημιουργεί υπερβολικά αρχεία καταγραφής, αλλά συμβαίνουν σφάλματα σε μια άλλη λειτουργική μονάδα που την καλεί, η πρόσβαση στα πρόσφατα μηνύματα καταγραφής καθίσταται κρίσιμη. Αυτό συμβαίνει συχνά κατά την ανίχνευση της βασικής αιτίας ενός σφάλματος. Απαιτείται ισορροπία μεταξύ της παράβλεψης υπερβολικών αρχείων καταγραφής και της σύλληψης σημαντικών.

Βιβλιοθήκες όπως spdlog στη C++ έχουν ενσωματωμένη υποστήριξη για backtracking μέσω ενός ring buffer, επιτρέποντας στους προγραμματιστές να ελέγχουν τα πρόσφατα αρχεία καταγραφής που οδηγούν σε σφάλμα. της Python ξύλευση Η βιβλιοθήκη, ωστόσο, δεν προσφέρει αυτό το χαρακτηριστικό out of the box, εγείροντας το ερώτημα πώς να εφαρμόσετε έναν παρόμοιο μηχανισμό.

Αυτό το άρθρο διερευνά πώς μπορείτε να προσαρμόσετε το σύστημα καταγραφής της Python ώστε να καταγράφει πρόσφατα μηνύματα καταγραφής όταν παρουσιάζεται σφάλμα, διασφαλίζοντας κρίσιμες πληροφορίες από το ντάμα Η μονάδα είναι διαθέσιμη για διάγνωση χωρίς να συντρίβονται τα αρχεία καταγραφής με δεδομένα ιχνών.

Εντολή Παράδειγμα χρήσης
deque(maxlen=capacity) Μια διπλή ουρά από το συλλογές μονάδα, που χρησιμοποιείται εδώ για τη δημιουργία μιας προσωρινής μνήμης κλήσης που περιέχει έναν σταθερό αριθμό μηνυμάτων καταγραφής, απορρίπτοντας τα παλαιότερα όταν φτάνουν νέα μηνύματα. Αυτή είναι μια κρίσιμη δομή για την αποτελεσματική διατήρηση ενός αρχείου καταγραφής πρόσφατων μηνυμάτων.
emit(self, record) Μια μέθοδος που παρακάμπτεται σε προσαρμοσμένους χειριστές καταγραφής για την επεξεργασία κάθε μηνύματος καταγραφής καθώς δημιουργείται. Είναι υπεύθυνο για την προσθήκη του μηνύματος καταγραφής στο deque στην προσαρμοσμένη μας λύση buffer δακτυλίου.
logging.handlers.MemoryHandler Αυτός είναι ένας χειριστής καταγραφής που αποθηκεύει τα μηνύματα καταγραφής στη μνήμη. Τα ξεπλένει όταν επιτευχθεί ένα συγκεκριμένο επίπεδο καταγραφής (σε αυτή την περίπτωση, ΣΦΑΛΜΑ). Είναι χρήσιμο για την αναβολή της εξόδου των μηνυμάτων καταγραφής έως ότου συμβεί ένα πιο σοβαρό συμβάν.
flushLevel=logging.ERROR Ένα επιχείρημα πέρασε στο MemoryHandler για να καθορίσετε το επίπεδο καταγραφής που ενεργοποιεί την έκπλυση των μηνυμάτων προσωρινής αποθήκευσης στον τελικό προορισμό (όπως η κονσόλα ή ένα αρχείο). Διασφαλίζει ότι βλέπουμε αρχεία καταγραφής εντοπισμού σφαλμάτων μόνο εάν συμβεί κάποιο σφάλμα.
setTarget(stream_handler) Στο MemoryHandler προσέγγιση, αυτή η μέθοδος ορίζει το πρόγραμμα χειρισμού προορισμού στον οποίο θα εκπλυθούν τα αρχεία καταγραφής της προσωρινής μνήμης. Στην περίπτωση αυτή, ο στόχος είναι α StreamHandler, το οποίο εξάγει αρχεία καταγραφής στην κονσόλα.
format(record) Μέρος του συστήματος μορφοποίησης της μονάδας καταγραφής. Στον προσαρμοσμένο χειριστή, αυτή η μέθοδος μορφοποιεί την εγγραφή καταγραφής πριν την προσθέσει στην προσωρινή μνήμη δακτυλίου, επιτρέποντας συνεπή και ευανάγνωστη έξοδο.
logger.addHandler(buffer_handler) Προσαρτά τον προσαρμοσμένο ή τον χειριστή μνήμης στο καταγραφικό, έτσι ώστε να επεξεργάζεται μηνύματα καταγραφής σύμφωνα με τη διαμόρφωση του χειριστή (π.χ. προσωρινή αποθήκευση, κυκλική αποθήκευση κ.λπ.). Αυτή η εντολή διασφαλίζει ότι το buffer μας χρησιμοποιείται για την καταγραφή.
logger.setLevel(logging.DEBUG) Καθορίζει το ελάχιστο επίπεδο σοβαρότητας για την καταγραφή μηνυμάτων. Στα παραδείγματα, έχει οριστεί σε ΕΝΤΟΠΙΣΜΟΣ ΣΦΑΛΜΑΤΩΝ, διασφαλίζοντας ότι όλα τα μηνύματα, συμπεριλαμβανομένων των λιγότερο σοβαρών, καταγράφονται και αποθηκεύονται στην προσωρινή μνήμη για μελλοντική επιθεώρηση.

Αποτελεσματική καταγραφή πρόσφατων αρχείων καταγραφής σε σφάλματα στην Python

Το πρώτο σενάριο που παρουσιάζεται χρησιμοποιεί έναν προσαρμοσμένο χειριστή καταγραφής με α deque δομή από την Python συλλογές μονάδα μέτρησης. Αυτό το deque λειτουργεί ως προσωρινή μνήμη δακτυλίου, κρατώντας έναν σταθερό αριθμό πρόσφατων μηνυμάτων καταγραφής. Ο χειριστής παρακάμπτει το εκπέμπω μέθοδος, η οποία καλείται κάθε φορά που δημιουργείται ένα αρχείο καταγραφής. Σε αυτή τη μέθοδο, κάθε μήνυμα καταγραφής μορφοποιείται και στη συνέχεια προσαρτάται στο deque. Επειδή το deque έχει μέγιστο μήκος, απορρίπτει αυτόματα τα παλαιότερα μηνύματα όταν φτάσει στη χωρητικότητα. Αυτή η λύση παρακολουθεί αποτελεσματικά τα πιο πρόσφατα αρχεία καταγραφής, διασφαλίζοντας ότι τα υπερβολικά μηνύματα εντοπισμού σφαλμάτων από τη μονάδα ελέγχου δεν υπερκαλύπτουν την έξοδο καταγραφής, αλλά εξακολουθούν να είναι διαθέσιμα όταν παρουσιάζεται σφάλμα στη μονάδα εκτέλεσης.

Όταν εντοπιστεί σφάλμα στη λειτουργική μονάδα εκτέλεσης, η δέσμη ενεργειών καλεί μια προσαρμοσμένη μέθοδο get_logs για να ανακτήσετε τα μηνύματα καταγραφής που είναι αποθηκευμένα στο deque. Αυτό σας επιτρέπει να επιθεωρήσετε τα μηνύματα καταγραφής από τον ελεγκτή που προηγήθηκαν αμέσως του σφάλματος. Η ιδέα πίσω από αυτήν την προσέγγιση είναι ότι τα μηνύματα καταγραφής παρέχουν κρίσιμο πλαίσιο για την αντιμετώπιση προβλημάτων, διατηρώντας παράλληλα μια ισορροπία μεταξύ της πολυγλωσσίας και της χρησιμότητας των αρχείων καταγραφής. Αυτός είναι ένας απλός και αποτελεσματικός τρόπος για να δημιουργήσετε ένα κυκλικό buffer καταγραφής στην Python, παρόμοιο με το οπισθοδρόμηση χαρακτηριστικό που βρίσκεται στη βιβλιοθήκη spdlog της C++.

Η δεύτερη λύση χρησιμοποιεί το ενσωματωμένο MemoryHandler από τη μονάδα καταγραφής της Python. Το MemoryHandler λειτουργεί με την αποθήκευση των μηνυμάτων καταγραφής στη μνήμη και την έκπλυση τους μόνο όταν συναντάται ένα συγκεκριμένο επίπεδο καταγραφής, όπως ΣΦΑΛΜΑ. Σε αυτήν την περίπτωση, ο χειριστής έχει ρυθμιστεί να αποθηκεύει έως και 10 μηνύματα καταγραφής και να τα ξεπλένει όταν παρουσιαστεί σφάλμα. Αυτή η προσέγγιση είναι παρόμοια με την τεχνική του ring buffer, αλλά χρησιμοποιεί την υπάρχουσα υποδομή καταγραφής της Python, η οποία απλοποιεί την υλοποίηση. Το MemoryHandler είναι ιδανικό για σενάρια όπου θέλετε να τραβήξετε ένα στιγμιότυπο μηνυμάτων καταγραφής που οδηγούν σε σφάλμα χωρίς να γεμίζουν τα αρχεία καταγραφής κατά τη διάρκεια κανονικών λειτουργιών.

Και οι δύο λύσεις είναι βελτιστοποιημένες για απόδοση και έχουν σχεδιαστεί για να περιορίζουν την κατανάλωση μνήμης. Περιορίζοντας τον αριθμό των αρχείων καταγραφής που είναι αποθηκευμένα στη μνήμη και ξεπλένοντας μόνο το buffer κατά τη διάρκεια κρίσιμων συμβάντων, συμβάλλουν στη διατήρηση καθαρών, διαχειρίσιμων αρχείων καταγραφής. Αυτό επιτρέπει στους προγραμματιστές να επικεντρωθούν στον εντοπισμό σφαλμάτων του πραγματικού σφάλματος αντί να εξετάζουν τεράστιες ποσότητες περιττών πληροφοριών. Κάθε σενάριο μπορεί εύκολα να ενσωματωθεί σε υπάρχουσες διαμορφώσεις καταγραφής Python προσθέτοντας απλώς τους προσαρμοσμένους χειριστές ή τους χειριστές μνήμης στο εν λόγω καταγραφικό, και τα δύο είναι αρκετά ευέλικτα ώστε να προσαρμόζονται σε διάφορες μορφές καταγραφής και επίπεδα.

Λήψη πρόσφατων μηνυμάτων καταγραφής Python σε σφάλμα με προσαρμοσμένο buffer δακτυλίου

Python Logging Module - Εφαρμογή προσαρμοσμένης μνήμης Ring Buffer

# 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 για καταγραφή σε buffer στην Python

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

Εξερεύνηση εναλλακτικών τρόπων λήψης μηνυμάτων καταγραφής στην Python

Μια άλλη προσέγγιση για τη λήψη πρόσφατων μηνυμάτων καταγραφής στην Python περιλαμβάνει τη χρήση μιας βιβλιοθήκης τρίτου κατασκευαστή όπως λογούρου. Σε αντίθεση με την ενσωματωμένη μονάδα καταγραφής της Python, το Loguru προσφέρει μια πιο ευέλικτη και φιλική προς το χρήστη διεπαφή. Περιλαμβάνει ενσωματωμένη υποστήριξη για περιστροφή αρχείων καταγραφής, φιλτράρισμα επιπέδων καταγραφής και καταγραφή αρχείων καταγραφής σε διάφορες μορφές. Αυτή η βιβλιοθήκη μπορεί να είναι ιδιαίτερα χρήσιμη όταν εργάζεστε με εφαρμογές που δημιουργούν υπερβολικά αρχεία καταγραφής, καθώς απλοποιεί τη διαχείριση αρχείων καταγραφής διασφαλίζοντας παράλληλα ότι δεν χάνονται σημαντικά μηνύματα κατά τη διαχείριση σφαλμάτων.

Το Loguru επιτρέπει τη ρύθμιση καταβόθρων καταγραφής, τα οποία μπορούν να προσαρμοστούν για αποθήκευση αρχείων καταγραφής στη μνήμη, αρχεία ή ακόμα και εξωτερικές υπηρεσίες. Μπορείτε να δημιουργήσετε ένα προσωρινό buffer στη μνήμη χρησιμοποιώντας ένα προσαρμοσμένο νεροχύτη, το οποίο στη συνέχεια μπορεί να ξεπλυθεί όταν παρουσιαστεί σφάλμα. Αυτό καθιστά το Loguru μια ισχυρή εναλλακτική λύση για όσους θέλουν περισσότερο έλεγχο του συστήματος καταγραφής τους χωρίς να ρυθμίζουν χειροκίνητα τους χειριστές όπως στην τυπική βιβλιοθήκη καταγραφής.

Ένα άλλο πλεονέκτημα του Loguru είναι ότι επιτρέπει την εύκολη ενσωμάτωση με υπάρχοντα συστήματα καταγραφής, που σημαίνει ότι μπορείτε να μεταβείτε στο Loguru χωρίς να αναθεωρήσετε ολόκληρη τη ρύθμιση καταγραφής. Αυτό μπορεί να είναι ιδιαίτερα χρήσιμο όταν ασχολείστε με πολύπλοκες εφαρμογές όπου η απόδοση και η διαχείριση αρχείων καταγραφής είναι ζωτικής σημασίας. Τελικά, ενώ η ενότητα καταγραφής της Python είναι επαρκής για τις περισσότερες περιπτώσεις χρήσης, η εξερεύνηση βιβλιοθηκών όπως η Loguru παρέχει πρόσθετη ευελιξία και ευκολία στη χρήση για την αποτελεσματική λήψη και διαχείριση μηνυμάτων καταγραφής.

Συνήθεις ερωτήσεις σχετικά με τη λήψη μηνυμάτων καταγραφής στην Python

  1. Πώς μπορώ να περιορίσω την πολυγλωσσία των μηνυμάτων καταγραφής;
  2. Χρήση logger.setLevel(logging.ERROR) για να αποκρύψετε μηνύματα χαμηλότερης σοβαρότητας, όπως εντοπισμό σφαλμάτων και πληροφορίες, εμφανίζοντας μόνο σφάλματα.
  3. Ποιος είναι ο καλύτερος τρόπος αποθήκευσης πρόσφατων αρχείων καταγραφής στη μνήμη;
  4. ΕΝΑ deque(maxlen=capacity) μπορεί να χρησιμοποιηθεί για την αποθήκευση πρόσφατων μηνυμάτων καταγραφής, με αυτόματη απόρριψη των παλαιότερων καταχωρήσεων.
  5. Πώς μπορώ να ξεπλύνω τα αρχεία καταγραφής στην προσωρινή μνήμη όταν παρουσιάζεται σφάλμα;
  6. Με MemoryHandler, τα αρχεία καταγραφής αποθηκεύονται στη μνήμη και ξεπλένονται όταν ενεργοποιείται ένα συγκεκριμένο επίπεδο καταγραφής, όπως π.χ. flushLevel=logging.ERROR.
  7. Ποιο είναι το πλεονέκτημα της χρήσης του Loguru έναντι της καταγραφής της Python;
  8. Loguru απλοποιεί τη ρύθμιση των αρχείων καταγραφής με λιγότερο κώδικα λέβητα και παρέχει πιο εύχρηστες λειτουργίες όπως ευκολότερο φιλτράρισμα και περιστροφή αρχείων καταγραφής.
  9. Μπορώ να ενσωματώσω το Loguru με τις υπάρχουσες διαμορφώσεις καταγραφής;
  10. Ναι, το Loguru μπορεί να ενσωματωθεί ομαλά με το ενσωματωμένο σύστημα καταγραφής της Python αντικαθιστώντας τον προεπιλεγμένο χειριστή καταγραφής.

Συνοψίζοντας τις Τεχνικές Καταγραφής Καταγραφής

Σε καταστάσεις επιρρεπείς σε σφάλματα, η χρήση της μονάδας καταγραφής της Python βοηθά αποτελεσματικά στην καταγραφή των πρόσφατων μηνυμάτων καταγραφής χωρίς να γεμίζει το αποτέλεσμα. Προσαρμοσμένοι χειριστές όπως deque και MemoryHandler παρέχει ευέλικτους τρόπους αποθήκευσης κρίσιμων μηνυμάτων όταν παρουσιάζεται σφάλμα.

Αυτές οι λύσεις είναι πρακτικές για τον εντοπισμό σφαλμάτων σε λειτουργικές μονάδες με υψηλή περιεκτικότητα, διασφαλίζοντας ότι οι προγραμματιστές έχουν διαθέσιμα τα απαραίτητα δεδομένα καταγραφής. Με την ενσωμάτωση εργαλείων τρίτων όπως Loguru, διατίθεται ακόμη μεγαλύτερη ευελιξία, προσφέροντας προηγμένη διαχείριση αρχείων καταγραφής με ελάχιστη διαμόρφωση.

Πηγές και αναφορές για λύσεις καταγραφής Python
  1. Επεξήγηση της Python deque υλοποίηση και χρήση του στην καταγραφή: Python Documentation - Συλλογές
  2. Λεπτομέρειες για την Python ξύλευση βιβλιοθήκη και MemoryHandler: Python Documentation - Logging
  3. Επισκόπηση του Λογκούρου ως προηγμένη εναλλακτική καταγραφής Python: Τεκμηρίωση Loguru
  4. Σύγκριση και χρήση του spdlog σε C++ για υποστήριξη backtrace: spdlog Αποθετήριο GitHub