Hata İşleme için Python Günlüğünü Optimize Etme
Python'da oturum açmak, bir programın yürütülmesi sırasında olayları izlemek ve sorunları teşhis etmek için gereklidir. Ancak bazı modüller aşırı izleme bilgisi üretebilir ve bu da günlükleri karmaşık hale getirebilir. Bu gibi durumlarda, uygun bir günlük kaydı düzeyinin ayarlanması HATAgereksiz ayrıntıların filtrelenmesine yardımcı olabilir.
Bir modülün aşırı miktarda log oluşturduğu ancak onu çağıran başka bir modülde hataların oluştuğu senaryolarda, güncel log mesajlarına erişim hayati önem taşıyor. Bu genellikle bir hatanın temel nedeninin izini sürerken yaşanan durumdur. Aşırı günlükleri göz ardı etmekle önemli olanları yakalamak arasında bir dengeye ihtiyaç vardır.
Kütüphaneler gibi spdlog C++'da, geliştiricilerin hataya yol açan son günlükleri gözden geçirmesine olanak tanıyan bir halka arabelleği yoluyla geri izleme için yerleşik desteğe sahiptir. Python'un günlüğe kaydetme Ancak kütüphane bu özelliği kullanıma hazır olarak sunmuyor ve bu da benzer bir mekanizmanın nasıl uygulanacağı sorusunu gündeme getiriyor.
Bu makale, Python'un günlük sistemini, bir hata oluştuğunda en son günlük mesajlarını yakalayacak şekilde nasıl uyarlayabileceğinizi araştırıyor ve kritik bilgilerin sistemden alınmasını sağlıyor. denetleyici modülü, günlükleri izleme verileriyle doldurmadan teşhis için kullanılabilir.
Emretmek | Kullanım örneği |
---|---|
deque(maxlen=capacity) | Çift uçlu bir kuyruk koleksiyonlar Modül, burada sabit sayıda günlük mesajını tutan bir halka arabelleği oluşturmak için kullanılır ve yeni mesajlar geldiğinde en eski olanları atar. Bu, son mesajların kaydını verimli bir şekilde tutmak için çok önemli bir yapıdır. |
emit(self, record) | Her günlük iletisini oluşturulduğu sırada işlemek için özel günlük işleyicilerinde geçersiz kılınan bir yöntem. Günlük mesajının eklenmesinden sorumludur. deque özel halka tampon çözümümüzde. |
logging.handlers.MemoryHandler | Bu, günlük mesajlarını bellekte arabelleğe alan bir günlük işleyicisidir. Belirli bir günlük seviyesine ulaşıldığında bunları temizler (bu durumda, HATA). Daha ciddi bir olay oluşana kadar günlük mesajlarının çıktısını ertelemek açısından kullanışlıdır. |
flushLevel=logging.ERROR | Bir argüman aktarıldı Bellek İşleyicisi ara belleğe alınan mesajların son hedefe (konsol veya dosya gibi) aktarılmasını tetikleyen günlük düzeyini belirtmek için. Yalnızca bir hata meydana geldiğinde hata ayıklama günlüklerini görmemizi sağlar. |
setTarget(stream_handler) | içinde Bellek İşleyicisi yaklaşımında, bu yöntem, ara belleğe alınmış günlüklerin boşaltılacağı hedef işleyiciyi ayarlar. Bu durumda hedef bir Akış İşleyicisi, günlüklerin konsola çıktısını verir. |
format(record) | Günlük modülünün biçimlendirme sisteminin bir parçası. Özel işleyicide bu yöntem, günlük kaydını halka arabelleğine eklemeden önce biçimlendirerek tutarlı ve okunabilir çıktıya olanak tanır. |
logger.addHandler(buffer_handler) | Günlük mesajlarını işleyicinin yapılandırmasına göre (ör. ara belleğe alma, döngüsel depolama vb.) işlemesi için özel veya bellek işleyiciyi günlükçüye ekler. Bu komut arabelleğimizin kayıt için kullanılmasını sağlar. |
logger.setLevel(logging.DEBUG) | Mesajların günlüğe kaydedilmesi için minimum önem düzeyini tanımlar. Örneklerde, şu şekilde ayarlanmıştır: HATA AYIKLAMADaha az ciddi olanlar da dahil olmak üzere tüm mesajların daha sonra incelenmek üzere yakalanıp arabelleğe alınmasını sağlamak. |
Python'da Hata Durumunda Son Günlükleri Verimli Bir Şekilde Yakalama
Sunulan ilk komut dosyası, özel bir günlük kaydı işleyicisi kullanıyor. deque Python'un yapısı koleksiyonlar modülü. Bu deque, sabit sayıda güncel günlük mesajını tutan bir halka arabelleği görevi görür. İşleyici geçersiz kılar yaymak Her günlük oluşturulduğunda çağrılan yöntem. Bu yöntemde, her günlük mesajı biçimlendirilir ve ardından deque'e eklenir. Deque'nin maksimum uzunluğu olduğundan, kapasiteye ulaştığında en eski mesajları otomatik olarak atar. Bu çözüm, en son günlükleri verimli bir şekilde izleyerek denetleyici modülünden gelen aşırı hata ayıklama mesajlarının günlük çıktısını aşmamasını, ancak çalıştırıcı modülünde bir hata oluştuğunda hala kullanılabilir olmasını sağlar.
Çalıştırıcı modülünde bir hata algılandığında komut dosyası özel bir yöntemi çağırır get_logs deque'de saklanan günlük mesajlarını almak için. Bu, denetleyicinin hatadan hemen önce gelen günlük mesajlarını incelemenize olanak tanır. Bu yaklaşımın ardındaki fikir, günlük mesajlarının sorun giderme için önemli bir bağlam sağlaması ve aynı zamanda günlük ayrıntısı ile fayda arasında bir denge sağlamasıdır. Bu, Python'da aşağıdakine benzer dairesel bir günlük arabelleği oluşturmanın basit ve etkili bir yoludur: geriye doğru izleme C++'ın spdlog kütüphanesinde bulunan özellik.
İkinci çözüm yerleşik olanı kullanır Bellek İşleyicisi Python'un kayıt modülünden. MemoryHandler, günlük mesajlarını bellekte ara belleğe alarak ve yalnızca belirli bir günlük düzeyiyle karşılaşıldığında bunları temizleyerek çalışır. HATA. Bu durumda, işleyici en fazla 10 günlük mesajını ara belleğe alacak ve bir hata oluştuğunda bunları temizleyecek şekilde yapılandırılmıştır. Bu yaklaşım, ring buffer tekniğine benzer ancak Python'un mevcut günlük kaydı altyapısını kullanır ve bu da uygulamayı basitleştirir. MemoryHandler, normal işlemler sırasında günlükleri karıştırmadan hataya yol açan günlük mesajlarının anlık görüntüsünü yakalamak istediğiniz senaryolar için idealdir.
Her iki çözüm de performans açısından optimize edilmiş ve bellek tüketimini sınırlandıracak şekilde tasarlanmıştır. Bellekte saklanan günlük sayısını kısıtlayarak ve arabelleği yalnızca kritik olaylar sırasında temizleyerek, günlüklerin temiz ve yönetilebilir tutulmasına yardımcı olurlar. Bu, geliştiricilerin çok miktarda gereksiz bilgiyi elemek yerine gerçek hatanın hatalarını ayıklamaya odaklanmasına olanak tanır. Her komut dosyası, özel veya bellek işleyicilerini söz konusu günlükçüye ekleyerek mevcut Python günlükleme yapılandırmalarına kolayca entegre edilebilir ve her ikisi de çeşitli günlük formatlarına ve seviyelerine uyarlanacak kadar esnektir.
Özel Zil Arabelleğiyle Hata Durumunda Son Python Günlüğü Mesajlarını Yakalama
Python Günlük Modülü - Özel Halka Arabelleği Uygulaması
# 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)
Python'da Arabelleğe Alınmış Günlük Kaydı için MemoryHandler'ı Kullanma
Python Günlük Modülü - MemoryHandler Yaklaşımı
# 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'da Günlük Mesajlarını Yakalamanın Alternatif Yollarını Keşfetmek
Python'da en son günlük mesajlarını yakalamaya yönelik başka bir yaklaşım, aşağıdaki gibi bir üçüncü taraf kitaplığının kullanılmasını içerir: loguru. Python'un yerleşik kayıt modülünden farklı olarak Loguru daha esnek ve kullanıcı dostu bir arayüz sunar. Günlükleri döndürmek, günlük seviyelerini filtrelemek ve çeşitli formatlarda günlükleri yakalamak için yerleşik destek içerir. Bu kitaplık, hata işleme sırasında kritik mesajların gözden kaçırılmamasını sağlarken günlük yönetimini basitleştirdiğinden, aşırı miktarda günlük oluşturan uygulamalarla çalışırken özellikle yararlı olabilir.
Loguru, günlükleri bellekte, dosyalarda ve hatta harici hizmetlerde depolamak için özelleştirilebilen günlük havuzlarının kurulmasına olanak tanır. Özel bir havuz kullanarak geçici bir bellek içi arabellek oluşturabilirsiniz; bu, bir hatayla karşılaşıldığında daha sonra temizlenebilir. Bu, Loguru'yu, standart günlük kitaplığındaki gibi işleyicileri manuel olarak yapılandırmadan, günlük kaydı sistemleri üzerinde daha fazla kontrol sahibi olmak isteyenler için güçlü bir alternatif haline getirir.
Loguru'nun bir diğer avantajı da mevcut kayıt sistemleriyle kolay entegrasyona izin vermesidir; bu, tüm kayıt kurulumunuzu elden geçirmeden Loguru'ya geçebileceğiniz anlamına gelir. Bu, özellikle performansın ve günlük yönetiminin çok önemli olduğu karmaşık uygulamalarla uğraşırken yararlı olabilir. Sonuçta Python'un kayıt modülü çoğu kullanım durumu için yeterli olsa da, Loguru gibi kütüphaneleri keşfetmek, günlük mesajlarını etkili bir şekilde yakalamak ve yönetmek için ek esneklik ve kullanım kolaylığı sağlar.
Python'da Günlük Mesajlarını Yakalama Hakkında Sık Sorulan Sorular
- Günlük mesajı ayrıntılarını nasıl sınırlayabilirim?
- Kullanmak logger.setLevel(logging.ERROR) hata ayıklama ve bilgi gibi yalnızca hataları gösteren daha düşük önem derecesine sahip mesajları bastırmak için.
- Son günlükleri bellekte saklamanın en iyi yolu nedir?
- A deque(maxlen=capacity) En eski girişlerin otomatik olarak atılmasıyla en son günlük mesajlarını saklamak için kullanılabilir.
- Bir hata oluştuğunda arabelleğe alınmış günlükleri nasıl temizlerim?
- İle MemoryHandler, günlükler bellekte saklanır ve belirli bir günlük düzeyi tetiklendiğinde temizlenir; flushLevel=logging.ERROR.
- Loguru'yu Python'un günlüğe kaydetmeye göre kullanmanın avantajı nedir?
- Loguru daha az ortak kodla günlük kurulumunu basitleştirir ve günlükleri daha kolay filtreleme ve döndürme gibi daha sezgisel özellikler sağlar.
- Loguru'yu mevcut günlük kaydı yapılandırmalarıyla entegre edebilir miyim?
- Evet, Loguru, varsayılan günlük kaydı işleyicisini değiştirerek Python'un yerleşik günlük kaydı sistemiyle sorunsuz bir şekilde entegre olabilir.
Günlük Yakalama Tekniklerini Özetlemek
Hataya açık durumlarda, Python'un kayıt modülünü verimli bir şekilde kullanmak, çıktıyı karmaşıklaştırmadan en son günlük mesajlarının yakalanmasına yardımcı olur. Gibi özel işleyiciler deque Ve Bellek İşleyicisi Bir hata oluştuğunda önemli mesajları depolamak için çok yönlü yollar sağlar.
Bu çözümler, yüksek ayrıntı düzeyine sahip modüllerdeki hataları ayıklamak için pratiktir ve geliştiricilerin gerekli günlük verilerine sahip olmasını sağlar. Gibi üçüncü taraf araçları entegre ederek Loguru, minimum yapılandırmayla gelişmiş günlük yönetimi sunan daha da fazla esneklik mevcuttur.
Python Loglama Çözümleri için Kaynaklar ve Referanslar
- Python'un açıklaması deque uygulama ve günlüğe kaydetmede kullanımı: Python Belgeleri - Koleksiyonlar
- Python'la ilgili ayrıntılar günlüğe kaydetme kütüphane ve MemoryHandler: Python Belgeleri - Günlüğe Kaydetme
- Genel bakış Loguru gelişmiş bir Python günlük kaydı alternatifi olarak: Loguru Dokümantasyonu
- Karşılaştırma ve kullanım spdlog geri izleme desteği için C++'da: spdlog GitHub Deposu