Last chance! 50% off DataCamp Premium
Sale ends in
Python'a yeni başlıyorsanız ve daha fazlasını öğrenmek istiyorsanız, DataCamp'in Python ile Veri Bilimine Giriş kursunu alın.
Genel olarak logging, bir bilgisayar programı tarafından üretilen bir kaydı (log) tutma yöntemidir. Bir log dosyası genellikle kodunuzda (örneğin bir Python kodu) veya bir işletim sisteminde gerçekleşen olayların kayıtlarından oluşur. Bu olaylar veya iletiler bir log dosyasına yazılır; bir ileti ya da olay, farklı kullanıcılar arasındaki bir iletişim de olabilir.
Genellikle logların nasıl üretileceğine geliştiriciler karar verir. Geliştirdikleri bir uygulamanın her işlemini loglamak isteyebilirler, yalnızca bir hata meydana geldiğinde log almak isteyebilirler ya da bir kullanıcının gerçekleştirdiği kritik işlemleri izleyip bunları loglayabilirler. Önemli bir işleme örnek olarak, uygulamaya veya sunucuya hangi son kullanıcı ya da IP adresi tarafından erişildiğinin kontrol edilmesi verilebilir; başarısız bir deneme durumunda geliştirici, loglardan yararlanarak basit bir stack trace'ten daha iyi içgörüler sunabilir.
Güzel bir örnek, Linux'ta sudo kullanıcısı olmadığınız halde sudo kullanıcısı gibi bir kurulum yapmaya çalıştığınızda gördüğünüz "Xyz is not in the sudoers file. This incident will be reported" iletisidir; bu ileti bir log dosyasına yazılır.
İyi haber şu ki Python, yerleşik bir logging modülüyle birlikte gelir ve herhangi bir kurulum gerektirmeden doğrudan kullanabilirsiniz.
Logging, özünde bir Print Fonksiyonuna benzer. Ancak Print fonksiyonu, geliştirici için faydalı olabilecek pek çok bilgiden yoksundur. Öte yandan logging, hatanın oluştuğu zaman damgasını ve satır numarasını kaydedebilir. Hataları ya da herhangi bir bilgiyi dosyalara, soketlere vb. yazabilir ve günlüklerinizi ayırt edebilmeniz için beş tür önem (severity) seviyesi sunar.
Burada gösterilen beş Logging seviyesi şunlardır:
Debug (10): Koddaki sorunları teşhis etmek için kullanışlıdır.
Info (20): Kodda hata olmadığına dair bir teyit olarak işlev görebilir. Info seviyesinde loglamaya iyi bir örnek, bir makine öğrenmesi modelinin eğitim ilerlemesidir.
Warning (30): Gelecekte ortaya çıkabilecek bir soruna işaret eder. Örneğin ileride kullanım dışı bırakılabilecek bir modüle ilişkin uyarı veya düşük RAM uyarısı.
Error (40): Kodda ciddi bir hata; sözdizimi hatası, bellek yetersizliği hatası, exception'lar olabilir.
Critical (50): Programın çalışmayı durdurmasına ya da aniden çıkmasına neden olabilecek bir hata.
Yeterince teori, değil mi?
Şimdi Python kodunda logging'i nasıl uygulayabileceğinizi anlayalım.
Ancak ondan önce, bu derste kullanacağınız bazı logging özniteliklerinin yer aldığı logging öznitelik tablosuna bakalım.
import logging
Şimdi logging sisteminin sorunsuz çalışması için temel bir yapılandırma oluşturmaya yardımcı olan basicConfig() metodunu çağıracaksınız.
Aşağıdaki parametreleri ayarlamanıza olanak tanır:
basicConfig() metodunun isteğe bağlı olduğunu ve isterseniz atlayabileceğinizi unutmayın.
logging.basicConfig()
Şimdi beş önem seviyesini oluşturalım.
logging.debug("A Debug Logging Message")
logging.info("A Info Logging Message")
logging.warning("A Warning Logging Message")
WARNING:root:A Warning Logging Message
logging.error("An Error Logging Message")
ERROR:root:An Error Logging Message
logging.critical("A Critical Logging Message")
CRITICAL:root:A Critical Logging Message
Yukarıdaki çıktılardan da görebileceğiniz gibi, yalnızca önem seviyesi 20'den büyük olanlar başarıyla loglandı; çünkü Python'daki logging'in varsayılan yapılandırması budur.
Ancak yukarıda tartışıldığı gibi, basicConfig() metodunu kullanarak önem seviyelerini değiştirebilirsiniz. Burada önem seviyesini 20 olarak değiştireceksiniz; bu, önem seviyesi 10'dan büyük olan logging seviyelerinin loglanacağı anlamına gelir.
Not: Doğru çıktıyı görmek için lütfen aşağıdaki hücreleri çalıştırmadan önce çekirdeği (kernel) yeniden başlatın.
import logging
logging.basicConfig(level=logging.INFO)
logging.debug("A Debug Logging Message")
logging.info("A Info Logging Message")
INFO:root:A Info Logging Message
logging.warning("A Warning Logging Message")
WARNING:root:A Warning Logging Message
logging.error("An Error Logging Message")
ERROR:root:An Error Logging Message
logging.critical("A Critical Logging Message")
CRITICAL:root:A Critical Logging Message
Şimdi yukarıdaki çıktıları bir log dosyasına yazalım. Bunu başarmak için basicConfig() metodunu kullanacaksınız.
import logging
logging.basicConfig(level = logging.INFO, filename = 'datacamp.log')
logging.debug("A Debug Logging Message")
logging.info("A Info Logging Message")
logging.warning("A Warning Logging Message")
logging.error("An Error Logging Message")
logging.critical("A Critical Logging Message")

Gördüğünüz gibi artık loglar datacamp.log adlı bir log dosyasında oluşturuluyor. Yukarıdaki hücreleri birden çok kez çalıştırdığınızda, logların dosyaya o kadar kez eklendiğini fark edeceksiniz. Varsayılan olarak dosya append modundadır.

Log dosyasının birden fazla kopya iletilerle yazılmasını (yani append modunu) önlemek için filemode anahtar sözcüğünü kullanabilirsiniz. Filemode, write moduna değiştirilebilir; bu, önceki logların üzerine yazılacağı ve yalnızca mevcut olanların kaydedileceği anlamına gelir. Filemode w olarak ayarlandığından, bu, her basicConfig() çalıştırıldığında log dosyasının write modeda açılacağı ve nihayetinde dosyanın üzerine yazılacağı anlamına gelir.
Logging'deki dosya modu işlevselliği, Python'un sunduğu standart dosya işlemlerine benzer.
import logging
logging.basicConfig(level = logging.INFO, filename = 'datacamp.log', filemode = 'w')
logging.debug("A Debug Logging Message")
logging.info("A Info Logging Message")
logging.warning("A Warning Logging Message")
logging.error("An Error Logging Message")
logging.critical("A Critical Logging Message")
Yukarıdaki kod satırlarını birkaç kez çalıştıralım. Bu kez yalnızca mevcut log kayıtlarının kaydedildiğini ve öncekilerin aşağıda gösterildiği gibi üzerine yazıldığını fark edeceksiniz.

Tarih, saat, uyarının veya hatanın üretildiği satır numarası gibi bazı başka logging özniteliklerine bakalım. Şimdiye kadar kabul edeceğiniz üzere, tüm bunlar basit bir Print fonksiyonuna göre avantajdır ve onu sıradan bir Print fonksiyonundan çok daha yetenekli kılar.
Bunu gerçekleştirmek için asctime ve lineno logging özniteliklerini ileteceksiniz. Ayrıca loglarda görüntülemek istediğiniz ileti için bir yer tutucu olacak message özniteliğini de ileteceksiniz. Bu özniteliklerin tümü format metoduna geçirilecektir.
import logging
logging.basicConfig(format='Date-Time : %(asctime)s : Line No. : %(lineno)d - %(message)s', \
level = logging.DEBUG)
logging.debug("A Debug Logging Message")
logging.info("A Info Logging Message")
logging.warning("A Warning Logging Message")
logging.error("An Error Logging Message")
logging.critical("A Critical Logging Message")
Date-Time : 2020-03-18 23:58:12,429 : Line No. : 1 - A Debug Logging Message
Date-Time : 2020-03-18 23:58:12,436 : Line No. : 2 - A Info Logging Message
Date-Time : 2020-03-18 23:58:12,437 : Line No. : 3 - A Warning Logging Message
Date-Time : 2020-03-18 23:58:12,440 : Line No. : 4 - An Error Logging Message
Date-Time : 2020-03-18 23:58:12,441 : Line No. : 5 - A Critical Logging Message
Her bir özniteliğin tanımlarına doğrudan bu tabloda bakalım.
asctime: LogRecord'un üretildiği, insan tarafından okunabilir zaman. Varsayılan olarak 2020-03-18 22:24:42,670 biçimindedir (virgülden sonraki sayılar zamanın milisaniye kısmıdır). Bu öznitelik bir string olduğundan, sonrasında s anahtar sözcüğünü kullanırsınız.
lineno: Logging çağrısının yapıldığı kaynak satır numarası. Bu öznitelik bir tamsayı olduğundan, sonrasında d anahtar sözcüğünü kullanırsınız.
message: Kaydedilen ileti; msg % args olarak hesaplanır. Formatter.format() çağrıldığında ayarlanır. format() parametresini kullanırken bu özniteliği belirtmezseniz, loglamak istediğiniz iletiler üretilmeyecektir. Benzer şekilde, message özniteliği için de bir string olduğu için s kullanırsınız.
funcName: Logun üretildiği modül veya fonksiyon adını çıktılar. Kodunuzda çok sayıda fonksiyon olduğunda ve logları ait oldukları fonksiyon ya da metoda göre ayırmak istediğinizde faydalıdır.
Basit bir örnek yapalım ve print fonksiyonu yerine logging debug fonksiyonunu nasıl yerleştirebileceğinize bakalım.
import logging
logging.basicConfig(format='%(asctime)s :: %(levelname)s :: %(funcName)s :: %(lineno)d \
:: %(message)s', level = logging.INFO)
def addition(x, y):
add = x + y
return add
def subtract(x, y):
sub = x - y
return sub
def multiply(x, y):
mul = x * y
return mul
def divide(x, y):
div = x / y
return div
def exponent(x, y):
exp = x ** y
return exp
num1 = 20
num2 = 2
def main():
add_result = addition(num1, num2)
logging.info('Add: {} + {} = {}'.format(num1, num2, add_result))
sub_result = subtract(num1, num2)
logging.info('Sub: {} - {} = {}'.format(num1, num2, sub_result))
mul_result = multiply(num1, num2)
logging.info('Mul: {} * {} = {}'.format(num1, num2, mul_result))
div_result = divide(num1, num2)
logging.info('Div: {} / {} = {}'.format(num1, num2, div_result))
exp_result = exponent(num1, num2)
logging.info('Exp: {} ** {} = {}'.format(num1, num2, exp_result))
main()
2020-03-19 00:01:27,372 :: INFO :: main :: 35 :: Add: 20 + 2 = 22
2020-03-19 00:01:27,376 :: INFO :: main :: 38 :: Sub: 20 - 2 = 18
2020-03-19 00:01:27,377 :: INFO :: main :: 41 :: Mul: 20 * 2 = 40
2020-03-19 00:01:27,378 :: INFO :: main :: 44 :: Div: 20 / 2 = 10.0
2020-03-19 00:01:27,379 :: INFO :: main :: 47 :: Exp: 20 ** 2 = 400
Bu eğitimi tamamladığınız için tebrikler.
Diğer logging özniteliklerini de denemek ve kodunuzda nasıl kullanılabileceklerini görmek isteyebilirsiniz.
Lütfen bu eğitimle ilgili tüm sorularınızı aşağıdaki yorumlar bölümünde sormaktan çekinmeyin.
Python'a yeni başlıyorsanız ve daha fazlasını öğrenmek istiyorsanız, DataCamp'in Python ile Veri Bilimine Giriş kursunu alın.
Python Kursları
Kurs
Kurs
Kurs
blog
Dario Radečić
15 dk.

blog
Abid Ali Awan
14 dk.
Eğitim
Adel Nehme
Eğitim
Kurtis Pykes
8 dk.